2017-04-11 20 views
0

私は、COMオブジェクトに接続してメソッドを呼び出し、このオブジェクトなどからプロパティを取得するアプリケーションで作業しています。 メンバに接続して呼び出すことはできますが、それは問題ではありません。しかし私は、例えば、出力パラメータを有するメソッドを呼び出す方法、(擬似コード)を把握することはできません。C++ IDispatch出力パラメータで呼び出す

int GetAppVersion(bsRetMsg [out, optional]). 

この関数は、バージョンとしてINTを返しても介しバージョンの文字列表現を返すことができます出力パラメータ。

私が試した:(2)

 VARIANT result; 
     DISPPARAMS params = {NULL, NULL, 0, 0}; 
     VARIANTARG args[1]; 

     BSTR str = SysAllocString(L""); // change: empty string 
     VariantInit(&args[0]); 
     args[0].vt = VT_BSTR | VT_BYREF; 
     args[0].bstrVal = str; 
     params.rgvarg = args; 
     params.cArgs = 1; 

     res = dispatch->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &params, &result, NULL, 
           NULL); 

     if (SUCCEEDED(res)) { // here it failed: Not enough storage is available to complete this operation. 
      std::cout << result.intVal << std::endl; 
... 

を(1)

(3)

... 
BSTR str = SysAllocString(L"longerfoostring"); 
VariantInit(&args[0]); 
args[0].vt = VT_BSTR; // change: no BYREF 
args[0].bstrVal = str; 
params.rgvarg = args; 
params.cArgs = 1; 
... invoke is the same... 
res = dispatch->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &params, &result, NULL, 
           NULL); 
if (SUCCEEDED(res)) { 
    std::cout << result.intVal << std::endl; // this number is correct - version in int 
    printf("'%S'", params.rgvarg[0].bstrVal); // prints 'longerfoostring' instead of version, ie. '2.0.5...' 

(4)

BSTR *str; 
VariantInit(&args[0]); 
args[0].vt = VT_BSTR | VT_PTR; // change: different VT 
args[0].pbstrVal = str; //change: different type 
params.rgvarg = args; 
params.cArgs = 1; 
... invoke failes with Bad variable type. 

質問: 入出力パラメータとして文字列(または任意の型)をCOMメソッドに渡して、このパラメータから正しく出力する方法はありますか?

+1

その宣言はほとんど意味がありません。「疑似」コードの代わりに実際のコードを投稿してください。彼のIDLの実際の宣言については、著者に尋ねる。あなたが電話をしている間に、[in、out、optional]でそれを正しく行うように頼んでください。最良の推測は、NULLに初期化されたBSTR変数(BSTR *ではない)を指すようにpbstrVal(bstrValではなく)を設定する必要があるVT_BSTR | VT_BYREFです。 –

+0

あなたの答えをありがとう、私は正確な情報と関数については、DLLの開発者に尋ねた: HRESULT GetAppVersion([アウト、オプション] VARIANT * bsRetMsg、[out、retval] VARIANT * pVer); 私は を使用しました。VARIANT * retVar = new VARIANT; VariantInit(retVar); v.pvarVal = retVar; v.vt = VT_VARIANT | VT_BYREF; 本当にうまくいった ありがとうございました! – kn0t3k

答えて

0

あなたがデータを取り戻すしたいので、あなたがBSTR

BSTR str; 
VariantInit(&args[0]); 
args[0].vt = VT_BSTR | VT_BYREF; // it's a BSTR and it's by ref 
args[0].pbstrVal = &str; // give address of variable 
params.rgvarg = args; 
params.cArgs = 1; 

のアドレスを提供しなければならない今、呼び出し呼び出し、返されたBSTRを解放することを忘れないでください。

関連する問題