Помощь с DCOM
От: wbear  
Дата: 11.02.21 15:16
Оценка:
Добрый день

На горизонте моячит новая работа связанная с DCOM(COM) технологиями.

В процессе ознакомления с ТЗ сформированным заказчиком, возникло несколько вопросов связанных с хотелками заказчика и возможностями технологии COM.

Если сейчас не вдаваться в тонкости всего ТЗ.
То на повестки дня стоит вопрос — можно ли из существующего сервера( сервер является DCOM сервером, в виде исполняемого файла) получить список компонентов поддерживаемый этим сервером, и получить список всех функций и список параметров функций?

P.S. Прошу прощение у народа за возможные не точности в постановке вопроса в части COM терминов. У меня другая специализация. А этим вопросом меня загрузили всего несколько часов назад. Так как я еще не шибко образован в данной области.
Re: Помощь с DCOM
От: bnk СССР http://unmanagedvisio.com/
Дата: 11.02.21 16:28
Оценка:
Здравствуйте, wbear, Вы писали:

W>На горизонте моячит новая работа связанная с DCOM(COM) технологиями.


Фига себе, это в 2021 году

W>То на повестки дня стоит вопрос — можно ли из существующего сервера(сервер является DCOM сервером, в виде исполняемого файла) получить список компонентов поддерживаемый этим сервером, и получить список всех функций и список параметров функций?


В общем случае нет, но как правило с EXE или DLL поставляется так называемая "библиотека типов" (может быть зашита прямо в DLL например).
Если такая библиотека имеется, то это возможно. Она имеется для большинства COM-серверов, потому как они для того и предназначены, чтобы предоставлять сервисы другим.

Однако бывают случаи когда разработчик сервиса не хочет показывать какие интерфейсы и параметры имеются, и может специально не включить библиотеку типов.
Его код при этом продолжит работать, но сторонним программам информацию о типах получить не удастся.

Если работа связана как раз с таким вот недокументированным проприетарным сервисом, я бы не стал браться.
Re[2]: Помощь с DCOM
От: wbear  
Дата: 11.02.21 18:51
Оценка:
Здравствуйте, bnk, Вы писали:



bnk>Фига себе, это в 2021 году

ПО специфичное, разрабы в основном аппаратную часть развивают. А на софт забили.


W>>То на повестки дня стоит вопрос — можно ли из существующего сервера(сервер является DCOM сервером, в виде исполняемого файла) получить список компонентов поддерживаемый этим сервером, и получить список всех функций и список параметров функций?


bnk>В общем случае нет, но как правило с EXE или DLL поставляется так называемая "библиотека типов" (может быть зашита прямо в DLL например).

bnk>Если такая библиотека имеется, то это возможно. Она имеется для большинства COM-серверов, потому как они для того и предназначены, чтобы предоставлять сервисы другим.

bnk>Однако бывают случаи когда разработчик сервиса не хочет показывать какие интерфейсы и параметры имеются, и может специально не включить библиотеку типов.

bnk>Его код при этом продолжит работать, но сторонним программам информацию о типах получить не удастся.

А как узнать, есть ли в экзешнике такая библиотека типов?
Re[3]: Помощь с DCOM
От: SаNNy Россия  
Дата: 11.02.21 19:10
Оценка:
Здравствуйте, wbear, Вы писали:

W>А как узнать, есть ли в экзешнике такая библиотека типов?

Посмотрите файл *.tlb рядом с exe файлом.
Re[3]: Помощь с DCOM
От: bnk СССР http://unmanagedvisio.com/
Дата: 11.02.21 19:24
Оценка: +1
Здравствуйте, wbear, Вы писали:

W>А как узнать, есть ли в экзешнике такая библиотека типов?


Ну можно так попробовать:

1. Запустить OleView из Windows SDK, оно показывает зарегистрированные в системе библиотеки и их содержимое. Не знаю, может оно и со студией ставится, раньше ставилось.
  выглядит как-то так

2. Если не нашлась (библиотека не зарегистрирована например), можно попробовать открыть в OleView твой .exe ("Open Type Library"). Если открылся, то библиотека внутри (она пакуется просто как ресурс).
3. Если нет, поискать файл с расширением .tlb или .olb в каталоге программы, если нашелся, попробовать открыть, открылся — это оно.

