получить указатель на Компас

Автор Rocky, 04.09.06, 17:45:33

« предыдущая - следующая »

0 Пользователей и 1 гость просматривают эту тему.

Rocky

04.09.06, 17:45:33 Последнее редактирование: 04.09.06, 17:53:40 от Rocky
Всем доброго времени суток!

Пишу аддин (именно аддин) к Компасу (7). Приложение - COM-овское. Среда/язык - .NET 2003/C++. В хэлпе к Компасу прочел, что вроде как нужно использовать ф-ю CreateKompasObject. Но я не могу понять, где она определена. В примерах к нему везде пишется что-то вроде:
KompasObjectPtr p;
HMODULE hMod = LoadLibrary(sDllFileName.c_str());
if (hMod)
{
     typedef LPDISPATCH (WINAPI *FCreateKompasObject)();
     FCreateKompasObject pCreateKompasObject = (FCreateKompasObject)GetProcAddress(hMod, "CreateKompasObject");
     if (pCreateKompasObject) p = pCreateKompasObject();
     FreeLibrary(hMod);
}


где sDllFileName - путь к dll-ке kAPI5.dll. Но в ней, как и в tlb-хах, и хидерах нету такой функции. К тому же hMod - всегда NULL.... Получить указатель через GetActiveObject тоже не удается. Пытаюсь брать его у переменной типа KompasObjectPtr, возвращается E_NOINTERFACE. Может не у того беру?
Пробовал делать даже так:

CLSID sCLSID;
HRESULT hr = AfxGetClassIDFromString(_T("Kompas.Application.5"), &sCLSID);
if (SUCCEEDED(hr))
{
     IUnknown *punk;
     IDispatch *dispatch;
     hr = GetActiveObject(sCLSID,NULL,&punk);
     if (SUCCEEDED(hr))
     {
          hr = punk->QueryInterface(IID_IDispatch, (void**)&dispatch);
          punk->Release();
          if (SUCCEEDED(hr))
          {
               m_pApplication = (KompasObjectPtr)dispatch;
          }
     }
}


Но здесь m_pApplication не приводится почему-то - NULL после приведения. Ее тип ессно KompasObjectPtr. dispatch - НЕ NULL.
Что делать? Дайте совет плиз....   8-)

333

Функция CreateKompasObject реализована в kAPI5.dll специального объявления для нее ни в одном хидере нет
и lib файл обычно не подключается. Зачем dll тянуть явно из-за всего одной функции.
Поэтому во всех степах адрес функции берется через GetProcAddress
Но эту функцию можно использовать только в прикладных библиотеках.
Из другого приложения, контроллера, использовать ее нельзя.

путь к kAPI5.dll расчитывается по пути к kompas.exe
См функцию GetKompas в
SDK C++\VisualcAUTO\eventsAuto\eventsAuto.cpp


Функция GetActiveObject используется в контроллере.
    KompasObjectPtr m_pApplication;

    CLSID clsid;
   
    HRESULT hr = CLSIDFromProgID(L"KOMPAS.Application.5", &clsid );
   
    if ( hr == NOERROR) {
        // попытаемся получить активный объект перед созданием нового
      LPUNKNOWN lpUnk;
      if (GetActiveObject(clsid, NULL, &lpUnk) == NOERROR)
      {
         m_pApplication = lpUnk; // Обязательно без приведения чтобы Ptr-ная оболочка сама сделала QueryInterface



Rocky

Спасибо за ответ. Но, к сожалению это не помогло. lpUnk - что-то содержит, но после присвоения m_pApplication все равно NULL :( Честно говоря даже не знаю что тут неправильно......

Rocky

Поставил 8-й Компас и все заработало....  :o