如何限制 Visual C++ 中的一個執行個體的 32 位元應用程式

文章翻譯 文章翻譯
文章編號: 243953 - 檢視此文章適用的產品。
附註Microsoft Visual C++ 2005年]、 [Microsoft Visual C++.NET 2003,] 及 [Microsoft Visual C++.NET 2002年支援 Managed 程式碼模型所提供的 Microsoft.NET Framework 和不受管理的原生 Microsoft Windows 程式碼模型。本文資訊僅適用於不受管理的 Visual C++ 程式碼。
全部展開 | 全部摺疊

結論

本文將告訴您如何限制某個執行個體應用程式。在這份文件中使用的方法不依賴任何建立的視窗。因此,方法可以用來限制開發 Visual C++ 中的一個執行個體應用程式中。這包括主控台應用程式、 WinCE 應用程式、 對話方塊架構] 方塊中應用程式、 沒有圖形化使用者介面的應用程式和其他應用程式。

其他相關資訊

在這份文件中使用的方法就是所描述的 MSDN WinMain 主題下。若要建立可跨處理序存回的具名的 Mutex 使用 CreateMutex 函數。而非複製相同的程式碼,對每個您將會作為單一的執行個體的應用程式,程式碼,您必須處於您可以在每個應用程式之間重複使用的 C + + 包裝函式類別。

