解决方案 »

  1.   

    添加方式没有错,就是不知道参数是不是用通用类型了,还有就是查看下注册表,注册的ocx的路径是不是正确的
      

  2.   

    添加新方法没问题的,不知道是不是VS的问题。你这样试试:
    反注册ocx,删除原来代码(注意备份),然后新建一个工程,把方法一次加完。
      

  3.   

    另外,建议不要使用MFC建activeX,坑太多,能用ATL就用ATL吧。
      

  4.   

    楼主试试升级一下OCX的版本号吧。
      

  5.   

    找到解决办法了,这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,虽然没用你的方法,但是你在二楼的方法肯定是可以的,因为重新添加之后顺序肯定正确了,分给你吧。也谢谢大家!
      

  6.   

    呵呵,多谢LZ分享。这个问题困扰俺很久,以前没认真看过MFC的宏,看来要认真读一下MFC的宏了。