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;

}


Но подсказывает мой разум что это не правильно.
Где и в чем мой косяк?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.