[代码实例]一个共享内存的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,然后就可以
//读取共享内存的数据了
}
代码:
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,然后就可以
//读取共享内存的数据了
}
- [代码实例]一个共享内存的class
- Linux下内存共享的一个实例(设置共享内存,一个程序写,一个程序读)
- c++共享内存的实例
- class prototype 共享内存
- C++ class实例的内存结构
- C++ class实例的内存结构
- C++ class实例的内存结构
- C++ class实例的内存结构
- Linux 多线程编程( POSIX )( 六 )----->代码区 ( 共享内存实例 )
- 共享内存实例 :
- 共享内存+信号量 实例
- 共享内存+信号量 实例
- 共享内存实例
- 共享内存实例
- 一个共享内存封装类的源码
- 内存共享代码示例
- 共享内存代码
- 对一个无法一次读入内存的大文件进行排序的代码实例
- equals( )方法与 == 运算符的用法比较
- MapObejcts组件应用设计(几何对象)
- Sys.ScriptLoader与JS加载进度条的实现
- MapObejcts组件应用设计(地图数据的创建与编辑)
- 98、2000和XP系统自定义打印纸张的VB代码
- [代码实例]一个共享内存的class
- Linux下的实时流媒体编程
- Zsh Workshop
- [代码实例]字符串近似匹配算法 C++
- 自己主机作服务器
- 常用及有用的表格收集(不断更新中)
- MapObejcts组件应用设计(投影与地图数据坐标系)
- MapObejcts组件应用设计(地图绘图输出)
- 一些经典的Pocket PC界面设计