c++builder 如何实现一个应用程序只能打开一个进程

来源:互联网 发布:淘宝客服回复质量问题 编辑:程序博客网 时间:2024/05/16 07:31
c++builder 如何实现一个应用程序只能打开一个进程
这样做有什么好处呢!主要体现管理类型中录入、修改、删除、增加等操作中,当一个用户,操作了一半,由于别的事情忘记了自己已经打开了一个进程,此时又打开一个进程,做同样的事情。这样做是不是很危险。所以对于这样的情况,为了安全期间我们要在应用程序中作如下操作,这样你的应用程序将更完备。
if(OpenMutexA(MUTEX_ALL_ACCESS,True,"Mutex")==0){
                       CreateMutexA(NULL,True,"Mutex");
                       Application->Initialize();
                       Application->CreateForm(__classid(TForm1), &Form1);
                       Application->Run();
                       CloseHandle(OpenMutexA(MUTEX_ALL_ACCESS,True,"Mutex"));
 }
上面代码的意思是,当互斥对象Mutex不存在时,将创建Mutex,否则结束。
上面代码中出现了三个陌生的数
OpenMutexA(MUTEX_ALL_ACCESS,True,"Mutex")、CreateMutexA(NULL,True,"Mutex")、CloseHandle(OpenMutexA(MUTEX_ALL_ACCESS,True,"Mutex"));
下面逐个解释:
OpenMutexA(MUTEX_ALL_ACCESS,True,"Mutex")
函数功能:为现有的一个已命名互斥体对象创建一个新句柄
函数原型: HANDLE OpenMutex(
DWORDdwDesiredAccess, // access
BOOLbInheritHandle, // inheritance option
LPCTSTRlpName // object name
);
参数:
dwDesiredAccess:
MUTEX_ALL_ACCESS 请求对互斥体的完全访问
MUTEX_MODIFY_STATE 允许使用 ReleaseMutex 函数
SYNCHRONIZE 允许互斥体对象同步使用
bInheritHandle : 如希望子进程能够继承句柄,则为TRUE
lpName :要打开对象的名字
返回值:如执行成功,返回对象的句柄;零表示失败。若想获得更多错误信息,请调用GetLastError函数。
备注:一旦不再需要,注意一定要用 CloseHandle 关闭互斥体句柄。如对象的所有句柄都已关闭,那么对象也会删除
速查:Windows NT/2000/XP:3.1以上版本;Windows 95/98/Me:95以上版本:
头文件:Windows.h ;库文件:Kernel32.lib。

DLL:Kernel32.dll.

CreateMutexA(NULL,True,"Mutex")

HANDLE CreateMutex(
 LPSECURITY_ATTRIBUTES lpMutexAttributes, 
 BOOL bInitialOwner, 
 LPCTSTR lpName 
);
参数 
lpMutexAttributes 
指向一个SECURITY_ATTRIBUTES结构的指针,这个结构决定互斥体句柄是否被子进程继承。     
bInitialOwner 
布尔类型,决定互斥体的创建者是否为拥有者 
lpName 
指向互斥体名字字符串的指针。互斥体可以有名字。 
互斥体的好处是可以在进程间共享
注解
一旦不再需要,注意必须用CloseHandle函数将互斥体句柄关闭。从属于它的所有句柄都被关闭后,就会删除对象
进程中止前,一定要释放互斥体,如不慎未采取这个措施,就会将这个互斥体标记为废弃,并自动释放所有权。共享这个互斥体的其他应用程序也许仍然能够用它,但会接收到一个废弃状态信息,指出上一个所有进程未能正常关闭。这种状况是否会造成影响取决于涉及到的具体应用程序