程序只能启动一次的问题。
我有一个程序A,用信号量控制只能启动一次,平时双击打开确实只能启动一次。
我写了一个服务程序,在服务里启动程序A,然后再双击程序A,竟然能打开第二个。
请问是什么原因?谢谢!
[解决办法]
你的信号量是几?如果是1不如直接用互斥
[解决办法]
Global\\xxxEvent 可以保证:在创建命名时间对象时指定名字是全局的。
网摘:
2)Service中创建的Mutex无法在普通程序中打开
问题:
在一个服务程序中CreateMutex创建的互斥量无法在一般的程序中打开。
解决方案(Solution):
在创建Mutex的程序中需要为Mutex设置安全描述符。在另一个程序中OpenMutex是要为Mutex的名字加上
"Global\\"的前缀。
[解决办法]
楼主可以在工程中加入如下“红色代码”即可
program Project1;
uses
Windows, Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
begin
Application.Initialize;
Application.Title:='我的测试程序';
CreateMutex(nil,False,'我的测试程序');
if (GetLastError()=ERROR_ALREADY_EXISTS) then
begin
Application.MessageBox(PChar('当前程序只能且只有一个实例运行'), '错误信息:', MB_ICONERROR);
exit;
end;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
[解决办法]
问题出在CreateMutex的第一个参数上。Service的进程的Token是Service的登录帐户的,而你的客户端程序一般是运行在另一个帐户的。Mutex是有自已的访问权限的,也就是有自已的DACL,就象NTFS文件系统的权限设置一样。而你的Service的客户程序没有存取Service产生的Mutex的权限。你必须在Service的CreateMutext的第一个参数上指定这个DACL,呵呵,很麻烦的,你要生成一个指定哪些帐户能访问的DACL,不过指定一个nil DACL就可以允许Everyone访问,不过这是很不安全的。况且,Service是做为后台程序运行的,用Mutex迫使它阻塞会造成其他Service客户不能访问服务。另外,SCM对每个ControlService请求的响应时间是有要求的
[解决办法]