Проблемы автоматизации OLE с C ++ - «Класс не зарегистрирован» - PullRequest
3 голосов
/ 17 ноября 2011

Я пытаюсь портировать программу LabView на C ++, и вызовы OLE, которые она содержит, доставляют мне некоторые проблемы.

Программа LabView запускается с «автоматического открытия», то есть получения ссылки на интерфейс «XLib.XInterface» (LabView называет это выражение «класс ActiveX»), затем вызывает метод QA, найденный в интерфейсе, и наконец снова закрывает ссылку. Я думаю, что LabView получает информацию об интерфейсе из библиотеки типов, но я не совсем уверен.

Я попытался адаптировать некоторый код для автоматизации Word, который нашел: http://www.codeproject.com/KB/office/MSOfficeAuto.aspx

CoInitialize(NULL);
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"XConfig.XInterface", &clsid);

IDispatch *pWApp;
if(SUCCEEDED(hr))
{
    hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, 
                          IID_IDispatch, (void **)&pWApp);
}
// etc.

Программа успешно ищет CLSID, но CoCreateInstance завершается ошибкой, утверждая, что класс не зарегистрирован. Я также попытался ввести CLSID непосредственно из библиотеки типов, минуя CLSIDFromProgID, но получив тот же результат. Само собой разумеется, что программа LabView работает нормально, и код C ++, который я использую, не имеет никаких проблем при создании экземпляра Word при использовании progID «Word.Application». Рассматриваемый интерфейс выглядит следующим образом:

[
   odl,
   uuid(33AAA2DA-70EB-48EE-ACA7-DD0D1F5CAF2D),
   helpstring("XInterface Interface"),
   dual,
   oleautomation
]
interface XInterface : IDispatch {
   [id(0x00000001), helpstring("method QA")]
   HRESULT QA();
   [id(0x00000002), helpstring("method LoadFromDisk")]
   HRESULT LoadFromDisk();
   ...

Как вы, возможно, заметили, OLE является для меня чем-то новым (скорее всего, это часть проблемы). Любые советы будут с благодарностью. Спасибо.

1 Ответ

0 голосов
/ 19 ноября 2011

ОК, думаю, я понял это сам, хотя я не до конца понимаю свое решение. Во всяком случае, когда я использую

hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IDispatch,
            (void **)&pWApp);

это похоже на работу; по крайней мере, я больше не получаю ошибку «класс не зарегистрирован». Разница заключается в замене аргумента CLSCTX_LOCAL_SERVER на CLSCTX_ALL. Я думаю, что это как-то связано с тем, что я использую DLL. У кого-нибудь есть более проницательное объяснение?

...