您的位置:首页 > 编程语言

[代码实例]一个共享内存的class

2006-09-26 09:31 495 查看
[代码实例]一个共享内存的class
英雄
C、C++ (2003-10-29 09:08:43)

[jishiping]
代码:
class TShareMem
{
private:
int FSize;
BYTE *FBuffer;
char FName[33];
bool FCreated;
HANDLE FHandle;
public:
TShareMem(LPCSTR Name, int Size);
~TShareMem();

int Size() { return FSize; }
LPCSTR Name() { return FName; }
BYTE* Buffer() { return FBuffer; }
bool Created() { return FCreated; }
};

TShareMem::TShareMem(LPCSTR name, int size)
{
FSize = size<0 ? 0 : size;
memset(FName, 0, sizeof(FName));
if (!name || name[0]==0)
strcpy(FName, "ShareMemory");
else
strncpy(FName, name, sizeof(
FName));

FHandle = CreateFileMapping((HANDLE)
0xFFFFFFFF, NULL, PAGE_READWRITE,
0, FSize, FName);
FCreated = GetLastError() == 0x0000;
if (FHandle != NULL) {
FBuffer = (BYTE*)MapViewOfFile(
FHandle, FILE_MAP_WRITE, 0,
0, FSize);
if (FBuffer && FCreated)
memset(FBuffer, 0, FSize);
}
else
FBuffer = NULL;
if (FBuffer == NULL) {
char msg[256]; int ID;
ID = FORMAT_MESSAGE_FROM_SYSTEM;
FormatMessage(ID,0,GetLastError(
),0,msg,sizeof(msg),NULL);
MessageBox(GetActiveWindow(),msg,
"Error",MB_ICONWARNING|MB_OK);
}
}

TShareMem::~TShareMem()
{
if (FBuffer) UnmapViewOfFile(FBuffer);
if (FHandle) CloseHandle(FHandle);
}

函数Buffer()返回共享内存的指针,需要时将数据复制到Buffer()指向的内
存,这样各个进程之间就可以共享数据了。当然了,在各个程序里,共享名
必须要一样。如(对消息WM_SHAREDATA的响应代码我就不写了,应该会吧):

第一个程序中,希望将数据共享给第二个程序,并通知第二个程序
代码:
#define WM_SHAREDATA (WM_APP+1)
TShareMem ShareMem("MyShareMemName", 4096);
//ShareMem为全局变量,共享内存大小为4096个字节

__fastcall TForm1::TForm1(TComponent* AOwner)
: TForm(AOwner)
{
*(int*)ShareMem.GetBuffer() = (int)Handle;
}

void __fastcall TForm1::Button1Click(TObject* Sender)
{
strcpy(ShareMem.GetBuffer()+8, "Data 11111111");
SendMessage((HWND)*(int*)(ShareMem.GetBuffer()+4),
WM_SHAREDATA, 0, 0);
//在第二个程序中响应消息WM_SHAREDATA,然后就可以
//读取共享内存的数据了
}

第二个程序中,希望将数据共享给第一个程序,并通知第一个程序
代码:
#define WM_SHAREDATA (WM_APP+1)
TShareMem ShareMem("MyShareMemName", 4096);
//ShareMem为全局变量,共享内存大小为4096个字节

__fastcall TForm1::TForm1(TComponent* AOwner)
: TForm(AOwner)
{
*(int*)(ShareMem.GetBuffer()+4) = (int)Handle;
}

void __fastcall TForm1::Button1Click(TObject* Sender)
{
strcpy(ShareMem.GetBuffer()+8, "Data 222222");
SendMessage((HWND)*(int*)ShareMem.GetBuffer(),
WM_SHAREDATA, 0, 0);
//在第一个程序中响应消息WM_SHAREDATA,然后就可以
//读取共享内存的数据了
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