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

来源:互联网 发布:sql个人版下载 编辑:程序博客网 时间:2024/05/17 23:50

[代码实例]一个共享内存的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,然后就可以
    //读取共享内存的数据了

 
原创粉丝点击