首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

程序只能启动一次的有关问题

2012-06-07 
程序只能启动一次的问题。我有一个程序A,用信号量控制只能启动一次,平时双击打开确实只能启动一次。我写了一

程序只能启动一次的问题。
我有一个程序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请求的响应时间是有要求的
[解决办法]

探讨

问题出在CreateMutex的第一个参数上。Service的进程的Token是Service的登录帐户的,而你的客户端程序一般是运行在另一个帐户的。Mutex是有自已的访问权限的,也就是有自已的DACL,就象NTFS文件系统的权限设置一样。而你的Service的客户程序没有存取Service产生的Mutex的权限。你必须在Service的CreateMutext的第一个参数上指定这个DACL,……

热点排行