私の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
で失敗します。
VB6インターフェイスメンバーをC++(またはC#)から呼び出すことに成功した人はいますか?
C#では、「ダイナミック」でVB6スタイルにすることができます。 C++の場合、http://stackoverflow.com/q/11670175/11683が役立ちます。 – GSerg
COM規則がより厳格であるかどうかは不明ですが、通常は実行時にオブジェクトにアクセスしようとすると動的エラーを引き起こす関数の名前が変更されます。 _IF_の場合は、必要に応じて 'extern" C "'にしてください。 – M4rc
@GSerg:私はすでにダイナミックにしようとしましたが、動作しません。しかし、私は何かを見つけました。VB6 COM DLLでは、 'IPositionPromotion'を実装するクラスで、' IPositionPromotion'インターフェースを実装するメソッドは通常 'Private'として宣言されます。彼らは 'IPositionPromotion_Foobar'という名前です。私が 'Private'から' Public'に変更した場合、 'pPromo'オブジェクトに対して' IPositionPromotion_Foobar'を呼び出すことができます。 しかし、これはかなり醜い "解決策"です。 –