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

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

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

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

            第二步:實(shí)現(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宏,建立的消息映射。

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

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

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

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

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

            其他鏈接: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 王海光 閱讀(1968) | 評論 (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)境變量,并以此給出諸如文件搜索路徑,存放臨時(shí)文件的目錄等與系統(tǒng)和用戶相關(guān)的環(huán)境變量。下表列出了用于環(huán)境變量訪問的函數(shù)。

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

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

               下面的給出的代碼演示了對進(jìn)程的環(huán)境變量進(jì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("<進(jìn)程的環(huán)境變量測試程序>");
            11 
            12     BOOL bRet=SetEnvironmentVariable(sEnvironmentName,sEnvironmentValue);
            13       if (bRet == TRUE) AfxMessageBox("環(huán)境變量設(shè)置完畢!");
            14                  else AfxMessageBox("環(huán)境變量設(shè)置失敗!"); 
            15     }else{
            16            // 如果環(huán)境變量存在,顯示環(huán)境變量內(nèi)容
            17             CString sMessage("環(huán)境變量PUBLIC值為:");
            18             sMessage += CString(cBuffer);
            19             AfxMessageBox(sMessage);
            20     }


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


            posted @ 2012-04-17 12:21 王海光 閱讀(1761) | 評論 (0)編輯 收藏
            VBS中啟動(dòng)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中啟動(dòng)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í)際參數(shù)是"C:\Program Files\Test\AutoUpdateEx.exe",因?yàn)閹Э崭瘢葘⑺ㄆ饋碜鳛橐粋€(gè)整體,而兩側(cè)的"按要求應(yīng)該用轉(zhuǎn)義""表示,故成為""C:\Program Files\Test\AutoUpdateEx.exe"",而Run本身調(diào)用參數(shù)就得在外部加一對引號,故共有三對引號。用msgbox"""C:\Program Files\Test\AutoUpdateEx.exe"""可驗(yàn)證結(jié)果為"C:\Program Files\Test\AutoUpdateEx.exe"。對于Run方法,可以統(tǒng)一都用三個(gè)引號,ws.Run"""C:\"""同樣可以解析;本例也可用ws.Run"C:\progra~1\Test\AutoUpdateEx.exe"來實(shí)現(xiàn)。

            posted @ 2012-04-16 12:41 王海光 閱讀(2904) | 評論 (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     //如果無法查詢有關(guān)的注冊表信息,設(shè)置相關(guān)注冊表信息
            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("打開打印機(jī)注冊表項(xiàng)%s失敗", sPrinterRegPath);
             7         return FALSE;
             8     }
             9 
            10     DWORD    dwTypeString = REG_SZ;
            11     DWORD    len = 255;
            12     DWORD    dwValue;
            13     DWORD   dwData = 1;
            14     //如果存在有關(guān)的注冊表信息,修改相關(guān)注冊表信息
            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 王海光 閱讀(1031) | 評論 (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,3,5 
            posted @ 2012-04-13 15:01 王海光 閱讀(380) | 評論 (0)編輯 收藏
            相關(guān)文章鏈接:

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


            Hadoop

            一個(gè)分布式系統(tǒng)基礎(chǔ)架構(gòu),由Apache基金會(huì)開發(fā)。用戶可以在不了解分布式底層細(xì)節(jié)的情況下,開發(fā)分布式程序。充分利用集群的威力高速運(yùn)算和存儲(chǔ)。Hadoop實(shí)現(xiàn)了一個(gè)分布式文件系統(tǒng)(Hadoop Distributed File System),簡稱HDFS。HDFS有著高容錯(cuò)性的特點(diǎn),并且設(shè)計(jì)用來部署在低廉的(low-cost)硬件上。而且它提供高傳輸率(high throughput)來訪問應(yīng)用程序的數(shù)據(jù),適合那些有著超大數(shù)據(jù)集(large data set)的應(yīng)用程序。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)可能會(huì)有以下的別名來稱呼:
              ■ 架站程序(或軟件
              ■ 快速架站程序(或軟件)
              ■ 整站程序
            posted @ 2012-04-13 12:35 王海光 閱讀(485) | 評論 (0)編輯 收藏
            本文轉(zhuǎn)自:http://www.shnenglu.com/humanchao/archive/2008/07/24/57063.html

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

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

            點(diǎn)擊下載
            posted @ 2012-04-13 12:05 王海光 閱讀(667) | 評論 (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 王海光 閱讀(804) | 評論 (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í),要把帶參數(shù)的命令寫入另外一個(gè)新的BAT中,執(zhí)行新BAT:

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

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

            我們先看一個(gè)函數(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ù),當(dāng)參數(shù)不正確的時(shí)候不光要在返回值上得到體現(xiàn),而且會(huì)觸發(fā)assert斷言,提醒我們參數(shù)有誤。

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

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

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

            斷言不僅可以出現(xiàn)在函數(shù)的參數(shù)檢查的場合,也可以出現(xiàn)在其他的上下文調(diào)用的場合。而且它還會(huì)隨著程序的開發(fā)進(jìn)程逐漸的增加、刪除和調(diào)整。它可以驗(yàn)證程序是按照我們預(yù)想的思路在執(zhí)行,當(dāng)出現(xiàn)意外時(shí)及時(shí)的給出提醒,提醒我們修正程序或者自己的思路。
            posted @ 2012-04-12 12:58 王海光 閱讀(641) | 評論 (0)編輯 收藏
            僅列出標(biāo)題
            共27頁: First 19 20 21 22 23 24 25 26 27 
            久久国产精品波多野结衣AV| 亚洲色欲久久久综合网东京热| 久久精品99久久香蕉国产色戒| 久久久久久国产精品免费无码 | 久久久噜噜噜久久中文字幕色伊伊| 国产精品美女久久福利网站| 久久久噜噜噜久久中文福利| 久久国产精品波多野结衣AV| 亚洲国产精品无码久久久蜜芽 | 亚洲精品乱码久久久久久不卡| 久久久久久精品无码人妻| 久久久久久综合一区中文字幕| 久久影院午夜理论片无码| 久久夜色精品国产噜噜亚洲AV| 丁香久久婷婷国产午夜视频| 国色天香久久久久久久小说| 久久99国产精品成人欧美| 久久久精品国产sm调教网站| 日本精品一区二区久久久| 久久久精品午夜免费不卡| 日韩精品久久无码中文字幕| 精品欧美一区二区三区久久久| 九九精品99久久久香蕉| 久久精品国产精品亚洲精品| 久久精品无码专区免费 | 99久久国产综合精品麻豆| 亚洲欧美国产日韩综合久久 | AAA级久久久精品无码区| 无码精品久久久久久人妻中字| 色婷婷噜噜久久国产精品12p| 国产成人久久AV免费| 久久天天躁狠狠躁夜夜96流白浆 | 久久精品国产福利国产琪琪| 亚洲国产精品久久久久| 日韩乱码人妻无码中文字幕久久| 久久99国产精品久久99小说| 伊人久久精品影院| 伊人久久一区二区三区无码| 一本大道久久香蕉成人网| 久久精品国产99久久久香蕉| 一级做a爰片久久毛片人呢|