在我的C++程序中,我使用了一个在VB6 COM DLL中实现的COM类。我们称这个类为CETicketRA
。本课程有IPositionPromotion
类型的房产AppliedPromotion
。 IPositionPromotion
是由相同的VB6 COM DLL定义的接口。它具有各种属性和方法,我尝试从C++访问。VB6接口方法的延迟调用
考虑下面的代码:
IDispatch* pETicketRA = NULL;
DISPPARAMS dispParams = {0};
VARIANT result;
VariantInit(&result);
// Left out: some code to set pETicketRA ...
OLECHAR* strAppliedPromotion = L"AppliedPromotion";
DISPID dispIDAppliedPromotion = -1;
HRESULT hr = pETicketRA->GetIDsOfNames(IID_NULL, &strAppliedPromotion, 1, LOCALE_SYSTEM_DEFAULT, &dispIDAppliedPromotion);
hr = pETicketRA->Invoke(dispIDAppliedPromotion, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, NULL, NULL);
IDispatch* pPromo = NULL;
hr = result.pdispVal->QueryInterface(IID_IDispatch, reinterpret_cast<LPVOID*>(&pPromo));
VariantClear(&result);
现在我尝试阅读的IPositionPromotion
财产Foobar
:
OLECHAR* strFoobar = L"Foobar";
DISPID dispIDFoobar = -1;
hr = pPromo->GetIDsOfNames(IID_NULL, &strFoobar, 1, LOCALE_SYSTEM_DEFAULT, &dispIDFoobar);
不幸的是,最后调用失败DISP_E_UNKNOWNNAME
。
有没有人成功地从C++(或C#)调用VB6接口成员?
在C#中,您可以使用'dynamic'来实现VB6风格。对于C++,http://stackoverflow.com/q/11670175/11683可能会有所帮助。 – GSerg
不确定COM规则是否更严格,但通常C++会在运行时尝试访问对象时导致导致动态错误的函数名称。 _IF_就是这种情况,请务必根据需要'extern“C”'。 – M4rc
@GSerg:我已经尝试过动态,它不起作用。但是我发现了一些东西:在VB6 COM DLL中,在实现“IPositionPromotion”的类中,实现“IPositionPromotion”接口的方法通常被声明为“Private”。它们被命名为“IPositionPromotion_Foobar”。如果我将它们从'Private'改为'Public',我可以在'pPromo'对象上调用'IPositionPromotion_Foobar'。 但这是一个相当丑陋的“解决方案”。 –