程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VC++6.0中控制運行唯一實例

VC++6.0中控制運行唯一實例

編輯:vc教程

  有的應用程序希望控制程序運行唯一的實例。比如最常用的mp3播放軟件Winamp,需要獨占音頻設備,因此只允許自身運行唯一的例程。在VC6.0++的開發實踐中,16位的Windows系統下,hPrevInstance句柄保存了應用程序上一個運行的實例,可以用來檢查是否有實例運行;在32位Windows系統下,這個值總是NULL。對於具有窗口的應用程序,可以用靜態函數CWnd::FindWindow查找具有窗口的實例,判斷程序是否已經運行,但對於無窗口的應用程序卻無能為力。實際上,通過動態連接庫DLL,可以實現更通用的控制方法,其過程如下:

  1.在MFC應用程序中加入一個MFC Extension DLL

  選擇Project|Add To Project|New...菜單對話框中的Projects標簽,點中MFC AppWizard(dll),取名為Single,其余默認。在MFC AppWizard-Step 1 of 1對話框中,選擇MFC Extension DLL(using shared MFC DLL)。通過下面的步驟實現這個DLL。

  2.實現共享數據和導出函數

  用#pragma data_seg指令實現共享數據段。在Single.cpp包含頭文件的語句後添加下列語句:

#pragma data_seg(".SharedData")
long m_nRun=-1;
#pragma data_seg( ) 

  其中,.SharedData就是我們實現的共享數據段的名稱。這個數據段只包含一個變量long m_nRun,初始值為-1。

  下面在Single.def文件中使用SECTIONS語句設置該共享數據段的屬性:

SECTIONS
.SharedData READ WRITE SHARED

  這樣就使得使用這個DLL的應用程序能以讀寫方式共享.SharedData中定義的變量。

  然後設計檢查程序已運行實例個數的函數並導出,仍然使用def文件:

EXPORTS
; Explicit exports can go here
JudgeNo @1

  所要添加的只是JudgeNo @1這一條語句,意思是JudgeNo是第一個輸出函數,如果需要,還可以添加其他函數。JudgeNo的實現是在Single.cpp中。

long JudgeNo( )
{return m_nRun;}

  這裡只是簡單的返回了m_nRun的值,因為這個函數是供應用程序調用的。同時還要在Single.cpp的入口點函數DllMain返回成功值的語句前添加語句m_nRun++,意思是在應用程序啟動連接DLL成功時對已經運行的實例進行計數。這裡需要強調的是DLL共享數據的概念,它指的是多進程調用DLL時內存中只保存數據的一個副本供它們共同擁有,因此這裡的變量m_nRun可以起到為程序所有運行的實例計數的作用。

  3.應用程序調用JudgeNo( )

  我們先在DLL中添加一個類,這樣應用程序通過包含這個類的頭文件就可以調用JudgeNo( )。選擇Insert|New Class…菜單,彈出對話框後,在Class Type中選擇Generic Class,新創建一個無任何基類的Cout類,默認的文件名是Out.h和Out.cpp,由VC++自動生成。在Out.h的類成員聲明之前加上語句long JudgeNo()即可。完成之後將Out.h拷貝到應用程序的工程目錄下。

  選擇Project|DependencIEs…菜單,將應用程序的工程設置為依賴於Single工程。在應用程序應用類的實現文件中添加#include "Out.h"。然後在InitInstance( )函數的開頭添加如下代碼:

if(JudgeNo())
{
AfxMessageBox("程序已執行!",MB_OK|MB_ICONINFORMATION);
return FALSE;
}

  編譯後將生成的Single.dll拷貝到Windows安裝目錄的System子目錄下,該目錄存放有系統所有的DLL文件。運行程序,如果是第二次運行,則會彈出對話框顯示"程序已執行!"。說明DLL實現了對程序運行實例的計數。

  本例中通過使用DLL完成了控制應用程序運行唯一實例,同時也能使初學者對DLL編程的關鍵技術有一個初步的體會。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved