同一目录中的某exe只允许运行,若此exe再安装在其它目录,可以再运行一个实
例
如 c:\dir1\Mytest.exe 只允许一个运行实例,
c:\dir2\Mytest.exe 还可再运行一个实例
C:\dir3\MyTest.exe 还可再运行一个实例
怎样实现?
此前太大方了 :),结果可用分不多了,见谅!
写个特殊文件在本目录中,用它来判断有没有程序运行应该就可以了
写注册表
运行后把标题改成他的全路径名
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->Title="Temp";
if(FindWindow("TApplication",ParamStr(0).c_str()))
{
ShowMessage("已经有一个实例再运行");
return 0;
}
Application->Title=ParamStr(0);
....
....
}
//根据目录名来创建名称,这里可能需要调整
AnsiString t_MutexName="yourname"+ExtractFilePath(Appliction->ExeName);
HANDLE Hmutex=CreateMutex(NULL,true,t_MutexName.c_str());
if(Hmutex==NULL||GetLastError()==ERROR_ALREADY_EXISTS)
{
CloseHandle(Hmutex);
HWND run=FindWindowEx(NULL,NULL,"THT_Main",NULL);
if(run!=NULL)
{
PostMessage(run,MY_SHOW,NULL,NULL);
}
return 0;
}
我觉得较简单的方式是写注册表,每运行一个程序,将运行路径提取出来,写入注册表,结束时,从注册表中删除相应健值。程序运行时,先检查指定注册表项有无此路径,然后作相应处理。
include <psapi.h> add psapi.lib //////////
DWORD aProcesses[1024], cbNeeded, cProcesses,cbReturned;
unsigned int i,n=0;
HANDLE hProcess;
HMODULE hModule;
EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ;
cProcesses = cbNeeded / sizeof(DWORD);
for(i=0;i< cProcesses;i++)
{
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,aProcesses[i] );
char szModName[MAX_PATH];
if((hProcess!=NULL) )
{
EnumProcessModules( hProcess, &hModule, sizeof(hModule),&cbReturned);
GetModuleFileNameEx(hProcess, hModule,szModName,MAX_PATH);
CloseHandle(hProcess);
if(strcmp(szModName,Application->ExeName.c_str())==0)
{
n++;
if(n==2) Application->Terminate();
}
}
}
Application->Initialize();
Application->CreateForm(__classid(TMain), &Main);
Application->Run();
yangfan369(行者) 的方法挺好的
Atom方法也许可行,但是一定要注意如果程序出现以外死掉的话,对标记的清除不要有影响,
从这点上说,FindWindow倒是挺和要求的。
但我觉得用FindWindow不太好。
用MuTex吧!
gz