COM CoCreateInstance

Тема в разделе "WASM.WIN32", создана пользователем XshStasX, 8 фев 2011.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Нашол CLSID документа ворда
    HKEY_CLASSES_ROOT\CLSID\{18A06B6B-2F3F-4E2B-A611-52BE631B2D22}
    пытаюсь теперь добраться до методов.

    Код (Text):
    1. #include "unknwn.h"
    2.  
    3. // "18A06B6B-2F3F-4E2B-A611-52BE631B2D22"
    4. const CLSID CLSID_Word2003 = {0x18A06B6B, 0x2F3F, 0x4E2B,
    5.     {0xA6, 0x11, 0x52, 0xBE, 0x63, 0x1B, 0x2D, 0x22}};
    6.  
    7.  
    8. void InitDocComLib(){
    9.     HRESULT hr;
    10.     IUnknown    *unknwn;
    11.  
    12. hr = CoInitializeEx(NULL,COINIT_MULTITHREADED);
    13.       if ( FAILED(hr) )
    14.            return ;
    15.  
    16.     hr = CoCreateInstance(CLSID_Word2003,NULL,CLSCTX_INPROC_SERVER,IID_IUnknown,(LPVOID*)&unknwn);
    17.         if (FAILED(hr))
    18.             return;
    19.    
    20.     hr = unknwn->QueryInterface(CLSID_Word2003, (void**)&pSum);
    21.         if(FAILED(hr)){
    22.             return ;
    23.         };
    24.  
    25. CoUninitialize();
    26. };
    CoCreateInstance возвращает Class not registered вопрос почему ?...
    Ворд установлен...
     
  2. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    CLSCTX_INPROC_SERVER ?
     
  3. MiraclE

    MiraclE New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2005
    Сообщения:
    38
    Адрес:
    Kazakhstan
    У ворда COM сервер в exe файле, так что как справедливо замечено выше нужно использовать CLSCTX_LOCAL_SERVER.
     
  4. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Делаю так
    Код (Text):
    1.     HRESULT hr;
    2.     IUnknown    *unknwn,*pSum;
    3.     CLSID   Word;
    4.     CLSIDFromProgID(L"Word.Application",&Word);
    5.     hr = CoCreateInstance(Word,NULL,CLSCTX_LOCAL_SERVER,IID_IUnknown,(LPVOID*)&unknwn);
    6.         if (FAILED(hr))
    7.             return;
    8.    
    9.     hr = unknwn->QueryInterface(Word, (void**)&pSum);
    10.         if(FAILED(hr)){
    11.             return ;
    12.         };
    А возвращает E_NOINTERFACE
    Интересно чего так?..
     
  5. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    ты передаёшь CLSID кокласса в QueryInterface, а нада IID какого-нибудь поддерживаемого интерфейса
     
  6. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Можно узнать список этих IID для каждого CLSID ?...
     
  7. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Если есть документация то можно. Если есть Type Library, то также кое-что можно достать оттуда.
     
  8. chessman

    chessman New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2010
    Сообщения:
    2
    1. Можно просто посмотреть через OLEVIEW.
    2. Просто втупую перебрать все интерфейсы.