Cara untuk membatasi aplikasi 32-bit untuk satu contoh in Visual C++

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 243953 - Melihat produk di mana artikel ini berlaku.
Catatan Microsoft Visual c ++ 2005, Microsoft Visual C++.NET 2003, dan Microsoft Visual C++.NET 2002 mendukung kedua kode dikelola model yang disediakan oleh Microsoft.NET Framework dan asli tidak dikelola Microsoft Windows kode model. Informasi di dalam artikel ini hanya berlaku untuk unmanaged Visual C++ kode.
Perbesar semua | Perkecil semua

RINGKASAN

Artikel ini membahas cara untuk membatasi aplikasi ke salah satu contoh. Metode yang digunakan dalam artikel ini tidak bergantung pada setiap penciptaan Windows. Oleh karena itu, metode dapat digunakan untuk membatasi aplikasi ke salah satu contoh yang dikembangkan dalam Visual C++. Ini termasuk aplikasi-aplikasi konsol, Aplikasi winCE, kotak dialog berbasis aplikasi, aplikasi tanpa antarmuka pengguna grafis, dan aplikasi lainnya.

INFORMASI LEBIH LANJUT

Metode yang digunakan dalam artikel ini adalah salah satu yang dijelaskan dalam MSDN under WinMain topik. Menggunakan CreateMutex fungsi untuk menciptakan mutex bernama yang dapat diperiksa di proses. Alih-alih duplikasi sama kode untuk setiap aplikasi yang Anda akan digunakan sebagai satu contoh, kode yang harus Anda miliki di bungkus C++ kelas yang Anda dapat menggunakan kembali di masing-masing aplikasi.

Menggunakan ini fungsionalitas, ikuti langkah berikut:
  1. Membuat file header baru dengan nama LimitSingleInstance.h, dan kemudian menambahkannya ke proyek Anda.
  2. Salin kode berikut ke berkas LimitSingleInstance.h, dan kemudian simpan berkas:
    #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
    					
    Catatan Dalam Visual C++ 2005, Anda harus menambahkan umum bahasa runtime kompiler opsi dukungan (/ clr:oldSyntax) untuk berhasil mengkompilasi kode sampel sebelumnya. Untuk menambahkan runtime bahasa umum dukungan opsi kompiler, ikuti langkah berikut:
    1. Klik Project, lalu klik ProjectName Properti.

      Catatan ProjectName adalah sebuah tempat untuk nama proyek.
    2. Memperluas Konfigurasi properti, lalu klik General.
    3. Dalam pane kanan, klik untuk memilih Common Language Runtime Support, sintaks tua (/ clr:oldSyntax) dalam Common Language Runtime dukungan Seting Proyek.
    4. Klik Menerapkan, lalu klik Oke.
    Untuk informasi lebih lanjut tentang common language runtime kompiler opsi dukungan, kunjungi Web site Microsoft Developer Network (MSDN) berikut:
    http://msdn2.Microsoft.com/en-us/library/k8d11d4s.aspx
  3. # termasuk LimitSingleInstance.h file di mana entri titik dari program ini terletak. Jika ini adalah untuk digunakan dalam aplikasi MFC ini adalah file di mana InitInstance() fungsi untuk aplikasi ini terletak. Dalam Win32 SDK aplikasi, itu adalah di mana WinMain() fungsi ini terletak. Dalam aplikasi konsol, itu adalah di mana Main() fungsi ini terletak.
    #include "LimitSingleInstance.H"
    					
  4. Membuat contoh global CLimitSingleInstance kelas sebelum fungsi titik entri. Jika ini sedang digunakan dalam MFC aplikasi, membuat contoh sebelum InitInstance() fungsi.
  5. Lewat nama yang unik untuk pembina global CLimitSingleInstance contoh. Dianjurkan bahwa Anda menggunakan nama unik jadi lain aplikasi yang mungkin menggunakan artikel ini tidak akan konflik ketika melakukan duplikat memeriksa. Cara mudah untuk mendapatkan nama yang unik yang tidak ada orang lain akan memiliki adalah dengan menggunakan alat GUIDGEN. Untuk mengakses alat, klik Mulai, Klik Menjalankan, kemudian ketik GUIDGEN. Jika untuk beberapa alasan Anda tidak memiliki alat, alat ini disediakan sebagai contoh di MSDN. Jenis GUIDGEN di MSDN indeks untuk menemukannya. Membuat yakin bahwa Anda menggunakan Format registri pilihan di GUIDGEN alat.
    #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. Dalam fungsi titik entri Anda, panggilan IsAnotherInstanceRunning() metode pada contoh global CLimitSingleInstance kelas dan memeriksa nilai kembali. Jika fungsi mengembalikan TRUE, kembali dari fungsi titik entri. Jika tidak, melanjutkan eksekusi seperti biasa.

    Dalam aplikasi MFC, Anda dapat melakukan sesuatu yang mirip dengan berikut:
    #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.
    }
    						
    Dalam aplikasi konsol, Anda dapat melakukan sesuatu yang mirip dengan berikut:
    #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.
    }
    						
    Dalam aplikasi Win32 SDK, Anda dapat melakukan sesuatu yang mirip berikut:
    #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.
    }
    						
Setelah mengikuti langkah-langkah ini, aplikasi tidak akan membiarkan lebih dari satu contoh untuk tetap aktif pada waktu yang sama.

Catatan Ketika berjalan di bawah Layanan Terminal, tidak menambahkan Global\ akan menjamin satu contoh per sesi Layanan Terminal.
   CLimitSingleInstance g_SingleInstanceObj(TEXT("{719967F0-DCC6-49b5-9C61-DE91175C3187}"));
					
Menambahkan "Global\" akan menjamin bahwa ada hanya satu contoh dari aplikasi pada komputer. Hal ini berlaku Apakah menjalankan Layanan Terminal atau tidak.

REFERENSI

Untuk informasi selengkapnya, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
238100Cara untuk membatasi aplikasi MFC SDI 32-bit untuk satu contoh pada WinCE

Properti

ID Artikel: 243953 - Kajian Terakhir: 20 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 4.2 Enterprise Edition
Kata kunci: 
kbinfo kbhowto kbuidesign kbmt KB243953 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:243953

Berikan Masukan

 

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