解决方案 »
- 请教如何模拟模态对话框实现对主线程的阻塞?
- 求游戏外挂源代码!
- 如何判断系统当前处理全屏独占模式下?
- 头文件和lib是什么关系呢?
- 请问,错误信息:fatal error C1853: 'Release/md500000.pch' is not a precompiled header file created with this compiler
- 谁教我怎样用WinPcap发送报文 100分
- 各位达人,帮忙解决一个outlook界面的新问题哈:)200分
- 从Recordset对象取数据的问题。
- 两个定时器,一个定时器在处理时,另一个定时器到时了,想终止第一个定时器,怎样处理?
- 关于对话框自定义菜单的单项菜单失效问题
- 多进程之间的Session如何共享
- OCX添加对外属性结果外部调用全部错位,求助!~~
反注册ocx,删除原来代码(注意备份),然后新建一个工程,把方法一次加完。
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,虽然没用你的方法,但是你在二楼的方法肯定是可以的,因为重新添加之后顺序肯定正确了,分给你吧。也谢谢大家!