在网上下载了MapWinGIS.ocx及其源码,自己编译了一份。写了个测试程序加载这个控件,发现下在控件里的断点不执行,于是自己写了一个测试控件,同时加载MapWinGIS.ocx和自己写的测试控件,在自己写的测试控件中的断点进入了,MapWinGIS.ocx的还是不进入。但两个控件都正常显示。通过比较看output窗口的打印信息,发现我自己写的控件被加载了
(Managed): Loaded 'D:\PLATFO~1\map\test\tttt\Debug\tttt.ocx', Symbols loaded.
而没有出现MapWinGIS.ocx被加载的信息。对控件这块不熟悉,哪位大侠指点一下?

解决方案 »

  1.   

    ocx其实就是特殊格式的DLL。没有什么特殊的。
    不能进入断点,首先检查工程设置,debug版,是否包含调试信息,编译参数
    是否具有(debug info)下列之一(/Zd /Zi /ZI /Z7) link参数 /Debug
      

  2.   

    应该不会,可能你调用的不是同一个控件。你可以在那个控件代码中加入注入Messagebox之类的信息,看卡调用的是不是这个。
      

  3.   

    补充一点,我调用OCX控件用的是VB.NET,用VC试了一下是可以跟进控件里的断点的。VB.NET在调用控件上是什么原理?而我自己写的控件tttt.ocx也是VC写的,能跟进去。都是VB.NET调用VC的控件,差距咋就这么大呢
      

  4.   

    有没有PDB文件? PDB文件多大? 调试符号放在这个文件中,看看两个OCX同名的PDB有什么不同没有。
      

  5.   

    我在VC6.0下碰到过,在IE中,无法进入调试,换了个腾讯TT的就可以进入,不清楚具体原因。
      

  6.   

    终于查到原因了,是托管与本机代码的混合模式调试的问题。需要把Debugger Type 设置为 Mixed。不能用默认的Auto。VB.NET的代码是托管的,调用本机代码的控件,在AUTO模式下断点不进入。但我的测试控件tttt.OCX是用VC编写的,也应该是本机代码,怎么就能进入断点呢?我的控件和MapWinGIS.ocx控件不同的是,MapWinGIS.ocx使用了ATL。哪位大牛能解释一下托管的原理及ATL对调试的影响吗?总结:还是对VB.NET不熟造成的参考:
    http://yongliu39.spaces.live.com/Blog/cns!C25D62469C0DC7C8!151.entry
    http://msdn.microsoft.com/zh-cn/library/kbaht4dh.aspx
      

  7.   

    这个可能的原因是:
    ie8 默认是多进程工作的
    通过修改注册表改为单进程工作
    多进程的时候,启动的ie进程和加载要调试的ocx的ie进程不是一个进程,所以不能调试
    ---------------------------------------
    Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main]
    "TabProcGrowth"=dword:00000000
    --------------------------------------------------------
    把 ------------------之间的文字保存成 1.reg,双击1.reg,导入到注册表里,就可以调试了参考:
    http://topic.csdn.net/u/20100526/17/4068ee96-c06d-4977-8016-e5c4469fd74e.html
      

  8.   

    我仔细比较了我自己测试控件和开源的控件,发现我自己用Visual studio自动生成的控件用的也是托管模式,也就是C++.net,难怪用VB.NET调试直接就进入了断点。而开源控件用的是纯C++,是本机代码,VB.net是托管的。从托管代码调试本机代码需要用到混合调试模式,即debugger type设置成 mixed不能用auto.而和我之前猜测的ATL没有任何关系。一个项目用了不同语言,放在一起调试的时候,如果哪调不进去,先去看看微软关于混合调试模式的文档。好了,可以结贴了。