|
C++ Builders Developer's Journal 의 기사에서 소스부분만 올립니다. 쉽게 하실수 있을겁니다.
프로그램을 2개 만듭니다. server, client. 각각 메모, 버튼 등을 올려놓고 아래와 같이 코딩하
시면 테스트 할 수 있습니다. 그럼..
Using Windows file mapping for inter-process communications, Part 1
by Mark G. Wiseman
Listing A: ServerMain.h
class TServerForm : public TForm
{
__published:
TMemo *Memo1;
TButton *CloseBtn;
TTimer *Timer;
void __fastcall OnTimer(TObject *Sender);
void __fastcall Exit(TObject *Sender);
public:
__fastcall TServerForm(TComponent* Owner);
__fastcall ~TServerForm();
private:
char *memmap;
HANDLE fmHandle;
};
Listing B: ServerMain.cpp
#include <vcl.h>
#pragma hdrstop
#include "ServerMain.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TServerForm *ServerForm;
__fastcall TServerForm::TServerForm(
TComponent* Owner) : TForm(Owner)
{
Caption = Application->Title;
fmHandle = CreateFileMapping(
(HANDLE)0xFFFFFFFF, 0,
PAGE_READWRITE, 0, 1024,
"ReisdorphDemoFileMap");
if (fmHandle == 0)
{
ShowMessage("Unable to create File Mapping.");
Application->Terminate();
}
memmap =
(char *)MapViewOfFile(fmHandle,
FILE_MAP_ALL_ACCESS, 0, 0, 0);
if (memmap == 0)
{
ShowMessage("Error!");
Application->Terminate();
}
*memmap = 0;
}
__fastcall TServerForm::~TServerForm()
{
if (memmap != 0)
UnmapViewOfFile(memmap);
if (fmHandle != 0)
CloseHandle(fmHandle);
}
void __fastcall TServerForm::OnTimer(
TObject *Sender)
{
if (*memmap != 0)
{
Memo1->Lines->Text = memmap;
*memmap = 0;
}
}
void __fastcall TServerForm::Exit(TObject *Sender)
{
Close();
}
Listing C: ClientMain.h
class TClientForm : public TForm
{
__published:
TMemo *Memo1;
TButton *SendBtn;
TButton *CloseBtn;
void __fastcall Exit(TObject *Sender);
void __fastcall Send(TObject *Sender);
public:
__fastcall TClientForm(TComponent* Owner);
__fastcall ~TClientForm();
protected:
void __fastcall OnIdle(
TObject *Sender, bool &Done);
private:
HANDLE fmHandle;
char *memmap;
};
Listing D: ClientMain.cpp
__fastcall TClientForm::TClientForm(
TComponent* Owner) : TForm(Owner)
{
Caption = Application->Title;
fmHandle =
OpenFileMapping(FILE_MAP_ALL_ACCESS,
false, "ReisdorphDemoFileMap");
if (fmHandle == 0)
{
ShowMessage("Unable to create File Mapping.");
Application->Terminate();
}
memmap =
(char *)MapViewOfFile(fmHandle,
FILE_MAP_ALL_ACCESS, 0, 0, 0);
if (memmap == 0)
{
ShowMessage("Unable to map view of file.");
Application->Terminate();
}
Application->OnIdle = OnIdle;
}
__fastcall TClientForm::~TClientForm()
{
if (memmap != 0)
UnmapViewOfFile(memmap);
if (fmHandle != 0)
CloseHandle(fmHandle);
}
void __fastcall TClientForm::Exit(TObject *Sender)
{
Close();
}
void __fastcall TClientForm::Send(TObject *Sender)
{
lstrcpy(memmap, Memo1->Text.c_str());
Memo1->Clear();
}
void __fastcall TClientForm::OnIdle(
TObject *Sender, bool &Done)
{
SendBtn->Enabled =
Memo1->Lines->Text.IsEmpty() == false;
}
|