#pragma once #ifndef _SINGLEINSTANCE_H_ #define _SINGLEINSTANCE_H_ //------------------------------------------------------------------------------------------------------- // // class CSingleInstanceMgr { public: CSingleInstanceMgr(): m_IsAppRunnning(false),m_dwIDInstance(0){} bool Start(LPTSTR lpCmdLine) { if(::DdeInitialize(&m_dwIDInstance, GetDDeCallBack(), 0, 0)){ return false; } m_hszApp = ::DdeCreateStringHandle ( m_dwIDInstance, _T("Single_Instance_App"), CP_WINANSI ); m_hszTopic = ::DdeCreateStringHandle ( m_dwIDInstance, _T("Single_Instance_Topic"), CP_WINANSI ); HCONV hConv = ::DdeConnect (m_dwIDInstance, m_hszApp, m_hszTopic,0); if(hConv) { m_IsAppRunnning = true; DWORD dwResult = 0; ::DdeClientTransaction((unsigned char*)lpCmdLine, lstrlen(lpCmdLine)+1,hConv, 0, CF_TEXT, XTYP_EXECUTE, 0, &dwResult); return false; } ::DdeNameService ( m_dwIDInstance, m_hszApp, 0, DNS_REGISTER ); return true; } virtual PFNCALLBACK GetDDeCallBack() { return CSingleInstanceMgr::DdeCallback; } bool End() { ::DdeFreeStringHandle ( m_dwIDInstance, m_hszApp ); ::DdeFreeStringHandle ( m_dwIDInstance, m_hszTopic ); if (!IsAnInstanceRunning()) { ::DdeNameService (m_dwIDInstance, m_hszApp, 0, DNS_UNREGISTER); } ::DdeUninitialize(m_dwIDInstance);m_dwIDInstance = 0; return true; } static HDDEDATA CALLBACK DdeCallback(UINT, UINT, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD) { return (HDDEDATA)0L; } bool IsAnInstanceRunning() { return m_IsAppRunnning; } DWORD GetInstanceID() { return m_dwIDInstance; } protected: bool m_IsAppRunnning; DWORD m_dwIDInstance; HSZ m_hszApp; HSZ m_hszTopic; }; //----------------------------------------------------------------------------------------------- #endif