在WIN32下,實現程序互斥運行的方法有很多種,我簡單分析以下幾種不同的實現:
一、在VC下的實現
Visual C++ 是WIN32編程最主要也是最強大的編程工具這一,引用一名話來說VC就是“只有你想不到的,沒有VC做不到的”。廢話少說,下面看看用VC是如何這個功能。
A.使用編譯器來實現(使用MFC框架):
在.cpp文件開頭加上以下幾行: #pragma data_seg("Shared")
int volatile g_lAppInstance =0;
#pragma data_seg()
我們來看一下上面的內容:
第一句 #pragma data_seg("Shared") 創建一個稱為Shared 的新節。
第二句 int volatile g_lAppInstance =0 將 g_lAppInstance 放入Shared節中。注意此時只有將g_lAppInstance初始化,編譯器才會將其放入Shared節中,否則,將放入Shared以外的節。(實際上Visual C++ 編譯器提供了一個allocate 說明符,使我們可以將數據放到任何節中。)
第三句指示編譯器Shared 節結束。 #pragma comment(linker,"/section:Shared,RWS")
這一句,我們使編譯鏈接器知道我們的Shared節具有讀,寫,共享的屬性。這是我們實現互斥運行的關鍵。這樣我們就可以在應用程序之間的多個實例之間共享g_lAppInstance 變量。
在InitInstance() 函數中加入: if(++g_lAppInstance>1)
以上代碼的作用是在程序是開始對g_lAppInstancd 加1 ,如果發現其值大於1,那麼顯示Message Box ,並返回FALSE。(注意:在MFC中如果InitInstance返回FALSE,程序將不會被運行!)
{
AfxMessageBox("程序已經運行!");
return FALSE;
}
B.使用命名互斥對象:
使用API函數CreateMutex來創建命名互斥對象來實現程序互斥是一個比較通用的方法,我們可以在IninInstance()函數加入如下代碼: HANDLE hObject = CreateMutex(NULL,FALSE,"LJPXYXC");
以上的CreateMutext函數創建一個稱為“LJPXYXC”的命名的互斥對象,當程序的第二個實例運例時,調用CreateMutex 返回ERROR_ALREADY_EXISTS。我們根據這個值來實現程序的互斥運行。
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hObject);
AfxMessageBox("程序已經運行!");
return FALSE;
}
二、VB的實現
在VB實現的程序中,全局對象App.PreInstance可以實現這個功能。App.PreInstance 是一個boolean型的值。如果其值為True說明程序已有一個實例在運行,如果為False那麼,程序可以運行。
我們可以在對窗體載入事件編程,來實現這個功能,代碼如下:Private sub Form1_load()
If App.PreInstance = True then
MsgBox “程序已經運行!”
Unload me
End if
End sub
三、Delphi,C++Builder 的實現
我沒有發現Delphi 和C++Builder 的編譯器有實現像VC一樣的功能。所以我們可以調用CreateMutex來實現這個功能。
CreateMutext(),GetLastError()這兩個函數的詳細信息可以參考MSDN.
本文配套源碼