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, ¶ms, &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, ¶ms, &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メソッドに渡して、このパラメータから正しく出力する方法はありますか?
その宣言はほとんど意味がありません。「疑似」コードの代わりに実際のコードを投稿してください。彼のIDLの実際の宣言については、著者に尋ねる。あなたが電話をしている間に、[in、out、optional]でそれを正しく行うように頼んでください。最良の推測は、NULLに初期化されたBSTR変数(BSTR *ではない)を指すようにpbstrVal(bstrValではなく)を設定する必要があるVT_BSTR | VT_BYREFです。 –
あなたの答えをありがとう、私は正確な情報と関数については、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