Добрый день.
Продолжаю изучать мат часть.
В системе есть сервер который принимает от разных приложение сообщения и записывает их в лог.
В качестве тестового задания (делаю для себя что бы понять что и как работает) решил написать приложение, которое:
— подключается к СОМ серверу;
— посылает сообщение.
С помощью 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;
}
Но подсказывает мой разум что это не правильно.
Где и в чем мой косяк?