0

C++ では、次のような OLE メソッドを呼び出そうとしています。

HRESULT GetFirstMono(
       [out] BSTR* name, 
       [out, retval] BSTR* monoID);

次のコードを使用して呼び出します ( http://www.codeproject.com/KB/office/MSOfficeAuto.aspxから適応):

int cArgs = 1;
DISPPARAMS dp = { NULL, NULL, 0, 0 };
DISPID dispidNamed = DISPID_PROPERTYPUT;
DISPID dispID;
VARIANT *pArgs = new VARIANT[cArgs+1];
// Extract arguments...
for(int i=0; i<cArgs; i++) {
    pArgs[i] = va_arg(marker, VARIANT);
}

// Build DISPPARAMS
dp.cArgs = cArgs;
dp.rgvarg = pArgs;

// Make the call!
    hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, nType, &dp,
        pvResult, NULL, NULL);
    if(cArgs == 1) {
        std::cout << "oleCall()" << std::endl;
        std::cout << "vt: " << dp.rgvarg[0].vt << std::endl;
    }

プログラムはクラッシュせずに実行され、monoIdの出力 BSTR*を受け取りますpvResult(期待する値を取得します)。しかし、名前を見つける代わりに、空のバリアントのみを取得しますdp:rgvarg[0]。つまり、端末で表示されます

oleCall()
vt: 0

. LabView から呼び出すと、まったく同じメソッドが正常に機能するため、コードのどこかに問題があると考えられます。名前の出力を回復するにはどうすればよいですか?

4

2 に答える 2

0

タイプVT_BSTR|VT_BYREFを引数 0 に設定してみてください。

CComBSTR bstrName;
V_VT(&dp.rgvarg[0]) = VT_BSTR | VT_BYREF;
V_BSTRREF(&dp.rgvarg[0]) = &bstrName;
于 2011-12-22T21:40:38.877 に答える
0

他の誰かが同じ問題を抱えている場合: 私は解決できませんでしたが、回避策があります。IDispatch インターフェイスのメソッドを使用する代わりに、 MIDL と呼ばれる Microsoft プログラムを使用して、宣言さInvokeれているインターフェイスのヘッダー ファイルを作成しましたGetFirstMonoが、手動で行うこともできます (インターフェイスのメソッドを ole で調べるだけです)。 /com ビューアーを開き、対応するヘッダー ファイルを書き込みます)。次に、メソッドの呼び出しは非常に単純です。

BSTR name, monoId;
HRESULT hr = interfacePointer->GetFirstMono(name, monoId);

詳細については、codeguru.comを参照してください。それが役に立てば幸い。

ところで:私はまだ元の質問に興味があります。答えがわかったら投稿お願いします!

于 2011-11-28T10:24:24.667 に答える