3,248
社区成员
发帖
与我相关
我的任务
分享
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,虽然没用你的方法,但是你在二楼的方法肯定是可以的,因为重新添加之后顺序肯定正确了,分给你吧。也谢谢大家!