• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 505  文章 - 1034  trackbacks - 0
            <2009年7月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678


            子曾經曰過:編程無他,唯手熟爾!

            常用鏈接

            留言簿(94)

            隨筆分類(649)

            隨筆檔案(505)

            相冊

            BCB

            Crytek

            • crymod
            • Crytek's Offical Modding Portal

            Game Industry

            OGRE

            other

            Programmers

            Qt

            WOW Stuff

            搜索

            •  

            積分與排名

            • 積分 - 914431
            • 排名 - 14

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            original address

            ccrun(老妖)提供的

            一、通過創建互斥量來判斷:
            WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
            {
                try
                {
                    Application->Initialize();
                    HANDLE hMutex = CreateMutex(NULL, TRUE, "MyAppMutex");
                    if(NULL == hMutex)
                    {
                          MessageBox(NULL, "創建Mutex失敗!",
                                  Application->Title.c_str(), MB_OK | MB_SYSTEMMODAL);
                          return 0;
                    }
                    if(GetLastError() == ERROR_ALREADY_EXISTS)
                    {
                        ::MessageBox(NULL, "已經運行了一個實例!",
                                Application->Title.c_str(), MB_OK | MB_SYSTEMMODAL);
                        ReleaseMutex(hnd);
                        return 0;
                    }
                    Application->CreateForm(__classid(TForm1), &Form1);
                    Application->Run();
                }
                catch (Exception &exception)
                {
                    Application->ShowException(&exception);
                }
                return 0;
            }
            二、用系統原子
            WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
            {
                const char *Atom = "SingleApp";
                try
                {
                     if (GlobalFindAtom(Atom) != 0) // 在系統原子表中找原子
                     {
                         ::MessageBox(NULL, "已經運行了一個實例!",
                             Application->Title.c_str(), MB_OK | MB_SYSTEMMODAL);
                         return 0;
                     }
                     GlobalAddAtom(Atom); // 增加原子
                     Application->Initialize();
                     Application->CreateForm(__classid(TForm1), &Form1);
                     Application->Run();
                }
                catch (Exception &exception)
                {
                     Application->ShowException(&exception);
                }
                GlobalDeleteAtom(GlobalFindAtom(Atom)); // 刪除原子
                return 0;
            }
            三、通過FindWindow函數來判斷:
            WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
            {
                try
                {
                    HWND hForm = FindWindow("TForm1", "Form1");
                    if(NULL != hForm)
                    {
                        ::MessageBox(NULL, "已經運行了一個實例!",
                                Application->Title.c_str(), MB_OK | MB_SYSTEMMODAL);
                        return 0;
                    }
                    Application->Initialize();
                    Application->CreateForm(__classid(TForm1), &Form1);
                    Application->Run();
                }
                catch (Exception &exception)
                {
                     Application->ShowException(&exception);
                }
                return 0;
            }
            四、通過內存映射來還原窗口:
            PHANDLE lpMainWin;
            HANDLE hMap;
            bool bExist;

            WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
            {
                hMap = CreateFileMapping(
                    (HANDLE)0xFFFFFFFF, // 要映射的文件名,使用0xFFFFFFFF是說明不使用真實文件,而是在頁面文件上創建內存
                    NULL, // 安全屬性
                    PAGE_READWRITE, // 訪問權限,讀寫都要
                    0, // 最大內存的高位
                    4, // 最大內存的低位,最大內存有4字節就夠了,只需要放一個窗體的句柄
                    "MyProjectFlag" // 映射名字,這個應該是本程序獨有的,和其他程序不沖突,由調用者傳進來
                    );
                bExist = GetLastError() == ERROR_ALREADY_EXISTS;
                // 創建一個文件映射的訪問
                lpMainWin = (PHANDLE)MapViewOfFile(
                    hMap, // 文件映射的句柄
                    FILE_MAP_ALL_ACCESS, // 訪問權限,讀寫都要,這個要和文件映射的權限兼容
                    0, // 偏移量的高位
                    0, // 偏移量的低位
                    4 // 要映射的字節數
                    );
                if(lpMainWin == NULL)
                    bExist = false;
                if(bExist)
                {
                    if(!IsWindowVisible(*lpMainWin))
                        // 如果最小化狀態就將窗體恢復
                        PostMessage(*lpMainWin, WM_SYSCOMMAND, SC_RESTORE, 0);
                    // 窗體置前
                    SetForegroundWindow(*lpMainWin);
                    BringWindowToTop(*lpMainWin);
                    UnmapViewOfFile(lpMainWin);
                    return 0;
                }

                try
                {
                     Application->Initialize();
                     Application->CreateForm(__classid(TForm1), &Form1);
                     *lpMainWin = Application->MainForm->Handle;
                     Application->Run();
                }
                catch (Exception &exception)
                {
                     Application->ShowException(&exception);
                }
                catch (...)
                {
                     try
                     {
                         throw Exception("");
                     }
                     catch (Exception &exception)
                     {
                         Application->ShowException(&exception);
                     }
                }
                // 關閉映射的訪問
                UnmapViewOfFile(lpMainWin);
                return 0;
            }



            posted on 2008-01-31 15:13 七星重劍 閱讀(743) 評論(2)  編輯 收藏 引用 所屬分類: PL--c/c++IDE -- c++ builder

            FeedBack:
            # re: 啟動唯一實例 2008-08-12 16:20 shell
            還有一種方法,通過配置共享存儲區域,具體看 windows核心編程  回復  更多評論
              
            # re: 啟動唯一實例 2008-08-19 16:03 七星重劍
            @shell
            謝謝提醒,以后用到的時候詳細看看  回復  更多評論
              
            日韩精品久久无码人妻中文字幕 | 久久丫精品国产亚洲av不卡 | 久久久久久曰本AV免费免费| 亚洲一区精品伊人久久伊人 | 久久国产一片免费观看| 欧美日韩精品久久久免费观看| 亚洲人成电影网站久久| 漂亮人妻被黑人久久精品| 99热都是精品久久久久久| 久久狠狠爱亚洲综合影院| 久久精品国产精品国产精品污 | 无码人妻久久一区二区三区蜜桃| 狠狠色婷婷久久综合频道日韩| 精品国产乱码久久久久久1区2区 | 青青青国产精品国产精品久久久久| 久久久久女教师免费一区| 久久久久久久久无码精品亚洲日韩| 久久天天躁狠狠躁夜夜躁2O2O| 潮喷大喷水系列无码久久精品| 中文字幕精品无码久久久久久3D日动漫 | segui久久国产精品| 亚洲午夜久久久久久久久电影网 | 久久综合亚洲色HEZYO社区| 9191精品国产免费久久| 久久久久人妻一区精品色| 亚洲综合久久夜AV | 国产精品VIDEOSSEX久久发布| 色偷偷久久一区二区三区| 一本久久综合亚洲鲁鲁五月天| 久久香蕉综合色一综合色88| 久久精品国产亚洲AV高清热| 2021最新久久久视精品爱| 久久精品无码一区二区三区日韩| 久久精品国产亚洲AV大全| 久久久久免费看成人影片| 人妻丰满AV无码久久不卡| 亚洲中文字幕无码久久精品1| 无码任你躁久久久久久| 午夜精品久久久久久影视riav| 久久亚洲电影| 久久亚洲中文字幕精品一区|