Проблемы автоматизации OLE с С++ - "Класс не зарегистрирован"

Я пытаюсь перенести программу LabView на С++, а входящие в нее запросы 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 отлично работает, и код С++, который я использую, не имеет никакого труда создать экземпляр Word при использовании progID "Word.Application". Соответствующий интерфейс выглядит следующим образом:

[
 odl,
 uuid(33AAA2DA-70**-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 ответ

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

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

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

licensed under cc by-sa 3.0 with attribution.