0
我上的应用程序,它连接到一个COM对象,并调用方法,并得到从这个对象等 属性我可以连接并调用成员的工作,这不是问题。我不能然而弄清楚,如何调用的方法,其具有一个输出参数,例如(伪码):C++ IDispatch接口调用与输出参数
int GetAppVersion(bsRetMsg [out, optional]).
此函数返回INT作为版本,并且还可以通过返回的版本的字符串表示输出参数。
我已经试过:
(1)
(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;
...
(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中的实际声明。在你打电话的时候,让他用[进出,可选]做对。最好的猜测是VT_BSTR | VT_BYREF,需要设置pbstrVal(不bstrVal)指向一个BSTR变量(不BSTR *)被初始化为NULL。 –
感谢您的回答,我问的dll开发精确的信息和功能是: HRESULT GetAppVersion([出,可选] VARIANT * bsRetMsg,[出,retval的] VARIANT * PVER); 所以我用 VARIANT * retVar =新变体; VariantInit(retVar); v.pvarVal = retVar; v.vt = VT_VARIANT | VT_BYREF; 和它的工作真的很好 谢谢! – kn0t3k