共享内存
最近常听到共享内存该词,CreateMapFile... 等实现程序间数据共享,但就不知道怎样用,麻烦哪位能有个完整的实例供学习一下,万分感谢。
我以前是用vc的用过这个,现在刚来这边,还不是太熟练,就贴个vc的代码出来吧
发送端
void CPositionMonitorDoc::OnMenuSendcommand()
{
// TODO: Add your command handler code here
g_hEvent = ::CreateEvent(
NULL,
FALSE,
FALSE,
g_EventName);
if (g_hEvent==NULL)
{
AfxMessageBox("创建事件失败!",MB_OK,0);
}
::ResetEvent(g_hEvent);//置为未受信
//创建共享内存
g_hMap = ::CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
1024*1024,
g_ShareMEMName);
if (g_hMap==NULL)
{
AfxMessageBox("创建共享内存失败!",MB_OK,0);
}
pBuffer = ::MapViewOfFile(g_hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if (pBuffer==NULL)
{
AfxMessageBox("映射共享内存失败!",MB_OK,0);
}
hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
SetEvent(hEvent);
if(NULL==g_hCommand)
g_hCommand= AfxBeginThread(&SendCommandThread,this)->m_hThread;
if(NULL==g_hWrite)
g_hWrite= AfxBeginThread(&WriteDB,this)->m_hThread;
MenuItemFlag=1;
m_comNum=1;
this->UpdateAllViews(NULL);
}
接收端
BOOL CMyApp::StartUpdata(void)
{
g_hEvent = ::OpenEvent(EVENT_ALL_ACCESS,FALSE,g_EventName);
if (g_hEvent==NULL)
{
AfxMessageBox("打开事件失败!\n");
return FALSE;
}
g_hMap = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, g_ShareMEMName);
if (g_hMap==NULL)
{
AfxMessageBox("打开共享内存失败!\n");
return FALSE;
}
pBuffer = ::MapViewOfFile(g_hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if (pBuffer==NULL)
{
AfxMessageBox("映射共享内存失败!\n");
return FALSE;
}
theApp.isRun=TRUE;
DWORD dwTID = FALSE;
g_hThread=::CreateThread(NULL,NULL,UpdateMap,NULL,NULL,&dwTID);
if (g_hThread==NULL)
{
return FALSE;
}
return TRUE;
}
#ifndef fsReLoginH
#define fsReLoginH
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; }
};
//---------------------------------------------------------------------------
#endif
TShareMem::TShareMem(LPCSTR name, int size)
{
extern char g_strShareMemName[];
FSize = size<0 ? 0 : size;
memset(FName, 0, sizeof(FName));
if (!name || name[0]==0)
// strcpy(FName, "ShareMemory");
strcpy ( FName, g_strShareMemName );
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);
}
// 使用
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
extern char g_strShareMemName[];
ShareMem = new TShareMem ( (char *)g_strShareMemName, 4096 );
m_blFirst = true;
}
//---------------------------------------------------------------------------
void TfrmMain::SendMessageToShareMem(int MessageNo)
{
HANDLE hWnd; // = FindWindow ( "TfrmMain", "SRFetal" );
hWnd = (HANDLE)(*(int*)(ShareMem->Buffer()));
if ( hWnd )
{
// ShowMessage ( IntToStr((int)hWnd)+ " "+ stLoginUser.strUser );
StrCopy ( (char *)(ShareMem->Buffer()+16), stLoginUser.strUser);
PostMessage ( hWnd, GETLOBINMSG, MessageNo, NULL );
}
}
__fastcall TfrmMain::~TfrmMain()
{
if( NULL != ShareMem ) delete ShareMem;
}