关于《Delphi.下深入Windows核心编程》的代码的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 zhou13
  • 开始时间 开始时间
Z

zhou13

Unregistered / Unconfirmed
GUEST, unregistred user!
第一章EXE的内存共享中<br>FormCreate中调用<br>LockMap函数是用来干什么的<br>我把它注释掉以后,程序可以继续运行,那么这段函数是用来干吗的那?<br>相信很多人都看过,解释起来应该不成问题<br><br>函数内容<br>function&nbsp;LockMap:&nbsp;Boolean;<br>begin<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;true;<br>&nbsp;&nbsp;&nbsp;{创建互斥对象}<br>&nbsp;&nbsp;HMapMutex&nbsp;:=&nbsp;CreateMutex(nil,&nbsp;false,<br>&nbsp;&nbsp;&nbsp;&nbsp;pchar('MY&nbsp;MUTEX&nbsp;NAME&nbsp;GOES&nbsp;HERE'));<br>&nbsp;&nbsp;if&nbsp;HMapMutex&nbsp;=&nbsp;0&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage('不能创建互斥对象');<br>&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;false;<br>&nbsp;&nbsp;end&nbsp;else&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;WaitForSingleObject(HMapMutex,&nbsp;REQUEST_TIMEOUT)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WAIT_FAILED&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage('不能对互斥对象加锁!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;false;<br>&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;end<br>end;<br><br>CSDN上问过了,没有什么人回答正确。。。。。
 
还有,互斥是什么意思?
 
CreateMutex创建互斥对象,相当于加一个标记,下一次创建该对象时会失败,保证某段代码只执行一次。<br>也就是只有在LockMap第一次执行时返回True,再次执行LockMap的话,返回False<br><br>那些启动一次的程序都是靠互斥对象完成的。
 
BTW,内存映射的空间名字可以重复吗??
 
我现在重复运行了两个程序,调试第二个运行的程序为什么没有弹出MessageBox呢??
 
HMapMutex&nbsp;:=&nbsp;CreateMutex(nil,&nbsp;false,&nbsp;pchar('Abc'));<br>第一次执行这个后,只要不关闭这个叫Abc的&nbsp;Mutex,以后执行到这句返回的&nbsp;HMapMutex&nbsp;都是0<br>重复两次也不是0的话,只能说你某个地方写错了,你Baidu一下CreateMutex的用法就明白了,很直接的调用CreateMutex&nbsp;-&gt;&nbsp;CloseMutex,而OpenMutex基本用不到。
 
现在看起来的确的错的<br>&nbsp;&nbsp;&nbsp;if&nbsp;WaitForSingleObject(HMapMutex,&nbsp;REQUEST_TIMEOUT)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WAIT_FAILED&nbsp;then<br><br>应该是<br>&nbsp;&nbsp;&nbsp;if&nbsp;WaitForSingleObject(HMapMutex,&nbsp;REQUEST_TIMEOUT)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WAIT_TimeOut&nbsp;then<br>程序就没有问题了<br>那么一本书都会错?<br><br>BTW,内存映射的空间名字可以重复吗??
 
名字重复的话,还是打开原先创建的那个空间,除非你改变了名字的大小写。<br>翻了一下,这本书里面有CreateMutex的例子:<br>第7章&nbsp;高级应用/OnlyOne<br>var<br>&nbsp;&nbsp;hMutex:&nbsp;HWND;<br>&nbsp;&nbsp;iRet:&nbsp;integer;<br>begin<br>&nbsp;&nbsp;Application.Initialize;<br>&nbsp;&nbsp;hMutex&nbsp;:=&nbsp;CreateMutex(nil,False,PChar(FMutex));<br>&nbsp;&nbsp;iRet&nbsp;:=&nbsp;GetLastError;<br>&nbsp;&nbsp;if&nbsp;iRet&nbsp;&lt;&gt;ERROR_ALREADY_EXISTS&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;Application.CreateForm(TForm1,&nbsp;Form1);&nbsp;&nbsp;//只有不出错的时候,才创建Form1<br>&nbsp;&nbsp;Application.Run;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;ReleaseMutex(hMutex);
 
那书很不错,不过有一很小部分的代码写错了..
 
不错不错,谢谢了
 
后退
顶部