В 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, поэтому я полагаю, что проблема где-то в моем коде. Как восстановить вывод name ?