如何防止程序被重复打开

s__zg 2011-06-07 09:29:32
我是初学者,只学过C语言。
现在要解决这个问题——防止程序被重复打开。
以前的方法是利用CAPTION解决这个问题的,但是caption要变动就失效了。有没有什么解决办法啊?
这是以前的方法:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{

try
{
Application->Initialize(); //防止程序被重复打开
HANDLE hMutex = CreateMutex(NULL, TRUE, sInstruName.c_str() );
if(NULL == hMutex)
{
MessageBox(NULL, "创建Mutex失败!",Application->Title.c_str(), MB_OK | MB_SYSTEMMODAL);
return 0;
}
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
HWND hForm = FindWindow("TMainForm", sInstruName.c_str() );
SetForegroundWindow(hForm);
ReleaseMutex(hMutex);
return 0;
}

这个方法我也不是太懂,请求高手帮忙对这段程序进行讲解一下。另求其他好方法解决,谢谢大家了!
...全文
279 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
s__zg 2011-06-13
  • 打赏
  • 举报
回复
请问程序中"ReadCard_Demo_Flag”是窗体的caption吗?这个与程序中的 Application->Title = "读卡系统"作用有什么联系?
另外 catch 和try的用法我不太清楚,你可以帮解释下你程序中的这段是怎么一回事吗?

[Quote=引用 5 楼 rouqing 的回复:]
C/C++ code
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
//----------------------------------------------------------------------……
[/Quote]
纯冰糖 2011-06-08
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("frmMain_Unit.cpp", frmMain);
USEFORM("uDataModule.cpp", dm); /* TDataModule: File Type */
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
HWND hWnd=CreateMutex(NULL,true,"ReadCard_Demo_Flag");//随便写的字符串
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
if(hWnd)
{
Application->MessageBox("程序正在运行中!","提示",
MB_OK+MB_ICONINFORMATION+MB_APPLMODAL);
ReleaseMutex(hWnd);
}
return 0;
}

Application->Initialize();
Application->Title = "读卡系统";
Application->CreateForm(__classid(TfrmMain), &frmMain);
Application->CreateForm(__classid(Tdm), &dm);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------


CppFile 2011-06-07
  • 打赏
  • 举报
回复

sInstruName="hellohello";
HANDLE hMutex = CreateMutex(NULL, TRUE, sInstruName.c_str() );


你再调试看看有没有效果?
s__zg 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cppfile 的回复:]
HANDLE hMutex = CreateMutex(NULL, TRUE, sInstruName.c_str() );

你怕caption变动,就手动赋予一个常量啊
[/Quote]


不是太懂……请问sInstruName.c_str() 是不是就是将我的caption信息提取出来啊!这段程序是别人写的……

你说的方法具体怎么实现呢?

初学者,不好意思啊!

同时能否给些学习的建议啊?
CppFile 2011-06-07
  • 打赏
  • 举报
回复
HANDLE hMutex = CreateMutex(NULL, TRUE, sInstruName.c_str() );

你怕caption变动,就手动赋予一个常量啊

CsharpGame 2011-06-07
  • 打赏
  • 举报
回复
先创建一个原子对象,如果已经存在该对象,则说明程序已经在运行,则限制程序重复运行。

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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