32 Bitlik uygulamalar için Visual C++ bir örneğinde sınırlama

Makale çevirileri Makale çevirileri
Makale numarası: 243953 - Bu makalenin geçerli olduğu ürünleri görün.
Not Microsoft Visual C++ 2005, Visual C++ .NET 2003 ve Microsoft Visual C++ .NET 2002, Microsoft .NET Framework tarafından sağlanan bir yönetilen kod model hem de yerel Microsoft Windows kod modeli yönetilmeyen destekler. Bu makaledeki bilgiler yalnızca yönetilmeyen Visual C++ kod uygulanır.
Hepsini aç | Hepsini kapa

Özet

Bu makalede, bir uygulamayı nasıl anlatılır. Bu makalede kullanılan yöntemi tüm pencereler oluşturmaya dayanır. Bu nedenle, yöntem, Visual C++ ile geliştirilen bir örneği için bir uygulama sınırlandırmak için kullanılabilir. Bu, konsol uygulamaları WinCE uygulamalar, iletişim kutusunu dayalı uygulamalar, uygulamalar bir grafik kullanıcı arabirimi olmadan ve diğer uygulamaları da içerir.

Daha fazla bilgi

Bu makalede kullanılan WinMain konusu altında MSDN'de anlatılan bir yöntemdir. CreateMutex işlevi işlemleri denetlenebilir adlandırılmış bir mutex oluşturmak için kullanır. Tek bir örneği olarak kullanacak her uygulama için aynı kodu çoğaltma yerine, kod her uygulama için yeniden kullanabileceğiniz bir C++ sarmalayıcı sınıf birimindedir.

Bu işlevi kullanmak için <a0></a0>, aşağıdaki adımları izleyin:
  1. Adlı yeni bir üstbilgi dosyası oluşturmak, LimitSingleInstance.h ve projenize ekleyin.
  2. Aşağıdaki kod LimitSingleInstance.h dosyayı kopyalayın ve sonra dosyayı kaydedin:
    #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
    					
    Not Visual C++ 2005, ortak dil çalışma zamanı desteğini derleyici seçeneği eklemeniz gerekir (/ clr:oldSyntax) başarıyla önceki kod örneğini derlemek için. Ortak dil çalışma zamanı desteğini derleyici seçeneği eklemek için aşağıdaki adımları izleyin:
    1. Project ' i tıklatın ve sonra ProjectName özellikler ' i tıklatın.

      NotProjectName projenin adı için bir yer tutucudur.
    2. Yapılandırma özellikleri ' ni genişletin ve sonra Genel ' i tıklatın.
    3. Sağ bölmede, seçmek için tıklatın ortak dil çalışma zamanı modülü ve Destek, eski sözdizimi (/ clr:oldSyntax)Common Language Runtime desteği proje ayarları.
    4. Uygula ' yı tıklatın ve sonra da Tamam ' ı tıklatın.
    Ortak dil çalışma zamanı desteğini derleyici seçenekleri hakkında daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitesini ziyaret edin:
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
  3. # giriş noktası programın bulunduğu LimitSingleInstance.h dosyası içerir. Bu bir MFC Uygulaması'nda kullanılabilmesi için uygulamanın InitInstance() işlevi bulunduğu dosyasıdır. Win32 SDK'sındaki uygulaması olarak WinMain() işlevi bulunur. Bir konsol uygulamasında main() işlevi bulunduğu olan.
    #include "LimitSingleInstance.H"
    					
  4. Genel bir giriş noktası işlevini önce CLimitSingleInstance sınıfın örneğini oluşturur. Bir MFC uygulamada kullanılıyor InitInstance() işlevi önce örneği oluşturun.
  5. Benzersiz bir ad için genel CLimitSingleInstance örneğinin kurucu geçirir. Yinelenen denetimi yaparken, bu makalede kullanabilecek başka bir uygulama çakışacak şekilde benzersiz bir ad kullanmanız önerilir. Hiç kimsenin olacak benzersiz bir ad almak için kolay bir yol GUIDGEN aracını kullanmaktır. Aracı erişmek için Başlat ' ı tıklatın, Çalıştır ' ı tıklatın ve sonra GUIDGEN yazın. Herhangi bir nedenle, bu araç yoksa, araç, MSDN bir örnek olarak sağlanmıştır. Dosyayı bulmak için MSDN dizin içinde GUIDGEN türü. Kayıt defteri Format seçeneği GUIDGEN kullandığınızdan emin olun aracını.
    #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. Girdinizi işlevini işaret, genel CLimitSingleInstance sınıf örneğinde IsAnotherInstanceRunning() yöntemini çağırın ve dönüş değerini denetleyin. Işlevi DOĞRU verir, giriş noktası işlevini verir. Aksi halde, normal olarak yürütülmesine devam edin.

    Bir MFC Uygulaması'nda, aşağıdakine benzer bir şey yapabilirsiniz:
    #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.
    }
    						
    gelen bir konsol uygulaması, aşağıdakine benzer bir şey yapabilirsiniz:
    #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.
    }
    						
    gelen bir Win32 SDK uygulama, benzer aşağıdakileri:
    #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.
    }
    						
Sonra aşağıdaki adımları uygulamaya birden fazla örneği aynı anda etkin kalmasına izin vermiyor.

Not Terminal Hizmetleri altında çalışırken, Global\, Terminal Hizmetleri oturumu başına bir örneği garanti ekleme değil.
   CLimitSingleInstance g_SingleInstanceObj(TEXT("{719967F0-DCC6-49b5-9C61-DE91175C3187}"));
					
"Global\" ekleme, uygulama bir bilgisayarda yalnızca bir örneği olduğunu garanti. Bu, Terminal Hizmetleri veya çalışan olup olmadığını uygulanır.

Referanslar

Daha fazla bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
23810032-Bit uygulamaları WinCE tek bir örneğinde MFC SDI sınırlama

Özellikler

Makale numarası: 243953 - Last Review: 9 Ocak 2006 Pazartesi - Gözden geçirme: 7.0
Bu makaledeki bilginin uygulandığı durum:
  • 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 Aboneliği
  • Microsoft Visual C++ 4.0 Standard Edition
Anahtar Kelimeler: 
kbmt kbinfo kbhowto kbuidesign KB243953 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:243953

Geri Bildirim Ver

 

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