Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用MFC为ActiveX控件添加任何可重用的接口?_C++_Properties_Interface_Mfc_Activex - Fatal编程技术网

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

C++ 如何使用MFC为ActiveX控件添加任何可重用的接口?,c++,properties,interface,mfc,activex,C++,Properties,Interface,Mfc,Activex,我有一个ActiveX控件容器,它只接受一组预定义的接口属性。我需要设计相当多的MFC ActiveX控件来公开这些属性,因此我最初的尝试是创建一个接口类,该类包含作为纯虚拟成员的所有必需属性,并且我的所有ActiveX控件都继承自该接口类。现在我的ActiveX控件继承了所有接口,但如何将它们公开给容器?如果我使用类向导添加这些属性,我知道我可以公开它们。但关键是要避免为每个ActiveX控件逐个添加它们。如果我不使用类向导,这将意味着我必须手动修改BEGIN\u DISPATCH\u MAP

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

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

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

如果我理解正确,您希望以编程方式访问ActiveX控件,而不是使用类向导生成的包装器?嗯,这有点麻烦。例如,这将使用长参数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);

不,我想公开ActiveX控件的属性接口,同时从基类继承所有这些公开的属性。假设我的基类A有一个属性定义为:long newProperty。我的ActiveX控件B继承自A,因此B也具有newProperty。我的问题是如何在B中公开NeXealPub?虚拟成员的概念来自C++世界,所以我假设您使用某种自创建的包装器。C++缺少动态类型。如果需要,您必须提供某种解释器来访问ActiveX控件中的继承成员,以“模拟”动态键入,即通过查询我上面描述的com接口来使用OLE变体。再次感谢您的回复。我的问题是我不知道如何在没有类向导的情况下向用户公开继承的成员。但你的答案是告诉我如何访问这些成员。如果我不知道如何暴露它们,我就无法访问它们。对不起,我想我真的不明白你在干什么。我只能猜测。但如果我是对的,您希望在编译时以某种方式生成接口。这需要复杂的脚本编写,我不推荐这样做。也许您应该将.NET用于第二级控件,因为.NET包含反射和嵌入式编译功能,所以您可以根据需要动态生成接口。您可以通过com互操作性使用这些。但我甚至无法想象这种努力会落到肥沃的土地上,并且怀疑你应该考虑重新设计。恐怕这不是我的选择。我们正在处理遗留代码,我们负担不起重新设计或迁移到.NET的费用。