原理很简单,在虚拟内存中按名称共享一个数据,通过对该数据的验证实现程序间的互斥。
主要用到的方法:
1. CreateFileMapping(...);
2. MapViewOfFile(...);
3. OpenFileMapping(...);
4. CloseHandle(...);
用法bcb help中就有例程,这里就不浪费唇舌了,只是记下来备用。
实现代码:
HANDLE m_hReceiveMap;
char * mp_ch;
m_hReceiveMap = OpenFileMapping(FILE_MAP_READ, FALSE, "DataMap");
if (m_hReceiveMap == NULL)
{
HANDLE myMap;
PVOID pBuf;
TCHAR szMsg[]=TEXT("MyFileMappingObject");
myMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 256,"DataMap");
if(myMap!=NULL)
pBuf=MapViewOfFile(myMap,FILE_MAP_ALL_ACCESS,0,0,0);
else
ShowMessage("myMap==NULL");
CopyMemory((PVOID)pBuf, szMsg, strlen(szMsg));
}
else
{
mp_ch = (LPBYTE)MapViewOfFile(m_hReceiveMap,FILE_MAP_READ,0,0,0);
if (mp_ch != NULL)
{
String s = mp_ch;
if ( s =="MyFileMappingObject")
{
ShowMessage("请先关闭正在运行的XXX软件,再运行本程序!");
CloseHandle(m_hReceiveMap);
m_hReceiveMap=NULL;
this->Close();
}
}
}