• <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>
            面對現(xiàn)實,超越自己
            逆水行舟,不進則退
            posts - 269,comments - 32,trackbacks - 0
            本文轉(zhuǎn)自:http://blog.csdn.net/welcome_ck/article/details/236259

            何謂消息、消息處理函數(shù)、消息映射?
            消息簡單的說就是指通過輸入設備向程序發(fā)出指令要執(zhí)行某個操作。具體的某個操作是你的一系列代碼。稱為消息處理函數(shù)。在SDK中消息其實非常容易理解,當窗口建立后便會有一個函數(shù)(窗口處理函數(shù))開始執(zhí)行一個消息循環(huán),我們還可以清楚的看到消息處理的脈絡。一個switch case語句就可以搞定,消息循環(huán)直到遇到WM_QUIT消息才會結(jié)束,其余的消息均被攔截后調(diào)用相應的處理函數(shù)。但在封裝了API的MFC中,消息似乎變的有些復雜了,我們看不到熟悉的switch case語句了,取而代之的是一個叫消息映射的東西。為什么MFC要引入消息映射機制,你可以想象一下,在現(xiàn)在的程序開發(fā)活動中,你的一個程序是否擁有多個窗體,主窗口就算只有一個,那菜單、工具條、控件這些都是子窗口,那我們需要寫多少個switch case,并且還要為每個消息分配一個消息處理函數(shù),這樣做是多么的復雜呀。因此MFC采用了一種新的機制。利用一個數(shù)組,將窗口消息和相對應的消息處理函數(shù)進行映射,你可以理解成這是一個表。這種機制就是消息映射。這張表在窗口基類CWnd定義,派生類的消息映射表如果你沒有動作它是空的,也就是說如果你不手工的增加消息處理函數(shù),則當派生窗口接受一個消息時會執(zhí)行父類的消息處理函數(shù)。這樣做顯然是高效的。
            MFC提供的消息結(jié)構(gòu)
            同時MFC定義了下面的兩個主要結(jié)構(gòu):
            AFX_MSGMAP_ENTRY
            struct AFX_MSGMAP_ENTRY{
            UINT nMessage;   // Windows消息的ID號
            UINT nCode;  // 控制消息的通知
            UINT nID;    // Windows控制消息的ID
            UINT nLastID;   //表示是一個指定范圍的消息被映射的范圍
            UINT nSig;  //表示消息的動作標識
            AFX_PMSG pfn;    // 指向消息處理函數(shù)的指針
            };
            AFX_MSGMAP
            struct AFX_MSGMAP{
            #ifdef _AFXDLL
            const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();
            #else
            const AFX_MSGMAP* pBaseMap;
            #endif
            const AFX_MSGMAP_ENTRY* lpEntries;
            };
            ///AFX_MSGMAP可以得到基類的消息映射入口地址和得到本身的消息映射入口地址。

            MFC下一個消息的處理過程是一般是這樣的。
            1、_AfxCbtFilterHook截獲消息(這是一個鉤子函數(shù))
            2、_AfxCbtFilterHook把窗口過程設定為AfxWndProc。
            3、函數(shù)AfxWndProc接收Windows操作系統(tǒng)發(fā)送的消息。
            4、函數(shù)AfxWndProc調(diào)用函數(shù)AfxCallWndProc進行消息處理。
            5、函數(shù)AfxCallWndProc調(diào)用CWnd類的方法WindowProc進行消息處理。

            如何添加自己的消息?
            我們已經(jīng)了解了WINDOW的消息機制,如何加入我們自己的消息呢?好我們來看
            一個標準的消息處理程序是這個樣子的
            在 CWnd 類中預定義了標準 Windows 消息 (WM_XXXX  WM是WINDOW MESSAGE的縮寫) 的默認處理程序。類庫基于消息名命名這些處理程序。例如,WM_PAINT 消息的處理程序在 CWnd 中被聲明為:
            afx_msg void OnPaint();
            afx_msg 關鍵字通過使這些處理程序區(qū)別于其他 CWnd 成員函數(shù)來表明 C++ virtual 關鍵字的作用。但是請注意,這些函數(shù)實際上并不是虛擬的,而是通過消息映射實現(xiàn)的。我們在本文的一開始便說明了為什么要這樣做。
            所有能夠進行消息處理的類都是基于CCmdTarget類的,也就是說CCmdTarget類是所有可以進行消息處理類的父類。CCmdTarget類是MFC處理命令消息的基礎和核心。

            若要重寫基類中定義的處理程序,只需在派生類中定義一個具有相同原型的函數(shù),并創(chuàng)建此處理程序的消息映射項。我們通過ClassWizard可以建立大多數(shù)窗口消息或自定義的消息,通過ClassWizard可以自動建立消息映射,和消息處理函數(shù)的框架,我們只需要把我們要做的事情填空,添加你要做的事情到處理函數(shù)。這個非常簡單,就不細說了。但是也許我們需要添加一些ClassWizard不支持的窗口消息或自定義消息,那么就需要我們親自動手建立消息映射和消息處理的框架,通常步驟如下:
            第一步:定義消息。Microsoft推薦用戶自定義消息至少是WM_USER+100,因為很多新控件也要使用WM_USER消息。
            #define WM_MYMESSAGE (WM_USER + 100)

            第二步:實現(xiàn)消息處理函數(shù)。該函數(shù)使用WPRAM和LPARAM參數(shù)并返回LPESULT。
            LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
            {
            // TODO: 處理用戶自定義消息,填空就是要填到這里。
            return 0;
            }
            第三步:在類頭文件的AFX_MSG塊中說明消息處理函數(shù):
            // {{AFX_MSG(CMainFrame)
            afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
            //}}AFX_MSG
            DECLARE_MESSAGE_MAP()
            第四步:在用戶類的消息塊中,使用ON_MESSAGE宏指令將消息映射到消息處理函數(shù)中。
            ON_MESSAGE( WM_MYMESSAGE, OnMyMessage )

            可以看出,用戶自定義的消息和我們通過ClassWizard添加的消息一樣,都是利用了ON_MESSAGE宏,建立的消息映射。

            其實消息類別可以分成多種,上面說的只是其中之一。有三種主要的消息類別:(以下部分摘自MSDN)
            1、Windows 消息
            此類消息主要包括以前綴 WM_ 開頭的消息,WM_COMMAND 除外。Windows 消息由窗口和視圖處理。此類消息往往帶有用于確定如何處理消息的參數(shù)。
            2、控件通知
            此類消息包括從控件和其他子窗口發(fā)送到其父窗口的 WM_COMMAND 通知消息。例如,當用戶在編輯控件 (Edit Control) 中執(zhí)行可能更改文本的操作后,該編輯控件 (Edit Control) 將向其父級發(fā)送包含 EN_CHANGE 控件通知代碼的 WM_COMMAND 消息。該消息的窗口處理程序以某種適當?shù)姆绞巾憫送ㄖⅲ缭诳丶袡z索該文本。
            框架像傳送其他 WM_ 消息一樣傳送控件通知消息。但是有一個例外的情況,即當用戶單擊按鈕時由按鈕發(fā)送的 BN_CLICKED 控件通知消息。該消息被作為命令消息特別處理,并像其他命令一樣傳送。
            3、命令消息
            此類消息包括用戶界面對象(菜單、工具欄按鈕和快捷鍵)發(fā)出的 WM_COMMAND 通知消息。框架處理命令的方式與處理其他消息不同,可以使用更多種類的對象處理命令。
            Windows 消息和控件通知消息由窗口來處理(窗口是從 CWnd 類派生的類的對象)。包括 CFrameWnd、CMDIFrameWnd、CMDIChildWnd、CView、CDialog 以及從這些基類派生的您自己的類。這些對象封裝了 HWND——Windows 窗口的句柄。
            命令消息可以由范圍更廣的對象(文檔、文檔模板以及應用程序?qū)ο蟊旧恚┨幚恚粌H僅由窗口和視圖處理。當某一命令直接影響到某個特定對象時,應當讓該對象處理此命令。例如,“文件”菜單中的“打開”命令在邏輯上與應用程序相關聯(lián):該應用程序接收到此命令時會打開指定的文檔。因此“打開”命令的處理程序是應用程序類的成員函數(shù)。

            命令消息我們比較常見的便是菜單項和工具條了,大家可以看到他的消息映射宏和窗口消息不太一樣,一般的形式是這樣的
            ON_COMMAND(id,memberFxn)
            第一個參數(shù)是命令ID,一個ID號對應一個消息處理,當然你可以讓多個ID共用一個處理函數(shù)。常見的應用例如:菜單項打開文檔的ID和工具條按鈕打開文檔的ID同時使用一個處理函數(shù),或者直接將它們的ID設成相同的。

            還有一種消息叫通知消息。例如樹型控件的等一些復雜的控件在單擊后需要傳遞更多的信息,例如光標的位置和當前項的一個結(jié)構(gòu),所以MFC為控件的每個通知消息也定義了一個宏,它長成了這個樣子:
            ON_CONTROL(EN_CHANGE,id,memberFxn)

            還有很多種消息存在于MFC,宏定義有區(qū)別,大家可以觸類旁通。

            窗口消息有上百個。你可以從MSDN上查到WM_開頭的,或者查看CWnd的成員函數(shù),會給你列出很多,別忘了還有很多非窗口消息

            其他鏈接:http://blog.csdn.net/liufei_learning/article/details/5903287
                                 http://www.cnblogs.com/lantionzy/archive/2009/10/10/1580428.html
            posted @ 2012-04-19 16:06 王海光 閱讀(1964) | 評論 (0)編輯 收藏
            本文轉(zhuǎn)自:http://hi.baidu.com/agodliness/blog/item/8ad01d0a21734728b0351d70.html

            環(huán)境變量是指那些可為系統(tǒng)所使用的包含有環(huán)境信息的字符串,根據(jù)級別的不同而分為系統(tǒng)環(huán)境變量和用戶環(huán)境變量,并以此給出諸如文件搜索路徑,存放臨時文件的目錄等與系統(tǒng)和用戶相關的環(huán)境變量。下表列出了用于環(huán)境變量訪問的函數(shù)。

                                   環(huán)境變量訪問函數(shù)
             ────────────────────────────────────
                           環(huán)境變量函數(shù)                   函數(shù)說明
             ────────────────────────────────────
             GreateEnvironmentBlock()      為特定的用戶創(chuàng)建一個環(huán)境塊
             ────────────────────────────────────
             DestoryEnvironmentBlock()     釋放由CreateEnvironmentBlock()創(chuàng)建的環(huán)境塊
             ────────────────────────────────────
             GetEnvironmentStrings()       得到當前進程的環(huán)境塊的地址
             ────────────────────────────────────
             FreeEnvironmentStrings()      釋放由GetEnvironmentStrings()得到的環(huán)境塊
             ────────────────────────────────────
             GetEnvironmentVariable()      得到指定環(huán)境變量的相關信息
             ────────────────────────────────────
             SetEnvironmentVariable()      添加,修改或刪除一個指定的環(huán)境變量
             ───────────────────────────────────

             注:環(huán)境塊是指與進程相關的,包含有環(huán)境變量名及其對應值的一個在進程地址空間內(nèi)分配的內(nèi)存塊。

               下面的給出的代碼演示了對進程的環(huán)境變量進行讀,寫訪問的基本操作過程。

              

             1 // 待操作的環(huán)境變量名
             2  CString sEnvironmentName = "PUBLIC";
             3  char cBuffer[256];
             4 
             5  // 讀取環(huán)境變量信息
             6   DWORD dwRet = GetEnvironmentVariable(sEnvironmentName, cBuffer, 256);
             7     if (dwRet == 0)
             8     {
             9          // 如果環(huán)境變量不存在,則創(chuàng)建之
            10     CString sEnvironmentValue("<進程的環(huán)境變量測試程序>");
            11 
            12     BOOL bRet=SetEnvironmentVariable(sEnvironmentName,sEnvironmentValue);
            13       if (bRet == TRUE) AfxMessageBox("環(huán)境變量設置完畢!");
            14                  else AfxMessageBox("環(huán)境變量設置失敗!"); 
            15     }else{
            16            // 如果環(huán)境變量存在,顯示環(huán)境變量內(nèi)容
            17             CString sMessage("環(huán)境變量PUBLIC值為:");
            18             sMessage += CString(cBuffer);
            19             AfxMessageBox(sMessage);
            20     }


                進程的環(huán)境變量是具有可繼承性的,即在創(chuàng)建子進程時,是可以同時將環(huán)境變量傳遞給子進程的。在創(chuàng)建子進程的過程中,可以有父進程負責控制子進程,子進程可以繼承那些環(huán)境變量,一旦子進程創(chuàng)建完畢,父進程即失去對子進程環(huán)境變量的控制。實際上,子進程從父進程繼承來的環(huán)境變量只是父進程環(huán)境變量的一個副本,子進程對其環(huán)境變量的修改并不會影響到父進程。


            posted @ 2012-04-17 12:21 王海光 閱讀(1750) | 評論 (0)編輯 收藏
            VBS中啟動exe程序:
            1 set ws=WScript.CreateObject("WScript.Shell"
            2 ws.Run "AutoUpdateEx.exe",0,true
            3 ws.Run "打印配置工具.exe",0,true
            4 ws.Run "DOMASClientMonitor.exe",0,true
            5 ws.Run "PrinterMonitorEx.exe",0,false

            VBS中啟動exe程序絕對路徑:
            1 set ws=WScript.CreateObject("WScript.Shell"
            2 ws.Run """C:\Program Files\Test\AutoUpdateEx.exe""",0,true
            3 ws.Run """C:\Program Files\Test\DOMASClientMonitor.exe""",0,false
            4 ws.Run """C:\Program Files\Test\PrinterMonitorEx.exe""",0,false
            5 ws.Run """C:\Program Files\Test\打印配置工具.exe""",0,false

            ws.Run實際參數(shù)是"C:\Program Files\Test\AutoUpdateEx.exe",因為帶空格,先將它括起來作為一個整體,而兩側(cè)的"按要求應該用轉(zhuǎn)義""表示,故成為""C:\Program Files\Test\AutoUpdateEx.exe"",而Run本身調(diào)用參數(shù)就得在外部加一對引號,故共有三對引號。用msgbox"""C:\Program Files\Test\AutoUpdateEx.exe"""可驗證結(jié)果為"C:\Program Files\Test\AutoUpdateEx.exe"。對于Run方法,可以統(tǒng)一都用三個引號,ws.Run"""C:\"""同樣可以解析;本例也可用ws.Run"C:\progra~1\Test\AutoUpdateEx.exe"來實現(xiàn)。

            posted @ 2012-04-16 12:41 王海光 閱讀(2888) | 評論 (0)編輯 收藏
            寫注冊表字符串值:
             
             1     //訪問注冊表,hKEY則保存此函數(shù)所打開的鍵的句柄
             2     HKEY hKey;
             3     //如果無法打開hKEY,則創(chuàng)建
             4     if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\EMFPrinter"
             5         , 0, KEY_READ|KEY_WRITE|KEY_SET_VALUE, &hKey))
             6     {
             7         if (ERROR_SUCCESS != RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\EMFPrinter",&hKey))
             8 
             9         {    
            10             LOG("創(chuàng)建注冊表 %s 失敗", hKey);
            11             return FALSE;
            12         }
            13     }
            14 
            15     DWORD    dwTypeString = REG_SZ;
            16     TCHAR    pDirBuf[255= {0};
            17     DWORD    len = 255;
            18     //如果無法查詢有關的注冊表信息,設置相關注冊表信息
            19     if (ERROR_SUCCESS != RegQueryValueEx(hKey, ""0&dwTypeString,(LPBYTE)pDirBuf, &len))
            20     {
            21         RegSetValueEx(hKey, ""0, REG_SZ,NULL, 0);    
            22     }    
            23     RegCloseKey(hKey);

            讀取注冊表中DWORD值并且改變其值:

             1 CString sPrinterRegPath = "SYSTEM\\CurrentControlSet\\Control\\Print\\Printers\\dd";
             2     HKEY hkey;
             3     if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, sPrinterRegPath, 0, KEY_READ|KEY_WRITE|KEY_SET_VALUE, 
             4         &hkey)) 
             5     {
             6         LOG("打開打印機注冊表項%s失敗", sPrinterRegPath);
             7         return FALSE;
             8     }
             9 
            10     DWORD    dwTypeString = REG_SZ;
            11     DWORD    len = 255;
            12     DWORD    dwValue;
            13     DWORD   dwData = 1;
            14     //如果存在有關的注冊表信息,修改相關注冊表信息
            15     if (ERROR_SUCCESS == RegQueryValueEx(hkey, "123"0&dwTypeString,(BYTE*)&dwValue, &len))
            16     {
            17         if (ERROR_SUCCESS == RegSetValueEx(hkey, "123"0, REG_DWORD,(LPBYTE)&dwData, sizeof(DWORD)))
            18         {
            19             LOG("修改注冊表成功!")
            20         }   
            21     }    


            posted @ 2012-04-13 17:54 王海光 閱讀(1026) | 評論 (0)編輯 收藏
            本文轉(zhuǎn)自:http://www.shnenglu.com/tgh621/archive/2008/04/15/47100.aspx?opt=admin

             1 #include <stdlib.h> #include <iostream>
             2 using namespace std;
             3 
             4 class tgh
             5 {
             6 public:
             7     tgh():i(3){}
             8     const int a() const {return 5;}
             9     int a(){return i;}
            10 protected:
            11     int i;
            12 private:
            13 };
            14 
            15 void main()
            16 {
            17     const tgh v;
            18     tgh s;
            19     const int i=s.a();//調(diào)用的是int a()
            20     int const j=s.a();//調(diào)用的是int a()
            21     printf("%d,%d",j,i);
            22     const int k = v.a();();//調(diào)用的是const int a() 
            23     cout<<k<<endl;
            24     system("pause");
            25 }
            26 
            27 結(jié)果是3,35 
            posted @ 2012-04-13 15:01 王海光 閱讀(378) | 評論 (0)編輯 收藏
            相關文章鏈接:

            http://special.csdn.net/mongodb/
            http://www.cnblogs.com/fish-li/archive/2011/06/26/2090800.html#_labelStart


            Hadoop

            一個分布式系統(tǒng)基礎架構(gòu),由Apache基金會開發(fā)。用戶可以在不了解分布式底層細節(jié)的情況下,開發(fā)分布式程序。充分利用集群的威力高速運算和存儲。Hadoop實現(xiàn)了一個分布式文件系統(tǒng)(Hadoop Distributed File System),簡稱HDFS。HDFS有著高容錯性的特點,并且設計用來部署在低廉的(low-cost)硬件上。而且它提供高傳輸率(high throughput)來訪問應用程序的數(shù)據(jù),適合那些有著超大數(shù)據(jù)集(large data set)的應用程序。HDFS放寬了(relax)POSIX的要求(requirements)這樣可以流的形式訪問(streaming access)文件系統(tǒng)中的數(shù)據(jù)。


            joomla

            (Content Management System, CMS),它屬于Portal(企業(yè)入口網(wǎng)站)類型,顧名思義,就是比較適合作為商業(yè)類型的網(wǎng)站程序。一般人對這類型的內(nèi)容管理系統(tǒng)可能會有以下的別名來稱呼:
              ■ 架站程序(或軟件
              ■ 快速架站程序(或軟件)
              ■ 整站程序
            posted @ 2012-04-13 12:35 王海光 閱讀(480) | 評論 (0)編輯 收藏
            本文轉(zhuǎn)自:http://www.shnenglu.com/humanchao/archive/2008/07/24/57063.html

            學習數(shù)據(jù)結(jié)構(gòu)和算法的好東西,非常形象,制作水平比較高,向制作者致敬!里面包含以下算法的過程演示:

            B樹的刪除
            B樹的生長過程
            三元組表的轉(zhuǎn)置
            中序線索化二叉樹
            串的順序存儲
            二分查找
            二叉排序樹的刪除
            二叉排序樹的生成
            二叉樹的建立
            克魯斯卡爾算法構(gòu)造最小生成樹
            冒泡排序
            分塊查找
            單鏈表結(jié)點的刪除
            單鏈表結(jié)點的插入
            圖的深度優(yōu)先遍歷
            基數(shù)排序
            堆排序
            頭插法建單鏈表
            尋找中序線索化二叉樹指定結(jié)點的前驅(qū)
            尋找中序線索化二叉樹指定結(jié)點的后繼
            尾插法建表
            希兒排序
            開放定址法建立散列表
            循環(huán)隊列操作演示
            快速排序
            拉鏈法創(chuàng)建散列表
            拓撲排序
            數(shù)據(jù)結(jié)構(gòu)和算法Flash動畫演示.rar
            最短路徑
            樸素串匹配算法過程示意
            構(gòu)造哈夫曼樹的算法模擬
            構(gòu)造哈夫曼樹過程
            棧與遞歸
            ...更多

            點擊下載
            posted @ 2012-04-13 12:05 王海光 閱讀(660) | 評論 (0)編輯 收藏
            本文轉(zhuǎn)自:http://www.shnenglu.com/humanchao/archive/2008/07/02/55154.html


            #import   
            "scrrun.dll"   raw_interfaces_only

            // 參數(shù)格式:"c:\" 或 "c:\test"
            ULONGLONG GetPathUseSpace(
            const char *szPath)
            {
                ASSERT(szPath 
            != NULL);

                
            int nLen = strlen(szPath);
                
            if (nLen == 0)
                    
            return 0;

                ULONGLONG result 
            = 0;

                
            if (nLen == 3)      // c:\
                {
                    ULARGE_INTEGER nFreeBytesAvailable;
                    ULARGE_INTEGER nTotalNumberOfBytes;
                    ULARGE_INTEGER nTotalNumberOfFreeBytes;
                    
            //
                    if (GetDiskFreeSpaceEx(szPath,
                          
            &nFreeBytesAvailable,
                          
            &nTotalNumberOfBytes,
                          
            &nTotalNumberOfFreeBytes))
                    {
                        result 
            = nTotalNumberOfBytes.QuadPart - nFreeBytesAvailable.QuadPart;
                    }
                }
                
            else
                {
                    CoInitialize(NULL);  
                    {  
                        
            try  
                        {  
                            Scripting::IFileSystem3Ptr   fs;  
                            fs.CreateInstance(__uuidof(Scripting::FileSystemObject)); 
                            
                            Scripting::IFolderPtr   folder;  
                            fs
            ->GetFolder(_bstr_t(szPath),&folder);
                            
                            _variant_t vsize;
                            folder
            ->get_Size(&vsize);
                            result 
            = (double)vsize;
                        }  
                        
            catch(_com_error &e)  
                        {  
                            result 
            = -1;
                        }  
                    }  

                    CoUninitialize();   
                }

                
            return result;
            }

            Scrrun.dll枚舉文件
            CoInitialize(NULL); 

                
            try 
                {  
                    Scripting::IFileCollectionPtr   files; 
                    folder
            -> get_Files(&files); 
                    
            long   count   =   0
                    files
            -> get_Count(&count); 
                    cout 
            < < "files   count: " < <count < <endl; 
                    IUnknown   
            *pUnk=NULL; 
                    HRESULT   hr   
            =   files-> get__NewEnum(&pUnk); 
                    
            if(SUCCEEDED(hr)) 
                    { 
                        CComPtr 
            <IEnumVARIANT>   pEnum; 
                        hr   
            =   pUnk-> QueryInterface(IID_IEnumVARIANT,(void**)&pEnum); 
                        
            if(pEnum) 
                        { 
                            pEnum
            -> Reset(); 
                            ULONG   fget   
            =   1
                            
            while(SUCCEEDED(hr)&&fget> 0
                            { 
                                Scripting::IFilePtr   file; 
                                _variant_t   varfile; 
                                hr   
            =   pEnum-> Next(1,&varfile,&fget); 
                                
            if(SUCCEEDED(hr)   &&   fget> 0
                                { 
                                    file   
            =              varfile.pdispVal; 
                                    BSTR   bspath; 
                                    file
            -> get_Path(&bspath); 
                                    cout 
            < < "file   path: " < <(LPCTSTR)_bstr_t(bspath) < <endl; 
                                } 
                                
            else 
                                { 
                                    cout 
            < < "   get   file     return   " < <hr < <endl; 
                                } 
                            } 
                        } 
                    } 
                } 
                
            catch(_com_error   &e) 
                { 
                     _bstr_t   bstrSource(e.Source()); 
                     _bstr_t   bstrDescription(e.Description()); 
                      cout 
            < < "Get   directory    size   via   FileSystemObject,   by    masterz " < <endl; 
                      cout 
            < < "COM   error    occurred,source: " < <(LPCTSTR)bstrSource < <endl; 
                      cout 
            < < "Description: " < <(LPCTSTR)bstrDescription < <endl; 
                } 

            CoUninitialize();
            posted @ 2012-04-13 09:33 王海光 閱讀(800) | 評論 (0)編輯 收藏
            本文轉(zhuǎn)自:http://www.shnenglu.com/humanchao/archive/2008/07/23/56962.html

            如果BAT不帶參數(shù),腳本內(nèi)容如下:

            SetOutPath '$INSTDIR'
            ExecWait '$INSTDIR\A.bat'

            如果BAT需要參數(shù)時,要把帶參數(shù)的命令寫入另外一個新的BAT中,執(zhí)行新BAT:

            B.bat內(nèi)容:
            CALL A.bat install

            NSIS 腳本:
            SetOutPath '$INSTDIR'
            ExecWait '$INSTDIR\B.bat'
            posted @ 2012-04-12 13:00 王海光 閱讀(1047) | 評論 (0)編輯 收藏
            本文轉(zhuǎn)自:http://www.shnenglu.com/humanchao/archive/2008/08/19/59309.html

            我們先看一個函數(shù):函數(shù)的功能完成1~10的加法。

            int Add1to10(int a, int b)
            {
               
            return a +b;
            }

            但是一般我們還需要加上幾條代碼:

            int Add1to10(int a, int b)
            {
                assert(a 
            >= 1 && a <= 10);
                assert(b 
            >= 1 && b < =10);

                
            if ( a < 1 || a > 10 || b < 1 || b > 10)
                    
            return -1;

                
            return a +b;
            }

            加上上面幾條代碼的作用是檢查函數(shù)的輸入?yún)?shù),當參數(shù)不正確的時候不光要在返回值上得到體現(xiàn),而且會觸發(fā)assert斷言,提醒我們參數(shù)有誤。

            斷言式編程體現(xiàn)一個編程的思想,在我們的程序執(zhí)行偏離預想的路線時給出提醒。當程序執(zhí)行偏離預想的路線時一般會出現(xiàn)兩種可能:即斷言以上的程序沒有理解下面程序的調(diào)用條件、或斷言以下的程序需要接受更為寬泛輸入條件。以下分別討論修改方法:

            1、如果函數(shù)的輸入?yún)?shù)是我們編程的一個疏漏,我們認為根本就不應該出現(xiàn)或產(chǎn)生這樣的值,那我們應該修改調(diào)用函數(shù)處的代碼,避免非預想的值出現(xiàn)。

            2、如果無法避免出現(xiàn)或者產(chǎn)生一個非法輸入值,那我們要么在函數(shù)調(diào)用處加入判斷,產(chǎn)生符合條件的值時調(diào)用函數(shù),不符合參數(shù)條件else處理;要么修改函數(shù),使函數(shù)可以接受更為寬泛輸入條件,并調(diào)整斷言內(nèi)容和參數(shù)判斷邏輯。

            斷言不僅可以出現(xiàn)在函數(shù)的參數(shù)檢查的場合,也可以出現(xiàn)在其他的上下文調(diào)用的場合。而且它還會隨著程序的開發(fā)進程逐漸的增加、刪除和調(diào)整。它可以驗證程序是按照我們預想的思路在執(zhí)行,當出現(xiàn)意外時及時的給出提醒,提醒我們修正程序或者自己的思路。
            posted @ 2012-04-12 12:58 王海光 閱讀(633) | 評論 (0)編輯 收藏
            僅列出標題
            共27頁: First 19 20 21 22 23 24 25 26 27 
            伊人久久大香线蕉av不变影院| 99久久无色码中文字幕人妻| 国内精品久久久久久中文字幕| 久久久久人妻一区精品果冻| 精品国产乱码久久久久久呢 | 综合久久精品色| 久久久久人妻精品一区| 精品久久久久中文字| 国产产无码乱码精品久久鸭| 香蕉aa三级久久毛片| 久久久青草久久久青草| 久久精品国产99国产精品导航| 国产91久久综合| 久久精品国产亚洲AV麻豆网站| 亚洲国产视频久久| 精品视频久久久久| 国产精品久久久久…| 五月丁香综合激情六月久久| 香港aa三级久久三级老师2021国产三级精品三级在 | 日韩中文久久| 精品乱码久久久久久夜夜嗨| 72种姿势欧美久久久久大黄蕉| 精品熟女少妇AV免费久久| 四虎影视久久久免费| 久久国产美女免费观看精品| 久久久青草久久久青草| 精品国产乱码久久久久久郑州公司| 久久亚洲中文字幕精品一区| 久久免费99精品国产自在现线| 中文字幕一区二区三区久久网站 | 秋霞久久国产精品电影院| 国产午夜精品久久久久免费视 | 色综合色天天久久婷婷基地| 99久久婷婷免费国产综合精品| 久久久久亚洲av无码专区喷水| 亚洲αv久久久噜噜噜噜噜| 免费无码国产欧美久久18| 久久WWW免费人成一看片| 麻豆久久久9性大片| 久久久久久久波多野结衣高潮| 久久国产亚洲精品|