Создание объекта через ProgID
От: Denwer Россия  
Дата: 30.06.03 07:05
Оценка:
Есть прога(КОМ сервер), создаю объект так:


CComPtr<IUnknown> editor;
editor.CoCreateInstance(L"UKEditor.Document");


Но потом мне нужно добраться до интерфейса IDispatch
Делаю так:
CComPtr<IDispatch> editor1;
editor.QueryInterface(&editor1);


И вот после этого никакой реакции, интерфейс не возвращается. Да еще к тому же
и первый интерфейс теряется. HRESULT возвращается 0xcccccccc.

Как же такое реализовать то?
Заранее Спасибо.
Re: Создание объекта через ProgID
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 30.06.03 07:07
Оценка:
Здравствуйте, Denwer, Вы писали:

D>Есть прога(КОМ сервер), создаю объект так:


[]

CComPtr<IDispatch> pDisp;
HRESULT hr = editor.QueryInterface(IID_IDispatch,&pDisp);
ATLASSERT(SUCCEEDED(hr));
Re[2]: Создание объекта через ProgID
От: Denwer Россия  
Дата: 30.06.03 07:15
Оценка:
Здравствуйте, 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;
    };
};


Как же мне получить этот Диспатч то?
Re[3]: Создание объекта через ProgID
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 30.06.03 07:16
Оценка:
Здравствуйте, Denwer, Вы писали:

COM сервер твой?
Покажи реализацию.
Re[4]: Создание объекта через ProgID
От: Denwer Россия  
Дата: 30.06.03 07:25
Оценка:
Здравствуйте, 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, щас попробую по шагам его вывести на чистую воду.
Re[4]: Создание объекта через ProgID
От: Denwer Россия  
Дата: 30.06.03 07:39
Оценка:
Здравствуйте, 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();
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.