วิธีการจำกัดโปรแกรมประยุกต์แบบ 32 บิตไปยังอินสแตนซ์หนึ่งใน c ++ Visual

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 243953 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
หมายเหตุMicrosoft Visual c ++ 2005, Microsoft Visual c ++NET 2003 และ Microsoft Visual c ++การสนับสนุน 2002 สุทธิทั้งสองได้รับการจัดการรหัส รูปแบบที่ให้ไว้ โดย MicrosoftNET Framework และชุดเริ่มต้นไม่มีการจัดการ รูปแบบรหัสของ Microsoft Windows ข้อมูลในบทความนี้ใช้เฉพาะกับ รูปแบบรหัส c ++ที่มองเห็น
ขยายทั้งหมด | ยุบทั้งหมด

สรุป

บทความนี้อธิบายถึงวิธีการจำกัดโปรแกรมประยุกต์หนึ่ง อินสแตนซ์ วิธีการที่ใช้ในบทความนี้ใช้ในการสร้างใด ๆ ของ windows ดังนั้น วิธีการสามารถใช้ในการจำกัดโปรแกรมประยุกต์หนึ่ง อินสแตนซ์ที่พัฒนาขึ้นใน c ++ Visual ซึ่งรวมถึงโปรแกรมประยุกต์ที่คอนโซล โปรแกรมประยุกต์ 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. คลิกโครงการแล้ว คลิกProjectNameคุณสมบัติ.

      หมายเหตุProjectNameคือตัวยึดสำหรับชื่อของโครงการ
    2. ขยายคุณสมบัติการตั้งค่าคอนฟิกแล้ว คลิกทั่วไป.
    3. ในบานหน้าต่างด้านขวา คลิกเพื่อเลือกสนับสนุนการใช้งานจริงภาษาทั่วไป ไวยากรณ์เก่า (/ clr:oldSyntax)ในการสนับสนุนการใช้งานจริงภาษาทั่วไปการตั้งค่าโครงการ
    4. คลิกนำไปใช้แล้ว คลิกตกลง.
    สำหรับข้อมูลเพิ่มเติมเกี่ยวกับทั่วไปภาษาขณะใช้งานการสนับสนุนของคอมไพเลอร์ตัว โปรดเยี่ยมชมเว็บไซต์ต่อไปนี้ของ Microsoft สำหรับนักพัฒนาเครือข่าย (MSDN):
    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.
    }
    						
    ในโปรแกรมประยุกต์ SDK Win32 คุณสามารถทำบางสิ่งบางอย่างคล้ายคลึงกันต่อไปนี้:
    #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วิธีการจำกัดโปรแกรมประยุกต์ MFC SDI 32 บิตไปยังอินสแตนซ์เดียวบน WinCE

คุณสมบัติ

หมายเลขบทความ (Article ID): 243953 - รีวิวครั้งสุดท้าย: 28 มกราคม 2554 - Revision: 3.0
ใช้กับ
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ 2002 Standard Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 4.2 Enterprise Edition
Keywords: 
kbinfo kbhowto kbuidesign kbmt KB243953 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:243953

ให้ข้อเสนอแนะ

 

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