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里面各種設置導致的。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM