用C++ Builder如何实现程序的单实例运行

BlueStorm 2003-05-28 07:32:59
一个程序在同一时间只允许有一个实例运行
...全文
70 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
justleon 2003-05-29
  • 打赏
  • 举报
回复
既然这样,何不写成类呢,还可以重用。Mutex的标识何不用GUID呢,不会重复还有现成的生成工具。

class TOneInstance
{
public:
TOneInstance(){
HANDLE hMutex = CreateMutex(NULL,FALSE,AppGUID);
unique = hMutex && (GetLastError() != ERROR_ALREADY_EXISTS);
}
bool IsUnique() const{return unique;}
private:
bool unique;
static AnsiString appGuid;
};

#define DECLARE_APPCUID(guid) static AnsiString TOneInstance::appGuid = guid;

在main.cpp(工程主Cpp文件)中这样写:

DECLARE_APPGUID("A669D50B-8B21-4e77-85F8-F1E5447669EE")
TOneInstance TheOne;

WINAPI WinMain()
{
if(!TheOne.IsUnique())
return;
... ...
}
BlueStorm 2003-05-29
  • 打赏
  • 举报
回复
进一步简化为:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
char AppName[32]="My Super Software No.1001";
HWND PrevWindow = FindWindow(NULL, AppName);
if (PrevWindow != 0)
{
if (IsIconic(PrevWindow))
ShowWindow(PrevWindow, SW_RESTORE);
else
BringWindowToTop(PrevWindow);
return 1;
}
Application->Title = AppName;
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
BlueStorm 2003-05-29
  • 打赏
  • 举报
回复
最后改为:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HWND PrevWindow;
char MutexName[32]="MySuperSoftware No.1001";
HANDLE Mutex=CreateMutex(NULL,true,MutexName);
int ResultCode = GetLastError();
if (ResultCode == ERROR_ALREADY_EXISTS)
{
PrevWindow = FindWindow(NULL, MutexName);
if (PrevWindow != 0)
{
if (IsIconic(PrevWindow))
ShowWindow(PrevWindow, SW_RESTORE);
else
BringWindowToTop(PrevWindow);
}
return 1;
}
Application->Title = MutexName;
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
ReleaseMutex(Mutex);
return 0;
}
dolphin2001 2003-05-28
  • 打赏
  • 举报
回复
互斥量的名称你自己可以定义的,只要可以相互区分就可以了,呵呵:)
BlueStorm 2003-05-28
  • 打赏
  • 举报
回复
谢谢各位, 我按包山大哥提供的方法已经做成功了,不过做了一点小改动:
将MutexName = "YourSoftName_"+FormatDateTime("YYYYMMDDHHMMSS",Now());
改为MutexName = "MySuperSoftware No.1001";
castle 2003-05-28
  • 打赏
  • 举报
回复
也给你点思路:

第1种:启动时通过FindWindow函数获得你的应用程序的窗口句柄,
如找到,退出本次运行,找不到再启动。

最简单的,启动时打开一个配置文件,第二次启动打不开就能判断出
已有该系统的例程再运行,然后就好处理了吧

别的方法多的是,查查资料吧
sprewellkobe 2003-05-28
  • 打赏
  • 举报
回复
楼上说的好对!
dolphin2001 2003-05-28
  • 打赏
  • 举报
回复
哦,SORRY,少了一句:

int ResultCode=GetLastError();
dolphin2001 2003-05-28
  • 打赏
  • 举报
回复
创建系统全局互斥量

在你工程CPP文件中,按下面定义:
WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR, int)
{
AnsiString MutexName;

MutexName = "YourSoftName_"+FormatDateTime("YYYYMMDDHHMMSS",Now());

HANDLE Mutex = CreateMutex(NULL,true,MutexName.c_str());

if (ResultCode==ERROR_ALREADY_EXISTS)
{
Application->MessageBox("此软件已经运行!",
"错误", MB_OK );
return 1;
}

try
{
Application->Initialize();
Application->CreateForm(__classid(TMainForm), &MainForm);
Application->Run();
delete FlashForm;

}
catch (Exception &exception)
{
}
ReleaseMutex( Mutex );
return 0;
}

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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