zoukankan      html  css  js  c++  java
  • ActiveX添加测试工程, 出现的问题[非选择性参数][找不到成员]

    ActiveX 添加测试工程

    1.新建工程MFC application,

    2.添加完毕,在main Dialog中, 右键[Insert Activex Control],选择你的ActiveX控件。

     

    3.选中你刚刚添加的控件,然后右键[add variable]

     m_ocx就是控件的instance object,点击[完成],可以看到在XXXDlg.h中会添加这个instance object的定义。

    ipcamerctrl1.h

    ipcamerctrl1.cpp

     就是你的控件,里面包含了控件中的所有方法,成员函数,Event等等,  (在头文件中可以看到  InvokeHelper ()如何调用的 )

    void DisconnectServer()
        {
            InvokeHelper(0x1, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
        }

    //==============================

     接下来是关键了, 有时候,我们自己修改控件中的interface,

    但是*.h   *.cpp   *.odl(vs2010是*.idl) 中interface没有匹配,比如*.h 中 修改了,funcA(int, int); 而*.odl 为funcA(int), 就容易造成错误。一般也无法编译。


    但是除了interface不匹配,还有其他的问题, 就是上文所说的生成  ipcamerctrl1.h 的问题

    *.odl

    [id(1)] void DisconnectServer();
     

     *.cpp

    /////////////////////////////////////////////////////////////////////////////
    // Dispatch map

    BEGIN_DISPATCH_MAP(CIPCamVideoCtrl, COleControl)
        DISP_PROPERTY_EX_ID(CIPCamVideoCtrl, "MotionEnable", dispidMotionEnable, GetMotionEnable, SetMotionEnable, VT_I4)
        DISP_FUNCTION_ID(CIPCamVideoCtrl, "ConnectServer", dispidConnectServer, ConnectServer, VT_I4, VTS_I4 VTS_BSTR VTS_I4 VTS_BSTR VTS_BSTR VTS_I4)
        DISP_FUNCTION_ID(CIPCamVideoCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
    END_DISPATCH_MAP()
    // Event map
    BEGIN_EVENT_MAP(CIPCamVideoCtrl, COleControl)
           EVENT_CUSTOM_ID("OnConnectServerResult", eventidOnConnectServerResult, FireOnConnectServerResult, VTS_I4  VTS_I4)
    END_EVENT_MAP()

    *.h

    // Dispatch and event IDs
    public:
        enum {
        //{{AFX_DISP_ID(CIPCamVideoCtrl)
        dispidFuncA = 1L,
        dispidFuncB = 2L,

    .............

    }

    这里不得不说经常修改控件的时候,容易遗漏,但是当时编译器没有报错,怎么办呢?

    出错情况

    调用控件的某些interface 提示“非选择性参数”,“找不到成员”
    后来查证(*.h  定义接口的enum中有2个已经删除的func1(),func2() 导致的)

    非常折磨人。 如何规避这种情况呢?

    答案就是

    DISP_PROPERTY_EX  改成  DISP_PROPERTY_EX_ID
    DISP_FUNCTION  改成 DISP_FUNCTION_ID
    EVENT_CUSTOM 改成 EVENT_CUSTOM_ID

    改完之后,定义的形参  会多出一个选项  dispid,

    选择任意一个DISP_PROPERTY_EX_ID 进去看下接口定义,就明白了!

    添加这个dispid后,外部测试工程中接口用的就是enum的值

    InvokeHelper(0x1, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);

    如果有删除修改的错误,编译时也会及时报出来

    参考

    http://bbs.csdn.net/topics/310061638

    里面应该不是 AboutBox()的问题,而是某个dispid 顺序出现错误。



    所以我锁定问题的时候,才会想起尝试 确定dispid值。来排除[非选择性参数]的问题。(一切都是自己尝试出来的)

    另说明一下,vs2010 通过添加接口,已经全部用 DISP_FUNCTION_ID 格式,

    而vc6.0 则是DISP_FUNCTION格式(不加 _ID)。

     写下这个只是给自己mark一下,顺便BS下MS,出现这种错误,没有文档,很难找原因。


     ===============

    另vc6.0创建的ActiveX控件, 通过vs2010 添加测试工程,[Insert Activex Control]后, vs2010  Crash  T_T

    (但是我VS2010创建的ActiveX控件,用VS2010 添加测试工程则没有问题)

     VS2005则正常,时间原因暂且不管,可能也因为VC6.0、VS2010里面各种设置导致的。

    有人知道,可以告诉我下原因

  • 相关阅读:
    MapReduce原理
    《软件需求十步走》阅读笔记3
    《软件需求十步走》阅读笔记2
    《软件需求十步走》阅读笔记1
    2017秋季阅读计划
    怎么做需求分析
    兴趣小组第一次
    第十天
    第九天
    对UC的分析(个人观点,多多包涵)
  • 原文地址:https://www.cnblogs.com/scotth/p/3667192.html
Copyright © 2011-2022 走看看