c++builder 如何实现一个应用程序只能打开一个进程
2013-05-20 16:00
861 查看
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函数将互斥体句柄关闭。从属于它的所有句柄都被关闭后,就会删除对象
进程中止前,一定要释放互斥体,如不慎未采取这个措施,就会将这个互斥体标记为废弃,并自动释放所有权。共享这个互斥体的其他应用程序也许仍然能够用它,但会接收到一个废弃状态信息,指出上一个所有进程未能正常关闭。这种状况是否会造成影响取决于涉及到的具体应用程序
这样做有什么好处呢!主要体现管理类型中录入、修改、删除、增加等操作中,当一个用户,操作了一半,由于别的事情忘记了自己已经打开了一个进程,此时又打开一个进程,做同样的事情。这样做是不是很危险。所以对于这样的情况,为了安全期间我们要在应用程序中作如下操作,这样你的应用程序将更完备。
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")
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCTSTR lpName
);
参数
lpMutexAttributes
指向一个SECURITY_ATTRIBUTES结构的指针,这个结构决定互斥体句柄是否被子进程继承。
bInitialOwner
布尔类型,决定互斥体的创建者是否为拥有者
lpName
指向互斥体名字字符串的指针。互斥体可以有名字。
互斥体的好处是可以在进程间共享
注解
一旦不再需要,注意必须用CloseHandle函数将互斥体句柄关闭。从属于它的所有句柄都被关闭后,就会删除对象
进程中止前,一定要释放互斥体,如不慎未采取这个措施,就会将这个互斥体标记为废弃,并自动释放所有权。共享这个互斥体的其他应用程序也许仍然能够用它,但会接收到一个废弃状态信息,指出上一个所有进程未能正常关闭。这种状况是否会造成影响取决于涉及到的具体应用程序
相关文章推荐
- 实现一个应用程序只能打开一个进程
- 实现设备只能被一个进程打开
- 如何打开一个程序或创建一个进程 (适用与执行CMD命令)
- linux下如何自动检测并重新启动一个死掉的进程(shell脚本实现)
- 如何实现从WinForm中打开一个需要身份验证的Web系统?
- 使用逻辑数据库PCH的时候,如何实现一次只能选择一个OBJID的效果?
- C#如何让同一个窗口只能打开一次和一个程序只能同时打开一个
- 如何在一个应用程序中打开其他的应用程序
- 如何实现多进程写一个文件
- 如何在一个程序中打开另一个应用程序
- 如何解决每当打开一个m文件时,matlab应用程序随之打开
- 使用angular如何实现让checkbox单选,但只能选中一个
- 2.如何让一个项目的用户目前只能是姓名登录,优化为增加一个字段为姓名和用户名同时都可以实现登录 ,并且用户名不能使中文?
- C#实现让程序只能打开一个实例(总结3方法)(转)
- 如何防止一个MDI应用程序在启动时打开一个新(空)文档?(新)
- Android应用程序四大组件之使用AIDL如何实现跨进程调用Service
- 一个单文档应用程序,怎样实现“打开时,弹出一个对话框,而不是单文档”
- Android 编程日记 如何通过包名打开一个应用程序
- android:如果手机安装了app则打开一个activity,如果没有安装则去到android market如何在HTML页面实现
- C#如何让同一个窗口只能打开一次和一个程序只能同时打开一个