Еще подумал, что если речь про железо, может это какой-нибудь OPC-сервер?
Если так, разве там все интерфейсы не стандартизованы?
Отредактировано 11.02.2021 19:40 bnk . Предыдущая версия . Еще …
Отредактировано 11.02.2021 19:35 bnk . Предыдущая версия .
Отредактировано 11.02.2021 19:25 bnk . Предыдущая версия .
Re[4]: Помощь с DCOM
От: wbear  
Дата: 12.02.21 07:25
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Здравствуйте, wbear, Вы писали:


W>>А как узнать, есть ли в экзешнике такая библиотека типов?


bnk>Ну можно так попробовать:


Скачал OleView.Exe. Запустил на станции и нашел несколько библиотек типов относящихся к моему софту.
Сейчас сижу разбираюсь что от чего и для чего.

bnk>Еще подумал, что если речь про железо, может это какой-нибудь OPC-сервер?

bnk>Если так, разве там все интерфейсы не стандартизованы?
Работа с железом основывается на ISO OTX. И софта стороннего валом.
Разрабы комплекса идут следующим путем. Мы типа развиваем железо, даем минимальный софт для работы с ним, а если кто хочет чего покруче, то покупает софт у стороннего разработчика или пишет под себя что ему нужно(стандарт открытый делай чего хочеш)
Re[2]: Помощь с DCOM
От: wbear  
Дата: 15.02.21 13:59
Оценка:
Добрый день.

Продолжаю изучать мат часть.


В системе есть сервер который принимает от разных приложение сообщения и записывает их в лог.

В качестве тестового задания (делаю для себя что бы понять что и как работает) решил написать приложение, которое:
— подключается к СОМ серверу;
— посылает сообщение.

С помощью OleView нашел библиотеку типов для этого сервера.
Она выглядит следующим образом
// Generated .IDL file (by the OLE/COM Object Viewer)
// 
// typelib filename: BlackBoxServer.exe

[
  uuid(3EFF64BC-AD80-459D-8DDB-2A2583DA7CD7),
  version(1.0),
  helpstring("BlackBoxServer 1.0 Typbibliothek"),
  custom(DE77BA64-517C-11D1-A2DA-0000F8773CE9, 117441067),
  custom(DE77BA63-517C-11D1-A2DA-0000F8773CE9, 1450347757),
  custom(DE77BA65-517C-11D1-A2DA-0000F8773CE9, Created by MIDL version 7.00.0555 at Thu Dec 17 11:22:36 2015
)

]
library BlackBoxServerLib
{
    // TLib :     // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
    importlib("stdole2.tlb");

    // Forward declare all types defined in this typelib dispinterface _IBlackBoxEvents;
    interface IBlackBox;
    [
      uuid(D3E8E5C0-B7EA-46E4-8AB9-B6964EC5DED7),
      helpstring("_IBlackBox-Ereignisschnittstelle")
    ]
    dispinterface _IBlackBoxEvents {
        methods:
            [id(0x00000001), helpstring("method NewEntry")]
            HRESULT NewEntry([in] BSTR bstrText);
    };

    [
      uuid(11111111-2222-4F7F-A634-76C49721523D),
      helpstring("BlackBox Class")
    ]
    coclass BlackBox {
        [default] interface IBlackBox;
        [default, source] dispinterface _IBlackBoxEvents;
    };

    [
      odl,
      uuid(812DBA1A-25BF-436A-920F-4D8B444D3E8D),
      helpstring("IBlackBox-Schnittstelle"),
      dual,
      nonextensible,
      oleautomation
    ]
    interface IBlackBox : IDispatch {
        [id(0x00000001), helpstring("method LogOn")]
        HRESULT LogOn(
                        [in] BSTR bstrCLientName, 
                        [out, retval] long* piSessionID);
        [id(0x00000002), helpstring("method LogOff")]
        HRESULT LogOff([in] long iSessionID);
        [id(0x00000003), helpstring("method Log")]
    ................................................
    };
};


Написал для проверки вот такой код

#include "stdafx.h"
#include "objbase.h"
#include "stdio.h"

