在 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 调用它时,完全相同的方法工作正常,所以我认为问题出在我的代码中。如何恢复名称输出?