Автоматизация OLE с C ++: получение пустого варианта из Invoke () вместо правильного результата - PullRequest
0 голосов
/ 25 ноября 2011

В 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 ?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2011

Попробуйте установить тип VT_BSTR|VT_BYREF для аргумента 0.

CComBSTR bstrName;
V_VT(&dp.rgvarg[0]) = VT_BSTR | VT_BYREF;
V_BSTRREF(&dp.rgvarg[0]) = &bstrName;
0 голосов
/ 28 ноября 2011

В случае, если у кого-то еще возникла такая же проблема: я не смог ее решить, но вот обходной путь.Вместо использования метода Invoke интерфейса IDispatch я создал файл заголовка для интерфейса, в котором объявляется GetFirstMono, используя программу Microsoft под названием MIDL - но это также можно сделать вручную (просто посмотрите методыинтерфейса с Ole / Com Viewer и написать соответствующий файл заголовка).Тогда вызов метода довольно прост:

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

Более подробную информацию можно получить по адресу codeguru.com .Надеюсь, это поможет.

Кстати: мне все еще интересен оригинальный вопрос.Если вы знаете ответ, пожалуйста, напишите его!

...