如何使用MFC为ActiveX控件添加任何可重用的接口?

时间:2015-04-09 20:36:13

标签: c++ properties interface mfc activex

我有一个ActiveX控件容器,只接受一组预定义的接口(属性)。我需要设计一些暴露这些属性的MFC ActiveX控件,所以我最初的尝试是创建一个包含所有必需属性的接口类作为纯虚拟成员,并且我的所有ActiveX控件都继承自此接口类。现在我的ActiveX控件继承了所有接口,但是如何将它们暴露给容器呢?如果我使用类向导添加这些属性,我知道我可以公开它们。但重点是避免为每个ActiveX控件逐个添加它们。如果我不使用类向导,这将意味着我必须手动修改BEGIN_DISPATCH_MAP()& END_DISPATCH_MAP()部分和相应的.ODL文件,我认为这不是一件好事。

所以我的问题是,使用MFC,如何继承抽象类(接口类)来实现ActiveX控件的所有预定义属性(接口)并将它们公开给用户?

实施例: 假设我的基类A有一个属性定义为:long newProperty。我的ActiveX控件B继承自A,所以B也有newProperty。我的问题是如何在B中公开newProperty?如何使用类向导来获取和设置此新属性的功能?我是否必须手动修改BEGIN_DISPATCH_MAP()& END_DISPATCH_MAP()部分和相应的.ODL文件?

1 个答案:

答案 0 :(得分:0)

如果我理解正确的话,您想以编程方式访问ActiveX控件,而不是使用类向导生成的包装器吗?嗯,这有点麻烦。例如,这会使用long参数123456789调用成员funktion MyMemberFunction:

AtlAxWinInit();
pMyActiveXWnd = new CAxWindow();
pMyActiveXWnd ->Create(...)
LPUNKNOWN pUnk;
pMyActiveXWnd ->QueryControl(&pUnk);    
IDispatch *spDispatch; 
HRESULT hRes = pUnk->QueryInterface(__uuidof(spDispatch), (void **) &spDispatch);   
DISPID dispid;
DISPPARAMS dispparams = { NULL, NULL, 0, 0 };
VARIANT vRet;
COleVariant vParam((long)123456789,VT_I4);
EXCEPINFO excepinfo;
UINT nArgErr;
dispparams.rgvarg = (LPVARIANT)vParam;
dispparams.cArgs = 1;
dispparams.cNamedArgs = 0;
hRes = spDispatch->GetIDsOfNames(IID_NULL, _T("MyMemberFunction"), 1, LOCALE_SYSTEM_DEFAULT, &dispid);
hRes = spDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispparams, &vRet, &excepinfo, &nArgErr);