VC++中實現程式互斥執行 (轉)

gugu99發表於2008-05-24
VC++中實現程式互斥執行 (轉)[@more@]

  VC++中實現互斥執行

在的開發過程中,有時需要控制一些程式不能同時執行,也就是多個程式間互斥執行(還包括禁止同一程式執行多個例項)。針對這一問題,我們在Visual C++ 6.0中利用對映實現了多個程式間的互斥執行。

  在講述具體的方法之前,讓我們先來看看和記憶體對映檔案操作有關的幾個重要的:

  1)CreateFileMap函式為指定的檔案建立一個檔案對映,該函式的原型如下:

  HANDLE CreateFileMapping(

   HANDLE hFile, // 用於對映的檔案控制程式碼

   LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // 記憶體對映檔案的描述符

   D flProtect, // 檔案的保護方式

   DWORD dwMaximumSizeHigh,

  // 檔案對映物件的最大長度的高32位

   DWORD dwMaximumSizeLow,

  // 最大長度的低32位

   LPCTSTR lpName      

  // 指定這個記憶體對映檔案的名字

  );

  2)MapViewOfFile函式將檔案的檢視對映到一個程式的地址空間上,返回LPVOID型別的記憶體指標,透過它,就可以直接訪問檔案檢視中的資訊:

  LPVOID MapViewOfFile(

   HANDLE hFileMappingObjct,    

    // 對映檔案物件控制程式碼

   DWORD dwDesiredAccess, // 訪問

   DWORD dwFileOffsetHigh,      

  // 檔案偏移地址的高32位

   DWORD dwFileOffsetLow,      

  // 檔案偏移地址的低32位

   DWORD dwNumberOfBytesToMap  

  // 對映檢視的大小

  );

  在Visual C++ 6.0中我們用預設方式生成基於對話方塊的應用程式,在程式的初始化階段,在CwinApp派生類的InitInstance函式的開始處,新增以下程式碼:

  { HANDLE hMap=CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,

PAGE—READWRITE, 0, 128, ″MutexRunning″);

  if(hMap==NULL) // 如果建立失敗

{ AfxMessageBox(″建立用於互斥執行的記憶體對映檔案物件失敗!″,

MB—OK|MB—ICONSTOP);

return FALSE; }

else if(GetLastError()==ERROR—ALREADY—EXISTS)

{ LPVOID lpMem=MapViewOfFile(hMap, FILE_MAP—WRITE, 0,0,0);

CString str=(char?)lpMem;

UnmapViewOfFile(lpMem);

CloseHandle(hMap);

AfxMessageBox(str, MB—OK|MB—ICONSTOP);

return FALSE; }

else

{ LPVOID lpMem=MapViewOfFile(hMap, FILE—MAP—WRITE, 0,0,0);

strcpy((char?)lpMem, ″xxx程式正在執行!″);

UnmapViewOfFile(lpMem);

}

AfxEnableControlContainer();

  ......

  這裡可以在InitInstance函式最後returnFALSE之前

   CloseHandle(hMap);

  關閉記憶體對映檔案物件控制程式碼

return FALSE;

  }

  以上的程式在Visual C++ 6.0中已透過。
 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1004499/,如需轉載,請註明出處,否則將追究法律責任。

相關文章