若要將這項功能,請依照下列步驟執行:
  1. 建立新的標頭檔名稱 LimitSingleInstance.h,然後將它加入至您的專案。
  2. 將下列程式碼複製到 LimitSingleInstance.h] 檔案,然後將檔案儲存:
    #ifndef LimitSingleInstance_H
    #define LimitSingleInstance_H
    
    #include <windows.h> 
    
    //This code is from Q243953 in case you lose the article and wonder
    //where this code came from.
    class CLimitSingleInstance
    {
    protected:
      DWORD  m_dwLastError;
      HANDLE m_hMutex;
    
    public:
      CLimitSingleInstance(TCHAR *strMutexName)
      {
        //Make sure that you use a name that is unique for this application otherwise
        //two apps may think they are the same if they are using same name for
        //3rd parm to CreateMutex
        m_hMutex = CreateMutex(NULL, FALSE, strMutexName); //do early
        m_dwLastError = GetLastError(); //save for use later...
      }
       
      ~CLimitSingleInstance() 
      {
        if (m_hMutex)  //Do not forget to close handles.
        {
           CloseHandle(m_hMutex); //Do as late as possible.
           m_hMutex = NULL; //Good habit to be in.
        }
      }
    
      BOOL IsAnotherInstanceRunning() 
      {
        return (ERROR_ALREADY_EXISTS == m_dwLastError);
      }
    };
    #endif
    					
    Visual C++ 2005年中的 附註,您必須加入通用語言執行階段支援編譯器選項 (/ clr:oldSyntax) 來順利編譯先前的程式碼範例。 若要加入通用語言執行階段支援編譯器選項請依照下列步驟執行:
    1. 按一下 [專案],然後再按一下 [ProjectName 內容

      附註ProjectName 是預留位置專案的名稱。
    2. 展開 [組態屬性,] 然後按一下 [一般
    3. 在右窗格中按一下以選取 通用語言執行階段支援、 舊語法 (/ clr:oldSyntax)支援的通用語言執行階段 中的專案設定。
    4. 按一下 [套用],然後再按一下 [確定]
    如需有關常見的語言執行階段支援編譯器選項的詳細資訊,請造訪下列 Microsoft 開發 o 人 h 員 ? 工 u 具 ? 網路 (MSDN) 網站]:
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
  3. # include LimitSingleInstance.h 檔案程式的進入點的位置。如果這是第在 MFC 應用程式中使用則 InitInstance() 函式應用程式的所在位置的檔案。在 Win32 SDK 中應用程式,是 WinMain() 函式所在的位置。在主控台應用程式很 main () 函式所在的位置
    #include "LimitSingleInstance.H"
    					
  4. 建立進入點函式之前 CLimitSingleInstance 類別的全域執行個體。如果正在使用 MFC 應用程式中,建立 InitInstance() 函式之前執行個體。
  5. 將唯一的名稱傳遞至全域 CLimitSingleInstance 執行個體的建構函式。建議您使用唯一的名稱,以便進行重複檢查時,不會衝突可能正在使用這份文件的其他應用程式。取得唯一的名稱,且沒有其他人將會有簡單的方法是使用 GUIDGEN 工具。存取工具]、 按一下 [開始]、 按一下 [執行],],然後鍵入 GUIDGEN。如果基於某些原因您不具有工具,提供工具是在 MSDN 的範例。類型 GUIDGEN MSDN 索引中找出它。請確定您使用 [登錄格式 選項中 [GUIDGEN 工具
    #include "LimitSingleInstance.H"
    
    // The one and only CLimitSingleInstance object.
    // Change what is passed to constructor. GUIDGEN Tool may be of help.
    CLimitSingleInstance g_SingleInstanceObj(TEXT("Global\\{719967F0-DCC6-49b5-9C61-DE91175C3187}"));
    					
  6. 在您的項目指向函式、 CLimitSingleInstance 類別的全域執行個體上呼叫 IsAnotherInstanceRunning() 方法,並檢查傳回的值]。如果函式傳回 TRUE,從進入點函式傳回。否則,繼續照常執行。

    在 MFC 應用程式可以執行類似下列:
    #include "LimitSingleInstance.H"
    
    // The one and only CLimitSingleInstance object.
    CLimitSingleInstance g_SingleInstanceObj(TEXT("Global\\{05CA3573-B449-4e0b-83F5-7FD612E378E9}"));
    
    BOOL CSingleInstDlg5App::InitInstance()
    {
        if (g_SingleInstanceObj.IsAnotherInstanceRunning())
           return FALSE; 
    
    //Rest of code.
    }
    						
    在一個主控台應用程式,您可以執行類似下列:
    #include "LimitSingleInstance.H"
    
    // The one and only CLimitSingleInstance object.
    CLimitSingleInstance g_SingleInstanceObj(TEXT("Global\\{9DA0BEED-7248-450a-B27C-C0409BDC377D}"));
    
    int main(int argc, char* argv[])
    {
        if (g_SingleInstanceObj.IsAnotherInstanceRunning())
           return 0;
    //Rest of code.
    }
    						
    應用在 Win32 SDK 程式,您可以類似,執行下列動作:
    #include "LimitSingleInstance.H"
    
    // The one and only CLimitSingleInstance object.
    CLimitSingleInstance g_SingleInstanceObj(TEXT("Global\\{2194ABA1-BFFA-4e6b-8C26-D191BB16F9E6}"));
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int cmdShow)
    {
        if (g_SingleInstanceObj.IsAnotherInstanceRunning())
           return FALSE; 
    //Rest of code.
    }
    						
之後這些步驟執行應用程式將不允許在同一時間保持作用中的多個執行個體。

附註當終端機服務下執行,不新增 Global\ 會保證每個 「 終端機服務工作階段的一個執行個體。
   CLimitSingleInstance g_SingleInstanceObj(TEXT("{719967F0-DCC6-49b5-9C61-DE91175C3187}"));
					
新增 Global\ 」 會保證是只有一個電腦上應用程式的執行個體。此動作會套用是否與否,正在執行終端機服務。

?考

如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
238100如何限制 WinCE 上的單一執行個體的 32 位元 MFC SDI 應用程式

屬性

文章編號: 243953 - 上次校閱: 2006年1月9日 - 版次: 7.0
這篇文章中的資訊適用於:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 4.2 Professional Edition
  • Microsoft Visual C++ 4.2 Enterprise Edition
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 4.0 Standard Edition
關鍵字:?
kbmt kbinfo kbhowto kbuidesign KB243953 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:243953
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com