程序只能启动一次的问题。

lvzhu18 2012-06-06 09:10:08
我有一个程序A,用信号量控制只能启动一次,平时双击打开确实只能启动一次。

我写了一个服务程序,在服务里启动程序A,然后再双击程序A,竟然能打开第二个。

请问是什么原因?谢谢!
...全文
205 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2012-06-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

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

因为没有源码,不过9楼说的也是有可能的,如果是这样原因,那么解决办法是很简单的:


h := OpenMutex(READ_CONTROL, FALSE, pansichar('mymutex')); //注意一定要使用READ_CONTROL
if h <> 0 then
程序的另外一个示例已经打开了,直接退出
else
createMultex(...)
lvzhu18 2012-06-06
  • 打赏
  • 举报
回复
to aqtata:

A程序只能打开一次,是在A程序中做的互斥。
服务只是调用winexec或者createprocess方法启动A程序,这样也与CreateMutex的第一个参数有关吗?
一如当初 2012-06-06
  • 打赏
  • 举报
回复
问题出在CreateMutex的第一个参数上。Service的进程的Token是Service的登录帐户的,而你的客户端程序一般是运行在另一个帐户的。Mutex是有自已的访问权限的,也就是有自已的DACL,就象NTFS文件系统的权限设置一样。而你的Service的客户程序没有存取Service产生的Mutex的权限。你必须在Service的CreateMutext的第一个参数上指定这个DACL,呵呵,很麻烦的,你要生成一个指定哪些帐户能访问的DACL,不过指定一个nil DACL就可以允许Everyone访问,不过这是很不安全的。况且,Service是做为后台程序运行的,用Mutex迫使它阻塞会造成其他Service客户不能访问服务。另外,SCM对每个ControlService请求的响应时间是有要求的
lvzhu18 2012-06-06
  • 打赏
  • 举报
回复
to bdmh:
是这样吗?可结果还是一样,OpenNum返回的是0
const
NameMutex = 'Global\\SingleApp';

OpenNum := OpenMutex(MUTEX_ALL_ACCESS, False, NameMutex);


to sgzhou12345:
这个方法不行,如果只双击打开应该是没问题,不过先用服务打开,再双击还是能打开的。

感谢大家的回复!
我觉得应该是服务的问题,我用winexec和createprocess方法都试过,都不行!
山东蓝鸟贵薪 2012-06-06
  • 打赏
  • 举报
回复
Application.Title
的标题信息,可能修改成你想要“信息”
不过
CreateMutex(nil,False,'信息');
必须与上样一致的
山东蓝鸟贵薪 2012-06-06
  • 打赏
  • 举报
回复
楼主可以在工程中加入如下“红色代码”即可

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.
「已注销」 2012-06-06
  • 打赏
  • 举报
回复
无代码无真相
bdmh 2012-06-06
  • 打赏
  • 举报
回复
Global\\xxxEvent 可以保证:在创建命名时间对象时指定名字是全局的。

网摘:

2)Service中创建的Mutex无法在普通程序中打开
问题:
在一个服务程序中CreateMutex创建的互斥量无法在一般的程序中打开。
解决方案(Solution):
在创建Mutex的程序中需要为Mutex设置安全描述符。在另一个程序中OpenMutex是要为Mutex的名字加上
"Global\\"的前缀。
lvzhu18 2012-06-06
  • 打赏
  • 举报
回复
不好意思,说错了,我用的就是互斥。
A没有启动返回的是0,已经启动返回的是183,服务启动后,再双击启动返回的是5。
shuihan20e 2012-06-06
  • 打赏
  • 举报
回复
另外,信号同步能跨进程了?
shuihan20e 2012-06-06
  • 打赏
  • 举报
回复
你的信号量是几?如果是1不如直接用互斥
lvzhu18 2012-06-06
  • 打赏
  • 举报
回复
用楼上的方法解决了,谢谢
微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识。 微信小程序系统教程共有“微信小程序系统教程[初级阶段]”、“微信小程序系统教程[中级阶段]——核心技术”、“微信小程序系统教程[阶段]客服消息+微信支付+九宝电商系统”。 “微信小程序系统教程[阶段]全套课程”包含: 1.微信小程序系统教程[阶段]_客服消息 2.微信小程序系统教程[阶段]_微信支付 3.微信小程序系统教程[阶段]_九宝电商系统 学习“微信小程序系统教程[阶段]”要求有微信小程序的基础。建议先学习“微信小程序系统教程[初级阶段]”、“微信小程序系统教程[中级阶段]”,后在报名“微信小程序系统教程[阶段]”。 阶段讲解的客服消息,是针对小程序的。后台程序用接近底层的技术,没有使用三方技术。这样降低同学们学习成本。 微信支付,这部分课程很有难度,要求同学们认真听讲,有不会的技术问题可以请教老师。购买课程后请联系老师,提供单号,给你源程序。 九宝电商系统是一套十分适和学习、项目的课程。既可以系统的学习微信小程序相关知识,还可以修改后上线。 “微信小程序系统教程[中级阶段]——核心技术”重点讲解微信小程序事件、组件、API 微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识。 购买课程的同学,可赠送就九宝老师编写的《微信小程序开发宝典》。 购课请咨询qq2326321088

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