[代码实例]一个共享内存的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,然后就可以
//读取共享内存的数据了
}
英雄
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,然后就可以
//读取共享内存的数据了
}
相关文章推荐
- Linux下内存共享的一个实例(设置共享内存,一个程序写,一个程序读)
- 对一个无法一次读入内存的大文件进行排序的代码实例
- java中如何理解多个对象共享同一个静态成员变量(多个实例的static变量会共享同一块内存区域)
- Linux 驱动学习笔记05--字符驱动实例,实现一个共享内存设备的驱动
- 通过一个实例来学习进程间通信之----共享内存,以及使用信号量来保护
- Linux 多线程编程( POSIX )( 六 )----->代码区 ( 共享内存实例 )
- 当调用的DLL中有全局变量时调用它的多个实例是否共享同一个全局变量
- 致java初学者:理解每一句java代码,给出一个简单实例。
- C++ class实例的内存结构
- 一个JS内存泄露实例分析
- Golang1.7使用kernel32.dll 读取共享内存,代码小示例
- php和数据库结合的一个简单的web实例 代码分析 (php初学者)
- 原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
- 原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
- 函数指针类的虚函数表是一块连续的内存,每个内存单元中记录一个JMP指令的地址。 注意的是,编译器会为每个有虚函数的类创建一个虚函数表,该虚函数表将被该类的所有对象共享。类的每个虚成员占据虚函数表中的一
- 代码列表5.1 (shm.c) 尝试共享内存
- 用static实现类的多个实例共享一个变量
- 一个android网络登录实例代码
- instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例 , 返回true或者false
- 用java语言编译内存中java小程序,并将生成的.class文件保存在一个文件夹下。