1 つのインスタンスでは、Visual C の 32 ビット アプリケーションを制限する方法

文書翻訳 文書翻訳
文書番号: 243953
メモ Microsoft Visual C 2005 では、Microsoft Visual の C++。NET 2003、および Microsoft Visual の C++。NET 2002 は両方のマネージ コードのサポートMicrosoft から提供されるモデルです。NET Framework とアンマネージ ネイティブMicrosoft Windows コード モデル。この資料の情報にのみ適用されます。Visual C のアンマネージ コードです。
すべて展開する | すべて折りたたむ

概要

アプリケーションを 1 つに制限する方法についても説明しますインスタンス。この資料でを使用するメソッドは作成時に依存しません。windows の。メソッドを使用して、アプリケーション 1 つに制限するため、Visual C で開発されたインスタンスです。これには、コンソール アプリケーションが含まれています、WinCE アプリケーション、ダイアログ ボックス ベースのアプリケーションは、アプリケーションには、グラフィカル ユーザー インターフェイスで、その他のアプリケーション。

詳細

メソッドは、この資料で使用されているものmsdn に掲載されて [WinMain を説明します。それを使用して、 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. クリックしてください。 プロジェクト、し プロジェクト名 プロパティ.

      メモ プロジェクト名 プロジェクトの名前のプレース ホルダーです。
    2. 展開 構成プロパティ、し 全般.
    3. 右側のウィンドウで選択します. 共通言語ランタイム サポート、古い構文 (または/clr:oldsyntax) で、 共通言語ランタイムのサポート プロジェクト設定。
    4. クリックしてください。 適用、し [OK].
    共通言語ランタイム サポートのコンパイラ オプションの詳細については、次のマイクロソフト開発ネットワーク (MSDN) Web サイトを参照してください。
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
  3. LimitSingleInstance.h ファイルをインクルード、エントリプログラムのポイントがあります。これは、MFC アプリケーションで使用する場合は、ファイルはどこに InitInstance() 関数は、アプリケーションが配置されます。Win32 SDKアプリケーションをですが、 WinMain() 関数があります。コンソール アプリケーションでは、それは、 main() 関数があります。
    #include "LimitSingleInstance.H"
    					
  4. グローバル インスタンスを作成する、 CLimitSingleInstance エントリ ポイント関数の前にクラスです。これで使用されている場合は、MFC アプリケーションは前に、のインスタンスを作成する、 InitInstance() 関数です。
  5. グローバルのコンス トラクターに一意の名前を渡す CLimitSingleInstance インスタンス。一意の名前を使用することをお勧めします、別この資料で使用しているアプリケーションを実行すると競合が、チェックを複製します。ほかのユーザーの一意の名前を取得する簡単な方法があります。GUIDGEN ツールを使用することです。このツールにアクセスするをクリックしてください。 開始,クリックしてください。 実行、し、入力 GUIDGEN.If何らかの理由でこのツールを必要はありません、ツール サンプルの現状します。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. エントリ ポイント関数を呼び出し、 IsAnotherInstanceRunning() メソッドのグローバル インスタンスでは、 CLimitSingleInstance クラスおよび戻り値をチェックします。この関数が 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.
    }
    						
次の手順に従うと、アプリケーションことはできません。1 つのインスタンスを同時にアクティブにしておきます。

メモ Global\ を追加しない] でターミナル サービスを実行するをしますターミナル サービスのセッションごとに 1 つのインスタンスを保証します。
   CLimitSingleInstance g_SingleInstanceObj(TEXT("{719967F0-DCC6-49b5-9C61-DE91175C3187}"));
					
"Global\"が追加されます保証のインスタンスが 1 つだけである、コンピューター上のアプリケーション。ターミナル サービスが実行されているかどうかこれは適用されますか不正解です。

関連情報

詳細については、Knowledge Base の資料を参照するのには、次の資料番号をクリックしてください。
238100WinCE の 1 つの 32 ビット MFC SDI アプリケーションを制限する方法

プロパティ

文書番号: 243953 - 最終更新日: 2011年7月22日 - リビジョン: 9.0
キーワード:?
kbhowto kbinfo kbuidesign kbmt KB243953 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:243953
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

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