Проблемы автоматизации OLE с C++ - "Класс не зарегистрирован"
Я пытаюсь портировать программу 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 ответ
Хорошо, я думаю, что понял это сам, хотя я не до конца понимаю свое решение. Во всяком случае, когда я использую
hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IDispatch,
(void **)&pWApp);
это похоже на работу; по крайней мере, я больше не получаю ошибку "класс не зарегистрирован". Разница заключается в замене аргумента CLSCTX_LOCAL_SERVER на CLSCTX_ALL. Я думаю, что это как-то связано с тем, что я использую DLL. У кого-нибудь есть более проницательное объяснение?