限制程式執行例項數 (轉)

worldblog發表於2007-12-15
限制程式執行例項數 (轉)[@more@]

限制一個同時只能執行一個例項的方法一般有兩種,即使用“訊號”與FindWindow,通常第一種方法較為,而第二種方法必須知道Window的CLASS(在MFC中是很痛苦的,而且一旦CLASS NAME變了以後程式也要跟著改),否則可能就會出錯。然而這兩種方法都只能限制程式執行一次,如果要控制程式執行次數,比如3次,則使用以上的兩種方法就會很困難。前段時間寫了一個HOOK,其中用到了共享變數,在這個程式寫完後我突發奇想,不知道這個東西在EXE中是否有用?想到了那就試一試吧,一試,果然蠻爽的,居然也行,當時就想到這樣一來如果要限制一個程式同時只能執行一個例項不是很簡單,試了一下,當然毫無疑問的程式只執行了一個,程式碼如下:


1、在一個CPP中所有函式實體外加入以下幾句
#pragma data_seg("SHARDAT")
HWND ghMainWnd=NULL; //必須初始化,儲存主視窗HANDLE
#pragma data_seg()
#pragma comment(linker,"/section:SHARDAT,RWS")


2、在你的主視窗的OnCreate中對 ghMainWnd賦值
ghMainWnd = GetSafeHwnd();


3、程式執行時(如Initinstance)判斷 ghMainWnd 是否為NULL
if( ghMainWnd!=NULL && IsWindow(ghMainWnd) )
{
 SendMessage( ghMainWnd, WM_YOURMESSAGE, ...
 return ...
}


怎麼樣,比第一種方法簡單多了吧,有了以上程式碼,要限制程式執行次數就簡單了,如下:
1、在一個CPP中所有函式實體外加入以下幾句
#pragma data_seg("SHARDAT")
HWND ghMainWnd[10]={}; //儲存已執行的視窗HANDLE,沒太多用
int gRuned=0;
#pragma data_seg()
#pragma comment(linker,"/section:SHARDAT,RWS")


2、在你的主視窗的OnCreate中對 ghMainWnd賦值
if( gRuned<10 )
 ghMainWnd[gRuned] = GetSafeHwnd();
gRuned++; 


3、注意,必須在適當的時候減小 gRuned, 如在OnDestroy中等


4、程式執行時(如Initinstance)判斷 ghMainWnd 是否為NULL
if( gRuned>=MAX_RUN )
{
 SendMessage( ghMainWnd, WM_YOURMESSAGE, ...
 return ...
}
注意:在對gRuned操作時要注意同步


其中MAX_RUN可以儲存到REG或INI中,根據不同情況來設定


 


 


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

相關文章