MFC ActiveX添加的新方法无法调用

那句-诺言 2014-07-23 04:33:07
前几天用VS2012写了一个OCX控件,添加的几个接口方法都表现挺正常。
今天加了几个方法,在ActiveX控件测试容器中也能看到新方法,但是调用之后没有任何反应,调试时新方法中的断点也从来运行不到。老方法一直都没有问题。
我在整个解决方案中查找了一个正常的老方法的名字,所有老方法出现的地方,新方法都出现了,应该没有什么遗漏的地方。而且新方法的添加方式也和老方法一样。
注册和反注册也弄好了几遍,还是不行。
整个系统中这个ocx文件只有一个在项目目录下生成的Debug版本,所以也不会是注册了其他地方的同名ocx。
相当纳闷,求大侠指教!

附上添加OCX接口方法的方式:
在类视图中右击以lib结尾的项,右键点击以_开头没有events结尾的子项,选择“添加”->“添加方法”,如图:
...全文
307 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
边走边瞧 2014-07-24
  • 打赏
  • 举报
回复
呵呵,多谢LZ分享。这个问题困扰俺很久,以前没认真看过MFC的宏,看来要认真读一下MFC的宏了。
那句-诺言 2014-07-23
  • 打赏
  • 举报
回复
引用 3 楼 go_and_see 的回复:
另外,建议不要使用MFC建activeX,坑太多,能用ATL就用ATL吧。
你这句话是最对的!
那句-诺言 2014-07-23
  • 打赏
  • 举报
回复
找到解决办法了,这TM是一个大坑啊。 BEGIN_DISPATCH_MAP和END_DISPATCH_MAP中的语句位置必须与头文件中方法的ID顺序一致。 例如我的头文件中调试和事件ID的代码:

public:
	enum {
		dispidTestMethod = 11L,
		dispidTsapiDisconnected = 20L,
		dispidInterceptEnded = 19L,
		dispidInsertEnded = 18L,
		dispidListenEnded = 17L,
		dispidForceReleaseFailed = 16L,
		dispidForceReleseSuccess = 15L,
		dispidInterceptFailed = 14L,
		dispidInterceptSuccess = 13L,
		dispidStopInsertFailed = 12L,
		dispidStopInsertSuccess = 11L,
		dispidInsertFailed = 10L,
		dispidInsertSuccess = 9L,
		dispidStopListenFailed = 8L,
		dispidStopListenSuccess = 7L,
		dispidListenFailed = 6L,
		dispidListenSuccess = 5L,
		dispidLogoutFailed = 4L,
		dispidLogoutSuccess = 3L,
		dispidLoginFailed = 2L,
		dispidLoginSuccess = 1L,
		dispidInit = 10L,
		dispidForceLogout = 9L,
		dispidForceBusy = 8L,
		dispidForceFree = 7L,
		dispidIntercept = 6L,
		dispidForceRelease = 5L,
		dispidInsert = 4L,
		dispidListen = 3L,
		dispidMonitorLogout = 2L,
		dispidMonitorLogon = 1L
	};
其中dispidTestMethod为新添加的方法,其ID为11。(大家可能注意到从下往上看的话,10之后的又从1开始了,例如dispidLoginSuccess的ID为1,这是因为LoginSuccess是事件不是方法,这两个的ID互不影响,不用关注。) 而VS自动添加新方法时,是将调度映射语句
		DISP_FUNCTION_ID(CDCMonitorControllerClientCtrl, "TestMethod", dispidTestMethod, TestMethod, VT_EMPTY, VTS_NONE)
添加到了BEGIN_DISPATCH_MAP和END_DISPATCH_MAP的最后。这个时候新方法就不能识别,必须手动调整顺序,将该调度映射语句移到ID为10的Init映射语句
DISP_FUNCTION_ID(CDCMonitorControllerClientCtrl, "Init", dispidInit, Init, VT_I4, VTS_BSTR)
的后面才行。 问题就这样被解决调了,顺便说一句,微软你能不能不要这么坑爹! 顺便感谢@go_and_see,虽然没用你的方法,但是你在二楼的方法肯定是可以的,因为重新添加之后顺序肯定正确了,分给你吧。也谢谢大家!
yybing 2014-07-23
  • 打赏
  • 举报
回复
我也碰到这问题了,一直就看不到方法,在网页中
wshcdr 2014-07-23
  • 打赏
  • 举报
回复
楼主试试升级一下OCX的版本号吧。
边走边瞧 2014-07-23
  • 打赏
  • 举报
回复
另外,建议不要使用MFC建activeX,坑太多,能用ATL就用ATL吧。
边走边瞧 2014-07-23
  • 打赏
  • 举报
回复
添加新方法没问题的,不知道是不是VS的问题。你这样试试: 反注册ocx,删除原来代码(注意备份),然后新建一个工程,把方法一次加完。
fishion 2014-07-23
  • 打赏
  • 举报
回复
添加方式没有错,就是不知道参数是不是用通用类型了,还有就是查看下注册表,注册的ocx的路径是不是正确的

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