一个奇怪的问题:OpenMutex不能正确找到CreatMutex创建的标志?

角落的青苔 2002-11-05 03:25:51
在我的两个exe里:
CreateMutex(Nil, true, 'T4Ser'); //另一个Exe是'S4Ser'
if GetLastError <> ERROR_ALREADY_EXISTS then //防止同时运行多个实例
然后在Dll里判断,是否存在'T4Ser'或者'S4Ser'标志
//存在
if (OpenMutex(MUTEX_ALL_ACCESS,False,PChar('T4Ser'))<>0)
or (OpenMutex(MUTEX_ALL_ACCESS,False,PChar('S4Ser'))<>0) then
//和不存在
if (OpenMutex(MUTEX_ALL_ACCESS,False,PChar('T4Ser'))=0)
and (OpenMutex(MUTEX_ALL_ACCESS,False,PChar('S4Ser'))=0) then
//下面继续~~
...全文
301 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
kamphkb 2002-11-07
  • 打赏
  • 举报
回复
我知道nt應該會在對Mutex減一,如果不調用ReleaseMutex,但個人認爲這絕對不是程序員偷懶的藉口。系統這樣做估計是爲了在程序崩潰後從新啓動仍能正常運行而做。
kamphkb 2002-11-07
  • 打赏
  • 举报
回复
我說兩句供參考。每一次OpenMutex之後都必須調用ReleaseMutex,但不必顯式調用CloseHandle(如果這是你想要的效果,正如你所說的,系統可以在你的Exe退出後自動調用CloseHandle)。但CloseHandle的操作亦不會將Mutex的計數器減一,而是申明本Exe放棄對此Mutex的控制權,幷釋放相關的資源。換個角度來説,CloseHandle和CreateMutex(,false,)對應,是相互相反的操作;OpenMutex和ReleaseMutex對應,是相互相反的操作(假設在OpenMutex之前調用了CreateMutex(,false,))。

另外,如果CreateMutex或者OpenMutex是在COM内調用,而這個COM本身是個Dll,又沒有調用CloseHandle,那麽,(我估計)CloseHandle會在宿主退出的時候被調用。而宿主在什麽時候退出,從正規的編程角度來説,並不能確定和控制。這種效果可能不是你想要的。

以上是個人意見,不一定對。 ;)
角落的青苔 2002-11-06
  • 打赏
  • 举报
回复
那我用findWindow试试看好用不了~~结贴^_^
角落的青苔 2002-11-05
  • 打赏
  • 举报
回复
啊~~~那怎么换个方法哦~~
用ini?但是我的S4Ser(学生机)是在无盘上面的,好象写文件有点问题啊~~
最好是不用操作硬盘文件的~~再想想~~~~~~~~~~~~

//火冒十几丈!!!!!汗~~~
日总是我哥 2002-11-05
  • 打赏
  • 举报
回复
CoolSlob 说:
Mutex,在不同的进程空间中是否可共用?
bewill 说:
可以
CoolSlob 说:
是否可以在不同的进程空中Release?
bewill 说:
因为他本身就是为了在进程间共享资源才设计得。
bewill 说:
所有共享得东西,都遵循一个原则,就是原子操作
bewill 说:
也就是说他必须是独占(锁)得时候才可以进行
CoolSlob 说:
但是我现在有一个这样的问题
bewill 说:
具体实现不要问我,我只是理论家
bewill 说:

CoolSlob 说:
在程序a.exe中一启动的时候创建了一个Mutex(而释放是程序退出的时候自动释放的,是吧?)当在另一个COM中做了OpenMutex操作后,当程序a.exe退出的时候就不会被Release了
bewill 说:
是得,
bewill 说:
是这样得
CoolSlob 说:
那要怎么才能继续让a.exe退出的时候Release呢?
bewill 说:
COM不是有计数器吗?
bewill 说:
无法,你应该做得是调整你得思路
bewill 说:
这是错误得想法
CoolSlob 说:
怎么个调整法?
CoolSlob 说:
查看COM的计数器?
bewill 说:
COM的计数器是自动得呀
bewill 说:
我是说你得换一中方式实现,你得思路一定不对
CoolSlob 说:
哦,好,我换~~


