• <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>
            面對(duì)現(xiàn)實(shí),超越自己
            逆水行舟,不進(jìn)則退
            posts - 269,comments - 32,trackbacks - 0

            安裝程序的使用

            生成的安裝程序和卸載程序接受一些命令行的參數(shù)。這些參數(shù)可以讓用戶在安裝過(guò)程中對(duì)安裝程序作部分控制。

            公共選項(xiàng)

            • /NCRC 禁止 CRC 檢測(cè),除非在腳本里強(qiáng)制使用了 CRCCheck force
            • /S 靜默運(yùn)行安裝程序或卸載程序。更多信息請(qǐng)參看 section 4.12
            • /D 指定默認(rèn)的安裝目錄 ($INSTDIR), 可以越過(guò) InstallDirInstallDirRegKey 。這個(gè)參數(shù)必須是最后一個(gè)參數(shù)并且不能帶任何引號(hào)即使路徑帶有空格。僅支持絕對(duì)路徑。

            卸載程序特殊選項(xiàng)

            • _?= 指定 $INSTDIR。這也會(huì)阻止卸載程序把它自己復(fù)制到臨時(shí)文件夾再運(yùn)行。這將可以使用 ExecWait 來(lái)運(yùn)行卸載程序并等待它完成。這個(gè)參數(shù)必須是最后一個(gè)參數(shù)并且不能帶任何引號(hào)即使路徑帶有空格。

            例子

            1 installer.exe /NCRC
            2 installer.exe /S
            3 installer.exe /D=C:\Program Files\NSIS
            4 installer.exe /NCRC //D=C:\Program Files\NSIS
            5 uninstaller.exe /S _?=C:\Program Files\NSIS
            # 靜默卸載舊版本并等待它完成后才繼續(xù)
            1 ExecWait '"$INSTDIR\uninstaller.exe" /S _?=$INSTDIR'


            以上信息來(lái)自NSIS幫助。下面為實(shí)例代碼:

             1 !define APPLOCALPATH "Test.exe"
             2 !define APPPATH "$TEMP\${APPLOCALPATH}"
             3 
             4 OutFile "Test ${__DATE__}.exe"
             5 
             6 Section "Silent MakeNSIS"
             7         SetOutPath "$TEMP"
             8         File /r  "install\*.*"
             9         ExecWait '$TEMP\${APPLOCALPATH} /S /D=F:\Program Files\NSIS'
            10         Delete '$TEMP\${APPLOCALPATH}'
            11 SectionEnd


             

            posted @ 2012-05-25 09:30 王海光 閱讀(8717) | 評(píng)論 (0)編輯 收藏
            本文轉(zhuǎn)自:http://m.shnenglu.com/humanchao/default.html?page=2

            已知前序和中序:

            struct NODE 
            {
                NODE 
            *pLeft;
                NODE 
            *pRight;
                
            char chValue;
            };

            int  CharInStrFirstPos(char ch, char *str, int nLen)
            {
                
            char *pOrgStr = str;
                
            while (nLen > 0 && ch != *str)
                {
                    str
            ++;
                    nLen
            --;
                }
                
                
            return (nLen > 0? (str - pOrgStr) : -1;
            }

            void ReBuild_PreIn(char *pPreOrder, char *pInOrder, int nTreeLen, NODE **pRoot)
            {
                
            if (pPreOrder == NULL || pInOrder == NULL)
                {
                    
            return;
                }

                NODE 
            *pTemp = new NODE;
                pTemp
            ->chValue = *pPreOrder;
                pTemp
            ->pLeft = NULL;
                pTemp
            ->pRight = NULL;

                
            if (*pRoot == NULL)
                {
                    
            *pRoot = pTemp;
                }

                
            if (nTreeLen == 1)
                {
                    
            return;
                }

                
            int nLeftLen = CharInStrFirstPos(*pPreOrder, pInOrder, nTreeLen);
                assert(nLeftLen 
            != -1);
                
            int nRightLen = nTreeLen - nLeftLen -1;

                
            if (nLeftLen > 0)
                {
                    ReBuild_PreIn(pPreOrder 
            + 1, pInOrder, nLeftLen, &((*pRoot)->pLeft));
                }

                
            if (nRightLen > 0)
                {
                    ReBuild_PreIn(pPreOrder 
            + nLeftLen + 1, pInOrder + nLeftLen + 1,
                        nRightLen, 
            &((*pRoot)->pRight));
                }
            }

            已知后序和中序:


            void ReBuild_AftIn(char *pAftOrder, char *pInOrder, int nTreeLen, NODE **pRoot)
            {
                
            if (pAftOrder == NULL || pInOrder == NULL)
                {
                    
            return;
                }
                
                NODE 
            *pTemp = new NODE;
                pTemp
            ->chValue = *pAftOrder;
                pTemp
            ->pLeft   = NULL;
                pTemp
            ->pRight  = NULL;
                
                
            if (*pRoot == NULL)
                {
                    
            *pRoot = pTemp;
                }
                
                
            if (nTreeLen == 1)
                {
                    
            return;
                }
                
                
            int nLeftLen = CharInStrFirstPos(*pAftOrder, pInOrder, nTreeLen);
                assert(nLeftLen 
            != -1);
                
            int nRightLen = nTreeLen - nLeftLen -1;
                
                
            if (nLeftLen > 0)
                {
                    ReBuild_AftIn(pAftOrder 
            + nRightLen + 1, pInOrder, nLeftLen, &((*pRoot)->pLeft));
                }
                
                
            if (nRightLen > 0)
                {
                    ReBuild_AftIn(pAftOrder 
            + 1, pInOrder + nLeftLen + 1,
                        nRightLen, 
            &((*pRoot)->pRight));
                }
            }

            我上傳了一個(gè)工VC的工程,有興點(diǎn)此下載趣的朋友。代碼參考于《編程之美》。
            posted @ 2012-05-24 13:57 王海光 閱讀(886) | 評(píng)論 (1)編輯 收藏
            本文轉(zhuǎn)自:http://www.cnblogs.com/jillzhang/archive/2007/09/16/894936.html


            遞歸算法學(xué)習(xí)系列二(歸并排序)

                  歸并排序是利用遞歸和分而治之的技術(shù)將數(shù)據(jù)序列劃分成為越來(lái)越小的半子表,再對(duì)半子表排序,最后再用遞歸步驟將排好序的半子表合并成為越來(lái)越大的有序序列,歸并排序包括兩個(gè)步驟,分別為:

                  1)劃分子表

                  2)合并半子表 

                 首先我們來(lái)討論歸并算法,歸并算法將一系列數(shù)據(jù)放到一個(gè)向量中,索引范圍為[first,last],這個(gè)序列由兩個(gè)排好序的子表構(gòu)成,以索引終點(diǎn)(mid)為分界線,以下面一個(gè)序列為例

                7,10,19,25,12,17,21,30,48

               這樣的一個(gè)序列中,分為兩個(gè)子序列 7,10,19,25  和 12,17,21,30,48,如下圖所示:

               image 

            再使用歸并算法的時(shí)候的步驟如下:

             第一步:比較v[indexA]=7和v[indexB]=12,將較小的v[indexA]取出來(lái)放到臨時(shí)向量tempArray中,然后indexA加1

              image

             

             第二步:比較v[indexA]=10和v[indexB]=12,將較小的10放到臨時(shí)變量tempArray中,然后indexA++;

              image

            第三步:比較v[indexA]=19與v[indexB]=12,將較小的12存放到臨時(shí)變量tempArray中,然后indexB++;

               image

            第四步到第七步:按照以上規(guī)則,進(jìn)行比對(duì)和存儲(chǔ),得到如下結(jié)果:

               image

            最后一步:將子表b中剩余項(xiàng)添加到臨時(shí)向量tempArray中

               image 

            然后將臨時(shí)變量中的值按照索引位置,拷貝回向量v中,就完成了對(duì)向量v的歸并排序

            算法函數(shù)為:

             1 public void Merger(int[] v, int first, int mid, int last)
             2        {
             3            Queue<int> tempV = new Queue<int>();
             4            int indexA, indexB;
             5            //設(shè)置indexA,并掃描subArray1 [first,mid]
             6            //設(shè)置indexB,并掃描subArray2 [mid,last]
             7            indexA = first;
             8            indexB = mid;
             9            //在沒(méi)有比較完兩個(gè)子標(biāo)的情況下,比較 v[indexA]和v[indexB]
            10            //將其中小的放到臨時(shí)變量tempV中
            11            while (indexA < mid && indexB < last)
            12            {
            13                if (v[indexA] < v[indexB])
            14                {
            15                    tempV.Enqueue(v[indexA]);
            16                    indexA++;
            17                }
            18                else
            19                {
            20                    tempV.Enqueue(v[indexB]);
            21                    indexB++;
            22                }
            23            }
            24            //復(fù)制沒(méi)有比較完子表中的元素
            25            while (indexA < mid)
            26            {
            27                tempV.Enqueue(v[indexA]);
            28                indexA++;
            29            }
            30            while (indexB < last)
            31            {
            32                tempV.Enqueue(v[indexB]);
            33                indexB++;
            34            }
            35            int index = 0;
            36            while (tempV.Count > 0)
            37            {
            38                v[first+index] = tempV.Dequeue();
            39                index++;
            40            }
            41        } 

                實(shí)現(xiàn)歸并排序;歸并排序算法分為兩步,第一步:先將原來(lái)的數(shù)據(jù)表分成排好序的子表,然后調(diào)用 Merger  對(duì)子表進(jìn)行歸并,使之成為有序表,例如有如下向量:

              25,10,7,19,3,48,12,17,56,30,21

            對(duì)此序列進(jìn)行歸并排序的步驟為:

               image

                歸并算法函數(shù)為

             1 public void MergerSort(int[] v, int first, int last)
             2        {
             3            if (first + 1 < last)
             4            {
             5                int mid = (first + last) / 2;
             6                MergerSort(v, first, mid);
             7                MergerSort(v, mid, last);
             8                Merger(v, first, mid, last);
             9            }
            10        } 

                歸并算法的劃分子表和歸并子表與原數(shù)據(jù)序列次序無(wú)關(guān),因此算法的最壞情況,最壞情況和平均情況時(shí)間復(fù)雜度是一樣的

            下面是歸并算法的函數(shù)調(diào)用圖

                   image

            示例程序: MergerSort.rar

            posted @ 2012-05-23 14:01 王海光 閱讀(537) | 評(píng)論 (0)編輯 收藏
            通過(guò)API函數(shù)::GetPrinter()來(lái)獲取打印機(jī)的相關(guān)信息。
             1 HANDLE hPrinter; 
             2 DWORD dwNeeded=0
             3 PRINTER_INFO_2* pPrinterInfo = NULL;
             4 PPRINTER_NOTIFY_INFO pNotify = NULL;
             5 ::OpenPrinter((LPTSTR)(LPCTSTR)"打印機(jī)名稱"&hPrinter, NULL);
             6 ::GetPrinter(hPrinter,2,0,0,&dwNeeded);
             7 if (dwNeeded <= 0)
             8 {
             9     LOG("獲取打印機(jī)信息長(zhǎng)度dwNeeded=%d失敗,添加打印機(jī)消息處理失敗", dwNeeded);
            10     return 0;
            11 }
            12 pPrinterInfo = new PRINTER_INFO_2[dwNeeded]; 
            13 if(!::GetPrinter(hPrinter,2,(LPBYTE)pPrinterInfo,dwNeeded,&dwNeeded))
            14 
            15     DWORD dError = GetLastError();
            16     LOG("獲取打印信息失敗,錯(cuò)誤代碼:%d,添加打印機(jī)消息處理失敗", dError);
            17     return 0;
            18                          
            19 
            20 ::ClosePrinter(hPrinter); 
            21 delete []pPrinterInfo; 

            posted @ 2012-05-23 11:00 王海光 閱讀(1087) | 評(píng)論 (0)編輯 收藏
            本文轉(zhuǎn)自:http://m.shnenglu.com/fztcjjl/archive/2012/05/02/173434.html

            Linux開(kāi)發(fā)工具視頻

            工欲善其事必先利其器,《Linux開(kāi)發(fā)工具使用》視頻講解Linux底下C/C++開(kāi)發(fā)工具的使用。主要包括編譯工具gcc、調(diào)試工具gdb、make(Makefile)工具以及當(dāng)前流行的自動(dòng)化編譯工具cmake工具。

            gcc入門(mén)(上)
            本節(jié)課的主要內(nèi)容有:
            什么是gcc
            gcc特點(diǎn)
            gcc編譯過(guò)程
            gcc常用選項(xiàng)
            gcc編譯多文件
            在線播放地址:http://www.cppcourse.com/gcc1.html
            gcc入門(mén)(下)
            本節(jié)課的主要內(nèi)容有:
            使用外部庫(kù)
            靜態(tài)庫(kù)與共享庫(kù)
            生成靜態(tài)庫(kù)
            生成動(dòng)態(tài)庫(kù)
            在線播放地址:http://www.cppcourse.com/gcc2.html
            Makefile(上)
            本節(jié)課的主要內(nèi)容有:
            make與Makefile介紹
            Makefile基本規(guī)則
            簡(jiǎn)單的Makefile編寫(xiě)
            Make自動(dòng)化變量
            Makefile編譯多個(gè)可執(zhí)行文件
            在線播放地址:http://www.cppcourse.com/makefile1.html
            Makefile(下)
            本節(jié)課的主要內(nèi)容有:
            make常用內(nèi)嵌函數(shù)
            多級(jí)目錄Makefile
            實(shí)用的Makefile
            在線播放地址:http://www.cppcourse.com/makefile2.html
            gdb入門(mén)(上)
            本章的主要內(nèi)容有:
            什么是gdb
            gdb功能
            運(yùn)行程序
            查看源碼
            設(shè)置斷點(diǎn)
            單步調(diào)試
            gdb常用命令總結(jié)
            在線播放地址:http://www.cppcourse.com/gdb1.html
            gdb入門(mén)(下)
            本章的主要內(nèi)容有:
            查看運(yùn)行時(shí)數(shù)據(jù)
            程序錯(cuò)誤
            gdb調(diào)試邏輯錯(cuò)誤
            gdb調(diào)試段錯(cuò)誤
            core文件調(diào)試
            在線播放地址:http://www.cppcourse.com/gdb2.html
            posted @ 2012-05-22 11:29 王海光 閱讀(397) | 評(píng)論 (0)編輯 收藏
                 摘要: 用GetPrivateProfileString和WritePrivateProfileString函數(shù)讀寫(xiě)文件操作。以及轉(zhuǎn)載的一篇關(guān)于文件操作的文章  閱讀全文
            posted @ 2012-05-17 16:46 王海光 閱讀(7182) | 評(píng)論 (0)編輯 收藏
            本文轉(zhuǎn)自:http://topic.csdn.net/u/20120329/15/ee6b04a0-a797-4f59-b538-5d8be71db9a4.html

            大家都知道,當(dāng)編寫(xiě)一個(gè)win32 console application時(shí),當(dāng)運(yùn)行此類程序的時(shí)候默認(rèn)情況下會(huì)有一個(gè)類似dos窗口的console窗口,但是有的時(shí)候我們只想在程序中運(yùn)行一段功能代碼,不希望顯示這個(gè)console窗口,讓代碼執(zhí)行完畢之后程序自動(dòng)退出.下面就介紹一下,如何隱藏win32 console application的console窗口 .

            因?yàn)榇朔N方法是通過(guò)設(shè)置編譯器的鏈接開(kāi)關(guān)來(lái)實(shí)現(xiàn),所以讓我們來(lái)看一下編譯器的鏈接開(kāi)關(guān)選項(xiàng)(也就是linker選項(xiàng)).

            首先我們來(lái)看一下linker的 /subsystem 選項(xiàng)該選項(xiàng)的語(yǔ)法形式如下:
            /subsystem:{console|efi_application|efi_boot_service_driver|
            efi_rom|efi_runtime_driver|native|posix|windows|windowsce}
            [,major[.minor]]

            這個(gè)鏈接選項(xiàng)告訴操作系統(tǒng)如何運(yùn)行可執(zhí)行文件

            console: win32 字符模式應(yīng)用程序,此種類型的應(yīng)用程序在運(yùn)行的時(shí)候會(huì)產(chǎn)生一個(gè)類似dos窗口的控制臺(tái)窗口,如果在應(yīng)用程序的主函數(shù)為main()或者wmain(),在默認(rèn)情況下該應(yīng)用程序就是一個(gè)控制臺(tái)應(yīng)用程序.

            extensible firmware interface 和cpu具體架構(gòu)相關(guān)的一個(gè)參數(shù)選項(xiàng),并不常用,在這里暫不詳細(xì)介紹.
            如果對(duì)此有興趣的可以訪問(wèn)intel主頁(yè)來(lái)查看相關(guān)內(nèi)容

            native;設(shè)備驅(qū)動(dòng)器選項(xiàng),如果/driver:wdm選項(xiàng)被設(shè)定的話,該鏈接選項(xiàng)(native)就為默認(rèn)選項(xiàng)

            posix: 在windows nt 種運(yùn)行在posix子系統(tǒng)上的應(yīng)用程序

            windows:該類型的應(yīng)用程序不產(chǎn)生console窗口,該類型的應(yīng)用程序的窗口由用戶自己創(chuàng)建,簡(jiǎn)而言之
            就是一個(gè)標(biāo)準(zhǔn)的win32 application,其入口地址為winmain()函數(shù)或者wwinmain()函數(shù)的地址
            如果你在應(yīng)用程序種定義的主函數(shù)為winmain或者wwinmain,在默認(rèn)情況下該應(yīng)用程序就是一個(gè)
            win32 application !

            windowsce:運(yùn)行在windows ce上的應(yīng)用程序

            major and minor (optional):主版本號(hào)和次版本號(hào),該選項(xiàng)為可選,該選項(xiàng)為0~65535之間的十進(jìn)制整數(shù)

            從上面可以看出如果我們建立一個(gè)win32 console application的話,linker的/subsystem選項(xiàng)應(yīng)該為
            console,可以在vc開(kāi)發(fā)環(huán)境的project->setting->link->project option中看到!

            接下來(lái)我們?cè)倏纯磻?yīng)用程序是如何運(yùn)行的!

            我們知道用vc編寫(xiě)的程序,運(yùn)行的時(shí)候是需要 cc 運(yùn)行庫(kù)支持的.當(dāng)我們運(yùn)行一個(gè)c/c 程序的時(shí)候鏈接器會(huì)首先尋找應(yīng)用程序的啟動(dòng)函數(shù),例如:

            如果你建立了一個(gè)console程序的話,編譯器得鏈接開(kāi)關(guān)會(huì)是以下這種形式
            /subsystem:console /entry:maincrtstartup (ansi)
            /subsystem:console /entry:wmaincrtstartuup (unicode)

            如果你建立了一個(gè)win32 application,編譯器得鏈接開(kāi)關(guān)則會(huì)是一下形式
            /subsystem:windows /entry:winmain (ansi)
            /sbusystem:windows /entry:wwinmain (uincode)

            上面的兩種形式可以再project->setting->link->project option中看到,上面的subsystem和entry并不需要都設(shè)置,如果你只設(shè)置了/subsystem:console的話,那么默認(rèn)的entry開(kāi)關(guān)在默認(rèn)情況下應(yīng)為/entry:maincrtstartup.反之,如果你在應(yīng)用程序中定義了main函數(shù)的話,默認(rèn)情況下,你/subsystem開(kāi)關(guān)應(yīng)該為/system:console.

            在默認(rèn)情況下/subsystem 和/entry開(kāi)關(guān)是匹配的,也就是console對(duì)應(yīng)maincrtstartup或者wmaincrtstartup.windows對(duì)應(yīng)winmain或者wwinmain.但是我們也可以通過(guò)手動(dòng)改動(dòng)的方式使他們不匹配.例如我們可以這樣改動(dòng)

            #pragma comment( linker, /subsystem:windows /entry:maincrtstartup ) // 設(shè)置入口地址
            int main(int argc, char* argv[])
            {
            messagebox(null, hello, notice, mb_ok);
            return 0;
            }

            在默認(rèn)情況下鏈接器看到/subsystem下是windows選項(xiàng)的時(shí)候,它會(huì)自動(dòng)尋找winmain或者wwinmain
            但我們強(qiáng)制指定入口地址,這樣運(yùn)行程序的時(shí)候默認(rèn)的console窗口就會(huì)隱藏!

            上面是在代碼中使用#pragma指令來(lái)設(shè)置,還有一種就是直接在開(kāi)發(fā)環(huán)境的
            project->setting->link->project option中手工改動(dòng)!

            總結(jié)如下:
            1:如果console程序已經(jīng)寫(xiě)好了,不能改了,也可以。寫(xiě)一個(gè)API程序,不要畫(huà)窗口,然后用CreateProcess調(diào)用寫(xiě)好的console程序,把屬性設(shè)成SW_HIDE即可。
            2:不能用控制臺(tái)來(lái)寫(xiě)(CONSLOE),要用WINMAIN做入口就可以了,不畫(huà)窗口,別人就都看不見(jiàn)了. 你只用想想辦法把你的進(jìn)程在任務(wù)欄里面隱藏住就可以.
            3:如果是console程序,用API函數(shù)GetStdHandle()獲得控制臺(tái)程序的窗口句柄,然后在隱藏窗口
            4://這一句隱藏控制臺(tái)
            #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
            你要寫(xiě)控制臺(tái)程序就用這個(gè).在控制臺(tái)程序中隱藏控制臺(tái)窗口!
            posted @ 2012-05-17 16:10 王海光 閱讀(535) | 評(píng)論 (0)編輯 收藏
            查找指定進(jìn)程:
             1 BOOL Test::FindProcess(const CString &sProcessName)
             2 {
             3     BOOL bResult = FALSE;
             4     HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//
             5     //PROCESSENTRY32 *info = new PROCESSENTRY32; 
             6     //info->dwSize=sizeof(PROCESSENTRY32); 
             7 
             8     PROCESSENTRY32 info; 
             9     info.dwSize = sizeof(PROCESSENTRY32); 
            10     Process32First(handle, &info); 
            11     while (Process32Next(handle, &info) != FALSE) 
            12     {   
            13         if (sProcessName.CompareNoCase(info.szExeFile) == 0)   
            14         {   
            15             bResult = TRUE;
            16             break;
            17         }   
            18     } 
            19     CloseHandle(handle);
            20 
            21     return bResult;
            22 }

            posted @ 2012-05-10 14:20 王海光 閱讀(1084) | 評(píng)論 (0)編輯 收藏
                 在MFC中,向線程傳遞CString變量參數(shù)時(shí),很容易犯一個(gè)錯(cuò)誤,就是使用一個(gè)超出生存期的變量,在主函數(shù)中定義的CString變量是局部變量,當(dāng)主函數(shù)結(jié)束時(shí),這個(gè)CString變量就會(huì)被析構(gòu),而卻在另一個(gè)線程中繼續(xù)使用,參數(shù)傳遞就會(huì)出現(xiàn)問(wèn)題。
                 解決此問(wèn)題,可以在主函數(shù)中new一個(gè)CString,在線程結(jié)束時(shí)在delete一下釋放內(nèi)存。或者聲明一個(gè)全局變量,保證CString變量不會(huì)超出生存期,這樣傳遞進(jìn)線程的參數(shù)就可以正常使用了。
                 下面為示例代碼: 
             1 DWORD WINAPI test::ProcessNotifyThread(LPVOID pParam)
             2 {
             3 
             4     CString* sTest = (CString*)pParam;
             5     //AfxMessageBox(*sTest);
             6     delete sTest;
             7     return 0 ;
             8 }
             9 
            10 void test::OnBnClickedButton1()
            11 {
            12     // TODO: Add your control notification handler code here
            13      CString *sTest = new CString;
            14      *sTest = "hello";
            15      LPVOID lpvoid=sTest;
            16 
            17     CWinThread* pThread = AfxBeginThread((AFX_THREADPROC)test::ProcessNotifyThread, lpvoid);
            18 }
                 CString類是很好用,但在多線程時(shí)最好不要用CString,因?yàn)镸SDN明確說(shuō)了,CString類是非線程安全的。
                 下面為摘抄的:

                 CString只保證類級(jí)的線程安全, 
                 要做到對(duì)象級(jí)別的線程安全,需要你自己進(jìn)行同步, 也就是說(shuō), 可以同時(shí)有N個(gè)線程在讀, 但是寫(xiě)的時(shí)候,必須保證沒(méi)有任何線程"正在"讀和寫(xiě) 才可以寫(xiě)入.

            1 CString str; 
            2 
            3 CCriticalSection cs; 
            4 cs->Lock( ); 
            5 str+="abcdefg";.. 
            6 do anything you want 
            7 cs->Unlock( );


            線程傳遞char*

             1 DWORD WINAPI test::ProcessNotifyThread(LPVOID pParam)
             2 {
             3 
             4     char *pSectionName = (char *)lpvoid;
             5     CString sSectionName;
             6     sSectionName.Format("%s", pSectionName);     return 0 ;
             7  }
             8  
             9  void test::OnBnClickedButton1()
            10  {
            11      // TODO: Add your control notification handler code here
            12       CString str = _T("aaaa");
            13       const char *pSectionName = (LPCTSTR)str;     
            14       CWinThread* pThread = AfxBeginThread((AFX_THREADPROC)test::ProcessNotifyThread, (LPVOID)pSectionName);
            15  }

             

            posted @ 2012-05-10 10:20 王海光 閱讀(2603) | 評(píng)論 (0)編輯 收藏
                在Windows 2000下調(diào)試程序時(shí),碰到一個(gè)問(wèn)題:在導(dǎo)入一個(gè)win32 DLL時(shí),LoadLibrary()函數(shù)返回值為空,GetLastError返回值為127 (找不到指定的程序)。其他DLL文件調(diào)用都正常。最后發(fā)現(xiàn)這個(gè)DLL文件中一個(gè)API函數(shù)WTSGetActiveConsoleSessionId()不支持2000系統(tǒng),所以導(dǎo)致DLL文件總是導(dǎo)入不成功。
                加載dll失敗,原因大致有:
                1.dll初始化時(shí)失敗,這是因?yàn)閐ll本身有問(wèn)題;
                2.dll需要的其他dll文件不存在;
                3.調(diào)用的dll再本地機(jī)器上不存在。
                
                解決方案: 用動(dòng)態(tài)加載的方式
               
             1 typedef DWORD (WINAPI *LoadWTSGetActiveConsoleSessionId)(VOID);
             2 
             3             HMODULE hModKrl  =  LoadLibrary(TEXT("Kernel32.dll"));
             4             if (!hModKrl)  
             5             {  
             6                 LOG("導(dǎo)入 kernel32.dll 失敗");
             7                 return;
             8             }  
             9 
            10             LoadWTSGetActiveConsoleSessionId fWTSGetActiveConsoleSessionId  =  (LoadWTSGetActiveConsoleSessionId)GetProcAddress(hModKrl, "WTSGetActiveConsoleSessionId");
            11             if (!fWTSGetActiveConsoleSessionId)
            12             {
            13                 LOG("調(diào)用WTSGetActiveConsoleSessionId 失敗");
            14                 return;
            15             } 
            16             dwSessionId = fWTSGetActiveConsoleSessionId();
            17 
            18             if (hModKrl)  
            19             {  
            20                 FreeLibrary(hModKrl);  
            21             }
                使用動(dòng)態(tài)加載dll,在Windows2000系統(tǒng)下成功,但獲取WTSGetActiveConsoleSessionId函數(shù)入口地址失敗。查找msdn發(fā)現(xiàn)此函數(shù)不支持2000系統(tǒng)。

               Requirements     

            Minimum supported client

            Windows XP

               Minimum supported server

            Windows Server 2003

               Header

            Winbase.h (include Windows.h)

               Library

            Kernel32.lib

               DLL

            Kernel32.dll
                  

            posted @ 2012-05-09 14:59 王海光 閱讀(10682) | 評(píng)論 (0)編輯 收藏
            僅列出標(biāo)題
            共27頁(yè): First 19 20 21 22 23 24 25 26 27 
            久久婷婷国产综合精品| A狠狠久久蜜臀婷色中文网| 久久久久久午夜成人影院| 国产农村妇女毛片精品久久| 亚洲国产精品高清久久久| 伊人色综合久久天天| 久久偷看各类wc女厕嘘嘘| 伊人久久五月天| 久久久一本精品99久久精品88| 久久久久亚洲精品无码网址| 91精品国产乱码久久久久久| 久久亚洲AV成人无码软件| 国产高潮国产高潮久久久91 | 久久精品二区| 久久久精品午夜免费不卡| 色欲综合久久中文字幕网| 亚洲精品国精品久久99热| 91久久福利国产成人精品| 久久精品亚洲日本波多野结衣| 99久久香蕉国产线看观香| 久久er国产精品免费观看8| 情人伊人久久综合亚洲| 国产精品9999久久久久| 久久国产精品99国产精| 久久久久亚洲av无码专区喷水| 久久www免费人成看片| 99久久综合国产精品免费| 久久婷婷色综合一区二区| 欧美一区二区久久精品| 性做久久久久久免费观看| 亚洲国产精品成人AV无码久久综合影院| 精品久久久久久久久久久久久久久| 国内精品久久九九国产精品| 久久福利青草精品资源站| 久久免费视频网站| 93精91精品国产综合久久香蕉| 亚洲欧美日韩精品久久| 狠狠精品久久久无码中文字幕| 久久男人中文字幕资源站| 亚洲一区精品伊人久久伊人 | 亚洲欧美成人综合久久久|