在com組件的制作過程中 對接口參數的調整是難以避免的,如果不知道就會有許多的問題
比較顯示的修改有 ctl.h ctl.cpp odl 文件
但容易忽略的是 ctl.cpp中的DISP_FUNCTION 宏也需要修改
DISP_FUNCTION(CUnbankCtrl, "send", send, VT_I2, VTS_BSTR VTS_BSTR)
這個表示 輸出為short 輸入為兩個bstr。增加一個bstr這里就要改為如下:
DISP_FUNCTION(CUnbankCtrl, "send", send, VT_I2, VTS_BSTR VTS_BSTR VTS_BSTR)
對于第一次編寫ocx接口還是容易出很多錯誤的。(我就上次寫過這次寫還是碰到很多問題)
1:在odl文件中定義
1 dispinterface _DSyncLink
2 {
3 properties:
4 // NOTE - ClassWizard will maintain property information here.
5 // Use extreme caution when editing this section.
6 //{{AFX_ODL_PROP(CSyncLinkCtrl)
7 //}}AFX_ODL_PROP
8
9 methods:
10 // NOTE - ClassWizard will maintain method information here.
11 // Use extreme caution when editing this section.
12 //{{AFX_ODL_METHOD(CSyncLinkCtrl)
13 [id(1)] short sendMsg(BSTR fileName,BSTR name,BSTR signStr);
14 [id(2)] short testOcx(BSTR str);
15 //}}AFX_ODL_METHOD
16
17
18 [id(DISPID_ABOUTBOX)] void AboutBox();
19 };
2:在ctl.h 文件中定義2 {
3 properties:
4 // NOTE - ClassWizard will maintain property information here.
5 // Use extreme caution when editing this section.
6 //{{AFX_ODL_PROP(CSyncLinkCtrl)
7 //}}AFX_ODL_PROP
8
9 methods:
10 // NOTE - ClassWizard will maintain method information here.
11 // Use extreme caution when editing this section.
12 //{{AFX_ODL_METHOD(CSyncLinkCtrl)
13 [id(1)] short sendMsg(BSTR fileName,BSTR name,BSTR signStr);
14 [id(2)] short testOcx(BSTR str);
15 //}}AFX_ODL_METHOD
16
17
18 [id(DISPID_ABOUTBOX)] void AboutBox();
19 };
1 DECLARE_MESSAGE_MAP()
2
3 // Dispatch maps
4 //{{AFX_DISPATCH(CSyncLinkCtrl)
5 afx_msg short sendMsg(LPCTSTR fileName,LPCTSTR name,LPCTSTR signStr);
6 afx_msg short testOcx(LPCTSTR str);
7 //}}AFX_DISPATCH
8 DECLARE_DISPATCH_MAP()
2
3 // Dispatch maps
4 //{{AFX_DISPATCH(CSyncLinkCtrl)
5 afx_msg short sendMsg(LPCTSTR fileName,LPCTSTR name,LPCTSTR signStr);
6 afx_msg short testOcx(LPCTSTR str);
7 //}}AFX_DISPATCH
8 DECLARE_DISPATCH_MAP()
1 // Dispatch and event IDs
2 public:
3 enum {
4
5 //{{AFX_DISP_ID(CSyncLinkCtrl)
6 eventidResult = 1L,
7 dispidSendMsg = 2L,
8 dispidTestOcx = 3L,
9 //}}AFX_DISP_ID
10 };
11 };
2 public:
3 enum {
4
5 //{{AFX_DISP_ID(CSyncLinkCtrl)
6 eventidResult = 1L,
7 dispidSendMsg = 2L,
8 dispidTestOcx = 3L,
9 //}}AFX_DISP_ID
10 };
11 };
3:ctl.cpp文件中定義
BEGIN_DISPATCH_MAP(CSyncLinkCtrl, COleControl)
//{{AFX_DISPATCH_MAP(CSyncLinkCtrl)
DISP_FUNCTION(CSyncLinkCtrl, "sendMsg", sendMsg, VT_I2, VTS_BSTR VTS_BSTR VTS_BSTR)
DISP_FUNCTION(CSyncLinkCtrl, "testOcx", testOcx, VT_I2,VTS_BSTR)
//}}AFX_DISPATCH_MAP
DISP_FUNCTION_ID(CSyncLinkCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()
//{{AFX_DISPATCH_MAP(CSyncLinkCtrl)
DISP_FUNCTION(CSyncLinkCtrl, "sendMsg", sendMsg, VT_I2, VTS_BSTR VTS_BSTR VTS_BSTR)
DISP_FUNCTION(CSyncLinkCtrl, "testOcx", testOcx, VT_I2,VTS_BSTR)
//}}AFX_DISPATCH_MAP
DISP_FUNCTION_ID(CSyncLinkCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()
short CSyncLinkCtrl::testOcx(LPCTSTR str)
{
return 8;
}
{
return 8;
}
4:聲明安全ocx安全