[注]:谢绝一切对bewill的讨论!否则我火冒十几丈!!!!!
角落的青苔 2002-11-05
  • 打赏
  • 举报
回复
是啊,不知道
OpenMutex(MUTEX_ALL_ACCESS,False,PChar('S4Ser'));
这里会不会又给我创建个'S4Ser'了呢?
ERROR_ALREADY_EXISTS是已经存在标志,那没有找到标志用什么呢?
刚才找了Msdn也没找到~~
日总是我哥 2002-11-05
  • 打赏
  • 举报
回复
有可能在DLL做OpenMutex操作时接管了Mutex!
角落的青苔 2002-11-05
  • 打赏
  • 举报
回复
是啊,但是S4Ser已经退出了的啊~~

你先注销那个dll再重启下,然后S4Ser怎么用都不会明明退出了还在报说已运行啊~~

//我还一直都用Application.MessageBox~~,我只知道说Dll里用showmessage很占空间,又学到东西了^_^
日总是我哥 2002-11-05
  • 打赏
  • 举报
回复
它报的是什么错?
是不是 Application.MessageBox('StudentServer已经在运行了!','提示信息',MB_OK);

btw: 听说Application.MessageBox比Windows.MessageBox更占空间呀~~
角落的青苔 2002-11-05
  • 打赏
  • 举报
回复
什么东东哦~~才从IDE里copy过来,怎么风格全变了哦:~~~~
角落的青苔 2002-11-05
  • 打赏
  • 举报
回复
else if iWhenBlock=2 then //退出DG后限制
begin
OpenMutex(MUTEX_ALL_ACCESS,False,PChar('T4Ser'));
if GetLastError<>0 then //教师机没运行
begin
OpenMutex(MUTEX_ALL_ACCESS,False,PChar('S4Ser'));
if GetLastError<>0 then //学生机没运行
IsBlock:=GetBlockResult(strsWebVar);
end;
end
else //在DG里才限制
begin
OpenMutex(MUTEX_ALL_ACCESS,False,PChar('T4Ser'));
if GetLastError=0 then //教师机在运行
IsBlock:=GetBlockResult(strsWebVar)
else
begin
OpenMutex(MUTEX_ALL_ACCESS,False,PChar('S4Ser'));
if GetLastError=0 then //学生机在运行
IsBlock:=GetBlockResult(strsWebVar)
end;
end;
//还是不行~~~
日总是我哥 2002-11-05
  • 打赏
  • 举报
回复
我要杀了你,怎么不让我访问CSDN了呀~~5555555~~~哭ing...
日总是我哥 2002-11-05
  • 打赏
  • 举报
回复
Debuging...
角落的青苔 2002-11-05
  • 打赏
  • 举报
回复
If the function fails, the return value is NULL. To get extended error information, call GetLastError.
但是我用NULL也不行呢~~~
to CoolSlob:我给你发了短消息~~
日总是我哥 2002-11-05
  • 打赏
  • 举报
回复
你应该知道我的Email吧~~
不说了,我好怕怕收垃圾^o^
日总是我哥 2002-11-05
  • 打赏
  • 举报
回复
here~~

为答谢你的一顿火锅:)
角落的青苔 2002-11-05
  • 打赏
  • 举报
回复
//接上
现在问题是,有时候,我的Exe明明已经退出了,可Dll仍然说T4Ser或S4Ser存在;
再次运行T4Ser或者S4Ser时也说程序已运行呢?
是不是OpenMutex会继续创建T4Ser或者S4Ser标志啊?

现在可能没说清楚,感兴趣的话留个E-mail吧,给你发完全源代码。
//功能就是IE根据设置,来决定是否过滤某些网址或者C:之类;
//网上的源代码IEHelper.dll,我改了些~~

1,181

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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