在我的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'。 但這是一個相當醜陋的「解決方案」。 –