CLSID CLSID_BlackBox = { 0x11111111, 0x2222, 0x4F7F, { 0xA6, 0x34, 0x76, 0xC4, 0x97, 0x21, 0x52, 0x3D} };
CLSID IID_IBlackBox =  { 0x812DBA1A, 0x25BF, 0x436A, { 0x92, 0x0F, 0x4D, 0x8B, 0x44, 0x4D, 0x3E, 0x8D} };

interface IBlackBox:public IUnknown
{
    virtual long _stdcall LogOn(BSTR bstrClientName);
    virtual void _stdcall LogOff(long iSessionID);
    virtual void _stdcall Log(long iSessionID, BSTR bstrText);
    ............................................................    
};

int main(int argc, char* argv[])
{
    CoInitializeEx(NULL, COINIT_MULTITHREADED);

    CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);

    HRESULT hr;

    IUnknown* pUnk = NULL;
    hr = CoCreateInstance( CLSID_BlackBox, 0, CLSCTX_INPROC_HANDLER | CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, __uuidof(IUnknown), (void**)&pUnk);
    if(!SUCCEEDED(hr))
        return 0;
    

    hr = OleRun(pUnk);
    if(FAILED(hr))
    {
        pUnk->Release();
        return 0;
    }

    IBlackBox *pBlackBox;
    hr = pUnk->QueryInterface(IID_IBlackBox, (void**)&pBlackBox);
    if(FAILED(hr))
    {
        pUnk->Release();
        return 0;
    }


    long iSession=0;
    BSTR log = SysAllocString(L"BB->");
    iSession = pBlackBox->LogOn(log);
    SysFreeString(log);

    printf("iSession -> %x\n", iSession);


    BSTR msg = SysAllocString(L"Mssss");
    pBlackBox->Log(iSession, msg);
    SysFreeString(msg);


    pBlackBox->LogOff(iSession);


    pBlackBox->Release();

    pUnk->Release();

    CoUninitialize( );

    return 0;

}


Но подсказывает мой разум что это не правильно.
Где и в чем мой косяк?
Re[3]: Помощь с DCOM
От: bnk СССР http://unmanagedvisio.com/
Дата: 15.02.21 16:46
Оценка:
Здравствуйте, wbear, Вы писали:

W>Где и в чем мой косяк?


А что не работает-то? Кстати код наверное можно сократить, как-то у тебя много там всего понаписано, можно короче:
#import "libid:3EFF64BC-AD80-459D-8DDB-2A2583DA7CD7"

int main(int argc, char* argv[])
{
    CoInitialize(NULL);

    BlackBoxServerLib::IBlackBoxPtr bb(__uuidof(BlackBoxServerLib::BlackBox));

    auto session = bb->LogOn(L"BB->");
    bb->Log(session, L"Mssss");
    bb->Logoff(session);

    CoUninitialize();
}

Или вообще на VB, зачем тебе плюсы, чтобы тестировать (создай файл с расширением .vbs и дабл-кликни, т.е. запусти), ну или в Excel нажми F11 и введи в редакторе
    Set bb = CreateObject("new:{11111111-2222-4F7F-A634-76C49721523D}")
    session = bb.LogOn("BB->")
    bb.Log(session, L"Missss")
    bb.LogOff(session)
Отредактировано 15.02.2021 16:58 bnk . Предыдущая версия . Еще …
Отредактировано 15.02.2021 16:56 bnk . Предыдущая версия .
Отредактировано 15.02.2021 16:55 bnk . Предыдущая версия .
Отредактировано 15.02.2021 16:54 bnk . Предыдущая версия .
Re[4]: Помощь с DCOM
От: wbear  
Дата: 11.03.21 09:33
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Здравствуйте, wbear, Вы писали:


W>>Где и в чем мой косяк?


bnk>А что не работает-то? Кстати код наверное можно сократить, как-то у тебя много там всего понаписано, можно короче:

bnk>
Код пришлось писать из за того что он вставлялся в исходный код заказчика и на его компах.


bnk>

bnk>Или вообще на VB, зачем тебе плюсы, чтобы тестировать (создай файл с расширением .vbs и дабл-кликни, т.е. запусти), ну или в Excel нажми F11 и введи в редакторе
Спасибо за идею с использованием Ексела. Кое -что проверили на роботоспособность.


Большое спасибо за помощь
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.