[]怎么保证同一个应用程序,只有一个进程实例在运行

[求助]如何保证同一个应用程序,只有一个进程实例在运行
现在在开发一个硬件相关的程序,不过,程序有的时候会不正常退出,所以窗口尽管已经关掉,但实际上还有一个进程在运行中,所以下次重新打开应用程序时,就会提示硬件设备被lock了,需要手动在任务管理器中终止上次遗留下的进程,才可以。

我记得以前看过一些代码,在程序InitInstance()中,先检测有没有相同名称的进程实例,如果有,就强制终止此进程,但现在找不到了。

请高手帮忙,或提供代码。

e-mail:     yysbest@163.com       yysbest@gmail.com

不胜感激!

呵呵。

------解决方案--------------------
记得以前看过一些代码,在程序InitInstance()中,先检测有没有相同名称的进程实例,如果有,就强制终止此进程,但现在找不到了。
===========================================
利用一些内核对象能让一个进程在发现有本身实例时退出.代码如下:
handle=::CreateMutex(NULL,FALSE,one);//handle为声明的HANDLE类型的全局变量
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
AfxMessageBox( "应用程序已经在运行 ");
return FALSE;
}

------解决方案--------------------
这个法子试试
程序运行运行时 创建一个内存映像 并用它保存进程ID

每次打开 都查看内存映像 没有则创建 有 就终止....

其代码如下:

InitInstance()
{
//保持只有一个服务在运行.....
//使用了文件映像的方法,存储当前Process ID到内存中,这样就可以通过这个
//ID来退出这个进程了.
HANDLE hProcessID = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, TRUE, PEEPER_ALONE);
LPBYTE lpData = NULL;
if(hProcessID != NULL) // 已经有服务在运行了.
{
lpData = (LPBYTE)::MapViewOfFile(hProcessID,
FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DWORD));
DWORD dwID = 0;
if(lpData != NULL)
{
dwID = *((DWORD *)(lpData)); // 得到在运行的进行ID
}
::UnmapViewOfFile(lpData);
::CloseHandle(hProcessID);
if(dwID != 0) // 通过ID来退出进程
{
HANDLE hHandle = NULL;
hHandle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwID);
::TerminateProcess(hHandle, 0);
::WaitForSingleObject(hHandle, INFINITE);
::CloseHandle(hHandle);
}
}
hProcessID = ::CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE,
0, sizeof(DWORD), PEEPER_ALONE);
if(hProcessID != NULL) // 创建新的文件映象,保存本进程的ID
{
lpData = (LPBYTE)::MapViewOfFile(hProcessID,
FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DWORD));
if(lpData != NULL)
{
DWORD dwID = ::GetCurrentProcessId();
memcpy(lpData, &dwID, sizeof(DWORD));
}
}


::UnmapViewOfFile(lpData); // 取消文件映象
::CloseHandle(hProcessID);

return FALSE;
}

------解决方案--------------------
在头文件中加一个#pragma data_seg( ".share ")
int mutex=0
#pragma data_seg()
#pragma comment(linker, "/section:.share,RWS ")
在InitialInstance中加入:

if(mutex==0)
{
mutex=GetCurrentProcess();
return TURE;
}
else
{
TerminateProcess(mutex,0);
return FALSE;
}

------解决方案--------------------
一个简单的问题,居然跟贴这么长???
利用内核同步对象和自定义消息(或者共享内存)就可以了.
1.判断内核对象是否存在.
2.已经存在就从共享内存中读取前一个进程的ID.然后TerminateProcess.
3.创建新的内核对象.
4.继续创建一个命名的共享内存.写入当前里程的ID.
5.运行程序其他功能.
第二步完成后也许需要等待一下系统清理上一个进程打开的资源.