社区
C++ Builder
帖子详情
一个老问题,如何防止程序重复运行?(工作在托盘区的程序,findwindow好像找不到)
qrwulysses
2003-12-14 11:47:02
问题同上,程序是在托盘区中的,通过窗体名好像找不到,谢谢了
...全文
98
9
打赏
收藏
一个老问题,如何防止程序重复运行?(工作在托盘区的程序,findwindow好像找不到)
问题同上,程序是在托盘区中的,通过窗体名好像找不到,谢谢了
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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里也有不少的解决方案,互斥量,共享内存,注册表,等多种方式
如何优化VB
程序
如何去优化你的VB
程序
帮助 1、如何去优化你的VB
程序
Visual Basic 作为一种高级编程语言,它也有着不可避免的缺点---开发出的应用
程序
运行
速度慢。如果我们能够
程序
做一些优化,那么情况将会大大改善。要优化
程序
...
获取系统
托盘
图标信息的尝试
尝试在资源管理器初始化时注入例程,过滤 Shell_TrayWnd 窗口的 WM_COPYDATA 消息,因为任何通过 SHAppBarMessage, Shell_NotifyIcon, SHEnableServiceObject 和 SHLoadInProc 封装的内部实现都是向 Shell_TrayWnd ...
杀毒软件开发,原理、设计、编程实战
在很多人思维中,特别是IT从业者、
程序
员看来,杀毒软件及其开发技术历来是
一个
颇为神秘不可及的领域。在市面上和网络中的各种文章、书集中,也鲜有涉及此方面的开发资料。正因如此,使的杀毒软件业成了
一个
稀缺、高...
VS2015之博大精深的MFC项目开发(二)
其实消息映射机制我们现在也都知道了,就是在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间,将
一个
ID、
一个
消息(COMMAND、SIZE、CLOSE)与
一个
函数关联;或者将
一个
消息(ON_WM_PAINT)与
一个
固定的函数相关联,比如...
delphi控件使用
,与若干单独的checkbox比较优势在于可以统一编程,不在需要对每
一个
checkbox单独去编写
程序
! 5. Additional页的橡皮筋控件Spliter 作用是分割窗体,是一自动行为控件,无需任何时间代码。 使用过程为...
C++ Builder
13,826
社区成员
102,678
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章