一个老问题,如何防止程序重复运行?(工作在托盘区的程序,findwindow好像找不到)

qrwulysses 2003-12-14 11:47:02
问题同上,程序是在托盘区中的,通过窗体名好像找不到,谢谢了
...全文
98 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
南郁 2003-12-15
  • 打赏
  • 举报
回复
用 FindWindow() 土是土点....不过程序要是非法退出,用户倒不用重启机器.用原子之类, 如果异常没能抓到(最很常见),程序直接非法退出.就会有这问题. 原来的某个版本的金山词霸就这样.
lyyrw 2003-12-15
  • 打赏
  • 举报
回复
HANDLE mutex;
AnsiString mutex_name;

mutex_name = "ChPrDown";
mutex = OpenMutex(MUTEX_ALL_ACCESS, false, mutex_name.c_str());
if(mutex == NULL) {
mutex = CreateMutex(NULL, true, mutex_name.c_str());
} else {
CloseHandle(mutex);

return(0);
}
jbz 2003-12-14
  • 打赏
  • 举报
回复
如何防止一个没有窗体的WINDOWS程序的重复运行?
http://bcbget.myrice.com/w/o35.htm

用互斥(Mutex),Mutex本来是多线程同步用的,防止
多个线程访问同一资源而引发冲突。用CreateMutex可以
创建Mutex对象,实质上是一个kernel对象。

在任何Win32程序(包括GDI和Console)的启动部分加上
以下代码(Console程序的main函数、MFC程序的CWinApp
派生类的InitInstance成员函数、RawSDK程序的WinMain
函数):
hMutex=CreateMutex(
NULL,//nosecurityattributes
FALSE,//initiallynotowned
"RunOnlyOneInstance");//命名Mutex是全局对象
//在所有的process都可以访问到

if(hMutex==NULL||
ERROR_ALREADY_EXISTS==::GetLastError()){
//程序第二次或以后运行时,会得到Mutex已经创建的错误
returnFALSE;
}
嘿嘿,是不是不用FindWindow优雅简洁多了?

另外,如果要限定程序同时可运行n个实例怎么办?
Tips:用信号量(Semaphore)。

domustdo 2003-12-14
  • 打赏
  • 举报
回复
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
void * OnlyRunOnce;

try
{
OnlyRunOnce = CreateMutex(0,1,"Project1");
if(GetLastError() == 183)
{
MessageBox(0,"已经运行了系统!","提醒",MB_OK);
exit(-1);
}

Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
ReleaseMutex(OnlyRunOnce);
return 0;
}
aliker 2003-12-14
  • 打赏
  • 举报
回复
用互斥
freshman2003 2003-12-14
  • 打赏
  • 举报
回复
FAQ可不是做着玩的。
constantine 2003-12-14
  • 打赏
  • 举报
回复
我一般用互斥,跟楼上几位都差不多。
sprewellkobe 2003-12-14
  • 打赏
  • 举报
回复
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HANDLE mutex; //创建内核互斥体
try
{
const char mutexname[]="MyTestOne";
mutex=OpenMutex(0,false,mutexname);
if(mutex==NULL)
{
mutex=CreateMutex(NULL,true,mutexname);
}
else
{
ShowMessage("已经存在着运行的本程序!");
return 0; //防止程序重复加载
}
//初始化
Application->Initialize();
Application->Title = "TestOne";
Application->CreateForm(__classid(TShowForm), &ShowForm);
Application->Run();
//初始消息循环
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
叶子哟 2003-12-14
  • 打赏
  • 举报
回复
上www.chinabcb.com上搜搜吧,在以前的faq里也有不少的解决方案,互斥量,共享内存,注册表,等多种方式

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