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

万一其他人遇到同样的问题:我无法解决它,但这里有一个解决方法。Invoke我没有使用 IDispatch 接口的方法,而是GetFirstMono使用一个名为 MIDL 的 Microsoft 程序为声明的接口创建了一个头文件 - 但也可以手动完成(只需使用 ole 查找接口的方法/com 查看器并写入相应的头文件)。然后,对该方法的调用非常简单:

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

在codeguru.com上有更多信息。希望能帮助到你。

顺便说一句:我仍然对最初的问题感兴趣。如果你知道答案,请留言!

于 2011-11-28T10:24:24.667 回答
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 回答