• <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
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567


            子曾經(jīng)曰過(guò):編程無(wú)他,唯手熟爾!

            常用鏈接

            留言簿(94)

            隨筆分類(lèi)(649)

            隨筆檔案(505)

            相冊(cè)

            BCB

            Crytek

            • crymod
            • Crytek's Offical Modding Portal

            Game Industry

            OGRE

            other

            Programmers

            Qt

            WOW Stuff

            搜索

            •  

            積分與排名

            • 積分 - 911958
            • 排名 - 14

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            original address

            ccrun(老妖)提供的

            一、通過(guò)創(chuàng)建互斥量來(lái)判斷:
            WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
            {
                try
                {
                    Application->Initialize();
                    HANDLE hMutex = CreateMutex(NULL, TRUE, "MyAppMutex");
                    if(NULL == hMutex)
                    {
                          MessageBox(NULL, "創(chuàng)建Mutex失敗!",
                                  Application->Title.c_str(), MB_OK | MB_SYSTEMMODAL);
                          return 0;
                    }
                    if(GetLastError() == ERROR_ALREADY_EXISTS)
                    {
                        ::MessageBox(NULL, "已經(jīng)運(yùn)行了一個(gè)實(shí)例!",
                                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;
            }
            二、用系統(tǒng)原子
            WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
            {
                const char *Atom = "SingleApp";
                try
                {
                     if (GlobalFindAtom(Atom) != 0) // 在系統(tǒng)原子表中找原子
                     {
                         ::MessageBox(NULL, "已經(jīng)運(yùn)行了一個(gè)實(shí)例!",
                             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;
            }
            三、通過(guò)FindWindow函數(shù)來(lái)判斷:
            WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
            {
                try
                {
                    HWND hForm = FindWindow("TForm1", "Form1");
                    if(NULL != hForm)
                    {
                        ::MessageBox(NULL, "已經(jīng)運(yùn)行了一個(gè)實(shí)例!",
                                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;
            }
            四、通過(guò)內(nèi)存映射來(lái)還原窗口:
            PHANDLE lpMainWin;
            HANDLE hMap;
            bool bExist;

            WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
            {
                hMap = CreateFileMapping(
                    (HANDLE)0xFFFFFFFF, // 要映射的文件名,使用0xFFFFFFFF是說(shuō)明不使用真實(shí)文件,而是在頁(yè)面文件上創(chuàng)建內(nèi)存
                    NULL, // 安全屬性
                    PAGE_READWRITE, // 訪(fǎng)問(wèn)權(quán)限,讀寫(xiě)都要
                    0, // 最大內(nèi)存的高位
                    4, // 最大內(nèi)存的低位,最大內(nèi)存有4字節(jié)就夠了,只需要放一個(gè)窗體的句柄
                    "MyProjectFlag" // 映射名字,這個(gè)應(yīng)該是本程序獨(dú)有的,和其他程序不沖突,由調(diào)用者傳進(jìn)來(lái)
                    );
                bExist = GetLastError() == ERROR_ALREADY_EXISTS;
                // 創(chuàng)建一個(gè)文件映射的訪(fǎng)問(wèn)
                lpMainWin = (PHANDLE)MapViewOfFile(
                    hMap, // 文件映射的句柄
                    FILE_MAP_ALL_ACCESS, // 訪(fǎng)問(wèn)權(quán)限,讀寫(xiě)都要,這個(gè)要和文件映射的權(quán)限兼容
                    0, // 偏移量的高位
                    0, // 偏移量的低位
                    4 // 要映射的字節(jié)數(shù)
                    );
                if(lpMainWin == NULL)
                    bExist = false;
                if(bExist)
                {
                    if(!IsWindowVisible(*lpMainWin))
                        // 如果最小化狀態(tài)就將窗體恢復(fù)
                        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);
                     }
                }
                // 關(guān)閉映射的訪(fǎng)問(wèn)
                UnmapViewOfFile(lpMainWin);
                return 0;
            }



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

            FeedBack:
            # re: 啟動(dòng)唯一實(shí)例 2008-08-12 16:20 shell
            還有一種方法,通過(guò)配置共享存儲(chǔ)區(qū)域,具體看 windows核心編程  回復(fù)  更多評(píng)論
              
            # re: 啟動(dòng)唯一實(shí)例 2008-08-19 16:03 七星重劍
            @shell
            謝謝提醒,以后用到的時(shí)候詳細(xì)看看  回復(fù)  更多評(píng)論
              
            精品久久久久久久久久中文字幕 | 91精品国产高清久久久久久io| 青青热久久综合网伊人| 国产精品99精品久久免费| av色综合久久天堂av色综合在| 一本色道久久88综合日韩精品 | 伊人久久无码精品中文字幕| 国产精品日韩深夜福利久久| 久久综合久久综合九色| 久久福利青草精品资源站免费| 欧洲精品久久久av无码电影| 欧美亚洲国产精品久久| 久久人人青草97香蕉| 国产精品视频久久久| 国产精品99久久99久久久| 国内精品久久久久影院日本| 久久久噜噜噜久久中文福利| 久久精品aⅴ无码中文字字幕重口 久久精品a亚洲国产v高清不卡 | 国内精品久久久久久不卡影院| 国产成人99久久亚洲综合精品| 美女写真久久影院| 久久亚洲电影| 天天躁日日躁狠狠久久| 久久国产精品99精品国产| a级毛片无码兔费真人久久| 久久精品视屏| 久久久久久久精品妇女99| 久久国产乱子伦免费精品| 久久91亚洲人成电影网站| 国产精品日韩欧美久久综合| 亚洲精品成人久久久| 蜜臀av性久久久久蜜臀aⅴ| 国产激情久久久久影院老熟女免费| 国产精品成人久久久久久久| 久久人人爽人人爽人人片AV不| 久久久亚洲欧洲日产国码aⅴ| 久久这里只精品国产99热| 久久精品国产久精国产一老狼| 久久91精品国产91久久小草| 亚洲国产高清精品线久久 | 日韩AV毛片精品久久久|