社区
数据库及相关技术
帖子详情
用C++ Builder如何实现程序的单实例运行
BlueStorm
2003-05-28 07:32:59
一个程序在同一时间只允许有一个实例运行
...全文
70
9
打赏
收藏
用C++ Builder如何实现程序的单实例运行
一个程序在同一时间只允许有一个实例运行
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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;
}
C++
Builder
5 and
C++
Builder
6编程
实例
精解编程
实例
精解(包含
Builder
6 PDF档).7z
C++
Builder
5 and
C++
Builder
6编程
实例
精解编程
实例
精解(包含
Builder
6 PDF档)
C++
Builder
4高级编程
实例
精解
C++
Builder
4高级编程
实例
精解
C++
语言基础视频教程
C++
语言基础视频培训课程:本课与主讲者在大学开出的
程序
设计课程直接对接,准确把握知识点,注重教学视频与实践体系的结合,帮助初学者有效学习。本教程详细介绍
C++
语言中的封装、数据隐藏、继承、多态的
实现
等入门...
C++
Builder
6
程序
设计教程.PDF
《
c++
builder
6
程序
设计教程(第二版)》系统地介绍了在windows环境下利用
c++
builder
进行应用
程序
开发的方法,主要内容包括
c++
builder
常用组件的使用、mdi多文档应用
程序
设计、文件操作与文件管理、数据库应用
程序
...
C++
Builder
5高级编程
实例
精解(光盘、源代码、源码)
C++
Builder
5高级编程
实例
精解(光盘、源代码、源码)
数据库及相关技术
1,178
社区成员
18,939
社区内容
发帖
与我相关
我的任务
数据库及相关技术
C++ Builder 数据库及相关技术
复制链接
扫一扫
分享
社区描述
C++ Builder 数据库及相关技术
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章