Ком сервер

Содержание

Слайд 2

Создание библиотеки динамической компоновки, реализующей заглушки IDL - язык определения интерфейса

Создание библиотеки динамической компоновки, реализующей заглушки

IDL - язык определения интерфейса (Interface

Definition Language)

import "unknwn.idl";
//Interface IInput
[
object,
uuid(3DC9017D-10E4-4D83-8097-E0FC0497B965),
helpstring("IInput Interface"),
pointer_default(unique)
]
interface IInput : IUnknown
{
HRESULT input();
HRESULT output();
};
//Interface IPhone
[
object,
uuid(048C493E-A924-4345-8650-18BE597B4129),
helpstring("IPhone Interface"),
pointer_default(unique)
]
interface IPhone : IUnknown
{
HRESULT giveACall([in] int nPhone);
HRESULT takeACall([in] int nPhone);
};

Слайд 3

[ uuid(10C1D956-B61A-4B2C-8795-58CA53298ADB), version(1.0), helpstring("CInput 1.0 Type Library") ] library InputLib {

[
uuid(10C1D956-B61A-4B2C-8795-58CA53298ADB),
version(1.0),
helpstring("CInput 1.0 Type Library")
]
library InputLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
//Component
[
uuid(36C1D956-B61A-4B2C-8795-58CA53298ADB),

helpstring("Component class")
]
coclass CInput
{
[default] interface IInput;
};
};
Слайд 4

Компиляция .idl файла

Компиляция .idl файла

Слайд 5

Компоновка и регистрация proxy.dll LIBRARY Proxy.dll DESCRIPTION ‘Proxy/Stub DLL’ EXPORTS DllGetClassObject

Компоновка и регистрация proxy.dll

LIBRARY Proxy.dll
DESCRIPTION ‘Proxy/Stub DLL’
EXPORTS
DllGetClassObject @1 PRIVATE
DllCanUnloadNow @2 PRIVATE
GetProxyDllInfo @3 PRIVATE
DllRegisterServer @4 PRIVATE
DllUnregisterServer @5 PRIVATE

proxy.def

Слайд 6

STDMETHODIMP CInput::input(){ MessageBox(NULL, "Enter data","input Info", MB_OK); return S_OK; } STDMETHODIMP

STDMETHODIMP CInput::input(){
MessageBox(NULL, "Enter data","input Info", MB_OK);
return S_OK;
}
STDMETHODIMP CInput::output(){
MessageBox(NULL, "Output

data","output Info", MB_OK);
return S_OK;
}
STDMETHODIMP CInput::giveACall(int phoneNumber){
char str[32];
sprintf(str,"You are ringing up to %i",phoneNumber);
MessageBox(NULL, str,"output Info", MB_OK);
return S_OK;
}
STDMETHODIMP CInput::takeACall(int phoneNumber){
char str[32];
sprintf(str,"Dzine, dzine ... : %i",phoneNumber);
MessageBox(NULL, str,"output Info", MB_OK);
return S_OK;
}

Изменения в коде сервера, код компонента (CInput.cpp):

Слайд 7

Изменения в коде сервера (код приложения input_exe.cpp): #include #include #include #include

Изменения в коде сервера (код приложения input_exe.cpp):

#include
#include
#include
#include "guid.h"
#include

"CInput.h"
IClassFactory* g_pClassFactory;
DWORD g_dwRegister = 0;
HWND g_hWnd;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
BOOL Init();
void UnInit();
int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
{
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
Init();
Слайд 8

if (!hPrevInstance) { wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc =

if (!hPrevInstance) {
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc =

WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = "Class CInput" ;
RegisterClass (&wndclass) ;
}
hwnd = CreateWindow ("Class CInput", "Exe COM CInput",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0,
CW_USEDEFAULT, 0,
NULL, NULL, hInstance, NULL) ;
g_hWnd = hwnd;
ShowWindow (hwnd, nCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0)){
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
Слайд 9

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){

LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
WPARAM wParam, LPARAM

lParam){
static char str[80] = "It is an Exe Server";
HDC hDC;
PAINTSTRUCT ps;
switch (message){
case WM_PAINT:
hDC = BeginPaint (hwnd, &ps);
TextOut (hDC, 0, 0, str, lstrlen (str));
EndPaint (hwnd, &ps);
return 0;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0;
default:
break;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
Слайд 10

BOOL Init(){ HRESULT hr; hr = CoInitialize(NULL); if (FAILED(hr)){ MessageBox(NULL, "CoInitialize

BOOL Init(){
HRESULT hr;
hr = CoInitialize(NULL);
if (FAILED(hr)){
MessageBox(NULL, "CoInitialize

failed", "CInput", MB_OK);
return FALSE;
}
g_pClassFactory = new CInputClassFactory;
if (g_pClassFactory == NULL)
return FALSE;
g_pClassFactory->AddRef();
hr = CoRegisterClassObject(CLSID_Input, g_pClassFactory, CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE, &g_dwRegister);
if (FAILED(hr))
return FALSE;
return TRUE;
}
Слайд 11

void UnInit() { if (g_dwRegister != 0) CoRevokeClassObject(g_dwRegister); if (g_pClassFactory !=

void UnInit()
{
if (g_dwRegister != 0)
CoRevokeClassObject(g_dwRegister);
if (g_pClassFactory != NULL)

g_pClassFactory->Release();
CoUninitialize();
}

Компоновка и регистрация COM-сервера

REGEDIT
HKEY_CLASSES_ROOT\CInput.MyInput\CLSID = {36C1D956-B61A-4B2C-8795-58CA53298ADB}
HKEY_CLASSES_ROOT\CLSID\{36C1D956-B61A-4B2C-8795-58CA53298ADB} = CInput MyInput DLL
HKEY_CLASSES_ROOT\CLSID\{36C1D956-B61A-4B2C-8795-58CA53298ADB}\LocalServer32 = C:\workshop\run\comexe\server\input_exe.exe
HKEY_CLASSES_ROOT\CLSID\{36C1D956-B61A-4B2C-8795-58CA53298ADB}\ProgId = CInput.MyInput
HKEY_CLASSES_ROOT\Interface\{3DC9017D-10E4-4D83-8097-E0FC0497B965} = IInput
HKEY_CLASSES_ROOT\Interface\{3DC9017D-10E4-4D83-8097-E0FC0497B965}\NumMethods = 2
HKEY_CLASSES_ROOT\Interface\{048C493E-A924-4345-8650-18BE597B4129} = IPhone
HKEY_CLASSES_ROOT\Interface\{048C493E-A924-4345-8650-18BE597B4129}\NumMethods = 2

input_exe.reg

Слайд 12

Изменения в коде клиента (test2.cpp): #include #include #include #include "guids.c" #include

Изменения в коде клиента (test2.cpp):

#include
#include
#include
#include "guids.c"
#include "root.h"
int main(){
…………………………………………………………….
DWORD

dwContext = CLSCTX_LOCAL_SERVER; // необязательно
…………………………………

Компиляция и компоновка клиента (test2.cpp):