C ++でのOLEオートメーション:有効な結果の代わりにInvoke()から空のバリアントを受け取る

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; iInvoke(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;
    }

プログラムはクラッシュすることなくエスケープし、 pvResult にBIM *の出力を受け取ります。しかし、名前を見つけるのではなく、私は dp:rgvarg [0]

oleCall()
vt: 0

。私がLabViewから呼び出すとき、まったく同じメソッドがうまく動作するので、問題は私のコードのどこかにあると思います。 名前の出力をどのように回復できますか?

0
理由はわかりませんが、 dp.cArgs = cArgs + 1 を設定すると、プログラムがクラッシュします。私が知る限り、 retval としてマークされたパラメータは、 pvResult バリアントとともに返されます。もう1つは dp で返す必要があります。私は確かに私が望む結果はHRESULTにはないでしょう、それはエラー管理などにしか使われないからです。
追加された 著者 xqrp,
2 dp.cArgs = cArgs + 1 )の値を dp.cArgs に含めないでください。このメソッドは2つのパラメータを必要とするためです。それでも問題が解決しない場合: HRESULT 戻り値 Invoke を確認してください。
追加された 著者 vstm,

2 答え

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

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

codeguru.com に詳しい情報があります。それが役に立てば幸い。

ところで、私はまだ元の質問に興味があります。あなたが答えを知っているなら、投稿してください!

0
追加された

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

CComBSTR bstrName;
V_VT(&dp.rgvarg[0]) = VT_BSTR | VT_BYREF;
V_BSTRREF(&dp.rgvarg[0]) = &bstrName;
0
追加された