Есть прога(КОМ сервер), создаю объект так:
CComPtr<IUnknown> editor;
editor.CoCreateInstance(L"UKEditor.Document");
Но потом мне нужно добраться до интерфейса IDispatch
Делаю так:
CComPtr<IDispatch> editor1;
editor.QueryInterface(&editor1);
И вот после этого никакой реакции, интерфейс не возвращается. Да еще к тому же
и первый интерфейс теряется. HRESULT возвращается 0xcccccccc.
Как же такое реализовать то?
Заранее Спасибо.
Здравствуйте, Denwer, Вы писали:
D>Есть прога(КОМ сервер), создаю объект так:
[]
CComPtr<IDispatch> pDisp;
HRESULT hr = editor.QueryInterface(IID_IDispatch,&pDisp);
ATLASSERT(SUCCEEDED(hr));
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Здравствуйте, Denwer, Вы писали:
D>>Есть прога(КОМ сервер), создаю объект так:
AS>[]
AS>AS>CComPtr<IDispatch> pDisp;
AS>HRESULT hr = editor.QueryInterface(IID_IDispatch,&pDisp);
AS>ATLASSERT(SUCCEEDED(hr));
AS>
Не спасло. Резулт = E_NOINTERFACE
Всю регистрацию делал.
Вот ИДЛ.
[ uuid(0A2AC7F2-CCDC-4031-B58D-82D989AC8D3E), version(1.0) ]
library UKEditor
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
// Primary dispatch interface for CUKEditorDoc
[ uuid(BC260CD8-A442-4D8C-9F9C-590E5D5491F2) ]
dispinterface IUKEditor
{
properties:
methods:
[id(1), helpstring("method GetItem")] VARIANT GetItem(BSTR itemName);
};
// Class information for CUKEditorDoc
[ uuid(400AA429-A436-4D2B-B548-6481A6EF19E2) ]
coclass CUKEditorDoc
{
[default] dispinterface IUKEditor;
};
};
Как же мне получить этот Диспатч то?
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Здравствуйте, Denwer, Вы писали:
AS>COM сервер твой?
AS>Покажи реализацию.
Реализация моя. Но она верная т.к. работает следующее:
IUKEditorPtr ptr;
CLSID clsid;
CLSIDFromProgID(L"UKEditor.Document", &clsid);
ptr.CreateInstance(clsid);
CComPtr<IDispatch> dispatch;
ptr.QueryInterface(IID_IDispatch, &dispatch);
Но в примере я пользовался импортом, а в конечном итогде мне этого нельзя, нужно реализовать позднее связывание. И заранее я знать об интерфесах не буду. Токо ПрогИД.
ЗЫ: Видать тут шаманит этот _com_ptr, щас попробую по шагам его вывести на чистую воду.
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Здравствуйте, Denwer, Вы писали:
AS>COM сервер твой?
AS>Покажи реализацию.
Заработало
CLSID clsid;
CLSIDFromProgID(L"UKEditor.Document", &clsid);
IUnknown* pIUnknown = NULL;
IDispatch* pIDispatch = NULL;
HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, __uuidof(IUnknown), reinterpret_cast<void**>(&pIUnknown));
if (SUCCEEDED(hr)) {
hr = OleRun(pIUnknown); // Тут собака порылась
if (SUCCEEDED(hr))
hr = pIUnknown->QueryInterface(IID_IDispatch, reinterpret_cast<void**>(&pIDispatch));
}
pIUnknown->Release();