• <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>

            一、CStatic從文件夾加載位圖

            HBITMAP hbitmap;
            //獲得指向靜態控件的指針
            CStatic *pStatic=(CStatic *)GetDlgItem(IDC_SHOWBMP);
            //獲得位圖句柄
            HBITMAP Bitmap;
            //設置靜態控件的樣式,使其可以使用位圖,并試位標顯示使居中
            pStatic->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
            //設置靜態控件顯示位圖
            pStatic->SetBitmap(hBitmap);

            二、設置對話框背景(小圖可以漫延填充)

            1、把你的圖包含到程序的“Bitmap資源里,提示說該資源使用了大于256色的調色板,在VC里無法編輯等等,點確定就可以

            2定位到 void CXXXDlg::OnPaint(),在if()...else()中的else()下添加如下代碼
            else
            {
            //CDialog::OnPaint();//
            要禁止這個調用
            CPaintDC dc(this);
            CRect rect;
            GetClientRect(&rect);
            CDC dcMem;
            dcMem.CreateCompatibleDC(&dc);
            CBitmap bmpBackground;
            bmpBackground.LoadBitmap(IDB_BITMAP);
            //IDB_BITMAP
            是你自己的圖對應的ID
            BITMAP bitmap;
            bmpBackground.GetBitmap(&bitmap);
            CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
            dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,
                    bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
            }

            三、CStatic控件透明

            可以這樣作的:
            HBRUSH CShutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
            {
            HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

            //讓所有的靜態文本都透明好顯示背景色
            if(nCtlColor   ==   CTLCOLOR_DLG)  
            {  
                    //返回對話框的顏色  
               hbr=(HBRUSH)::CreateSolidBrush(RGB(146,161,202));    
            }  
            if(nCtlColor==CTLCOLOR_STATIC)  
            {  
               //讓靜態文本框透明  
               pDC->SetBkMode(TRANSPARENT);  
               //pDC->SetTextColor(RGB(255,255,255));   //設置字體顏色白色  
               hbr=(HBRUSH)::GetStockObject(NULL_BRUSH);  
            }  
            if (nCtlColor==CTLCOLOR_EDIT)//設置EDIT控件的顏色
            {
               HBRUSH hbr1 = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
               hbr1=(HBRUSH)::CreateSolidBrush(RGB(0,0,0)); //背景黑色
               pDC->SetTextColor(RGB(255,255,255)); //文字白色
               pDC->SetBkMode(TRANSPARENT);  
               return hbr1;
            }
            return hbr;
            }

            四、CStatic背景透明后文本覆蓋的問題

            http://blog.vckbase.com/hatemath/archive/2005/08/04/10485.aspx


            posted @ 2011-08-26 14:49 wrh 閱讀(2520) | 評論 (0)編輯 收藏

            作用:
            讀取DC的一些打印區域信息,主要是像素和英寸方面的數據.

            聲明:
            GetDeviceCaps(int )

            使用例子:
            //所有像素數
            int pagecx=dc.GetDeviceCaps(HORZRES);
            int pagecy=dc.GetDeviceCaps(VERTRES);

            //即每英寸點數
            short cxInch = dc.GetDeviceCaps(LOGPIXELSX);
            short cyInch = dc.GetDeviceCaps(LOGPIXELSY);

            // 計算一個設備單位等于多少0.1mm
            double scaleX = 254.0 / (double)GetDeviceCaps(dc.m_hAttribDC,LOGPIXELSX);
            double scaleY = 254.0 / (double)GetDeviceCaps(dc.m_hAttribDC, LOGPIXELSY);


            說明:
            主要用到的參數見例子中的:HORZRES,VERTRES,LOGPIXELSX,LOGPIXELSY.總的來說是為了方便控制打印或重畫時的控制,如為了定制打印時,一般依據的是物理的長度,而不是像素,而DC一般是用像素的映射模式,所以需要一下轉換,上面這個函數就為這種轉換設計的.

             

             

            GDI中有一個函數是GetDeviceCaps(),可以獲取一些關于設備的一些屬性,如HORZSIZE/HORZRES/LOGPIXELSX等。
                以上三者的關系通常滿足:HORZSIZE = 25.4 * HORZRES/LOGPIXELSX
                HORZSIZE為屏幕水平尺寸(定為度量尺寸,以mm計),HORZRES為水平的像素總數(定為像素大小,平時所說的屏幕分辨率,但在這不這么稱呼。這里,分辨率定為“每英寸的像素數”),LOGPIXELSX為邏輯像素(假設的每英寸的像素數,并不是剛才所說的實際的“分辨率”)。因此HORZSIZE也稱為邏輯寬度
                當我們選擇“顯示”屬性里的大字體時,LOGPIXELSX(通常分為96dpi與120dpi)變大了,這樣假設原來的字體為10磅,則原來的字體橫向所占像素(實際所占的像素數)為10*(1/72)*LOGPIXELSX,現在LOGPIXELSX變大了,則字體所占像素也大了,因此看起來字體大了。如果HORZRES不變的話,則HORZSIZE應該變小。然后這是和Windows有關的,在16位OS中,HORZSIZE值是固定的。
                在XP系統上驗證了一下,發現HORZSIZE值與LOGPIXELSX的值也是不變的,如果改變HORZRES的話,則HORZSIZE會發生相應變化,但LOGPIXELSX不變,一直是96。
                驗證數值是:當HORZRES/VERTRES分別為800/600、1280/1024、1360/768時,LOGPIXELSX/LOGPIXELSY一直為96,但HORZSIZE/VERTSIZE分別為320/240、375/300、400/320。于是個人斷定:LOGPIXELSX/LOGPIXELSY與所選的字體(如TrueType)有關,windows默認的字體LOGPIXELSX/LOGPIXELSY值是定的,選大字體或小字體取它們的值都是一樣的,而一些字體是不同的。而HORZSIZE/VERTSIZE與系統版本有關,在有的系統中,這兩個值是適合此分辨率的標準顯示器的尺寸(定值,長寬比與分辨率的比一樣),不是通過公式計算的,也不等于公式計算的值;而有的系統版本這兩個值為公式所得的值。
                下邊是petzold那本書上的兩句(沒摘英文的):“

            然而,在Windows NT中,用老的方法定義HORZSIZE和VERTSIZE值。這種方法與Windows的16位版本一致。HORZRES和VERTRES值仍然表示水平和垂直圖素的數值,LOGPIXELSX和LOGPIXELSY仍然與在「控制臺」的「顯示器」程序中選擇的字體有關。在Windows 98中,LOGPIXELSX和LOGPIXELSY的典型值是96和120 dpi,這取決于您選擇的是小字體還是大字體。

            在Windows NT中的區別是HORZSIZE和VERTSIZE值固定表示標準顯示器大小。對于普通的顯示卡,取得的HORZSIZE和VERTSIZE值分別是320和240毫米。這些值是相同的,與選擇的圖素大小無關。因此,這些值與用HORZRES、VERTRES、LOGPIXELSX和LOGPIXELSY索引從GetDeviceCaps中得到的值不同。然而,可以用前面的公式計算在Windows 98下的HORZSIZE和VERTSIZE值。

             

             

            HFONT CreateFont(
                             int nHeight,           //字體的高度
                            
            int nWidth,            //字體的寬度
                             int nEscapement,       //字體顯示的角度
                             int nOrientation,      //字體的角度
                             int nWeight,           //字體的磅數
                             BYTE bItalic,          //斜體字體
                             BYTE bUnderline,       //帶下劃線的字體
                             BYTE cStrikeOut,       //帶刪除線的字體
                             BYTE nCharSet,         //所需的字符集
                             BYTE nOutPrecision,    //輸出的精度
                             BYTE nClipPrecision,   //裁減的精度
                             BYTE nQuality,         //邏輯字體與輸出設備的實際
                                                    //字體之間的精度
                             BYTE nPitchAndFamily,  //字體間距和字體集
                             LPCTSTR lpszFacename   //字體名稱
                           );
             
                示例:
             
            /************************************************************************/
            HFONT hFont;
            HDC hDC;
            hFont=CreateFont(10,10,0,0,FW_THIN,true,false,false,
            CHINESEBIG5_CHARSET,OUT_CHARACTER_PRECIS,
            CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,
            FF_MODERN,"宋體");
            SelectObject(hDC,hFont);
            /************************************************************************/
            posted @ 2011-08-26 14:46 wrh 閱讀(1606) | 評論 (0)編輯 收藏
                 摘要: // Modifying DACL of an object. In ACL there are ACEs... // Here we are going to add deny standard right // access for Administrators group. This Win XP machine is // logged in by user named Mike s...  閱讀全文
            posted @ 2011-08-23 13:41 wrh 閱讀(453) | 評論 (1)編輯 收藏

            一般Windows下的系統文件(夾)只讓受限帳戶讀取而不讓寫入和修改。如果要開啟寫操作權限就需要手動修改文件(夾)的用戶帳戶安全權限(這操作當然要在管理員帳戶下執行).以下用程序封裝了一下該操作:

              先來個API版本:

              //

              // 啟用某個賬戶對某個文件(夾)的所有操作權限

              // pszPath: 文件(夾)路徑

              // pszAccount: 賬戶名稱

              //

              BOOL  EnableFileAccountPrivilege (PCTSTR pszPath, PCTSTR pszAccount)

              {

              BOOL bSuccess = TRUE;

              PACL pNewDacl = NULL, pOldDacl = NULL;

              EXPLICIT_ACCESS ea;

              do

              {

              // 獲取文件(夾)安全對象的DACL列表

              if (ERROR_SUCCESS != ::GetNamedSecurityInfo ((LPTSTR)pszPath, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDacl, NULL, NULL))

              {

              bSuccess  =  FALSE;

              break;

              }

              // 此處不可直接用AddAccessAllowedAce函數,因為已有的DACL長度是固定,必須重新創建一個DACL對象

              // 生成指定用戶帳戶的訪問控制信息(這里指定賦予全部的訪問權限)

              ::BuildExplicitAccessWithName (&ea, (LPTSTR)pszAccount, GENERIC_ALL, GRANT_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT);

              // 創建新的ACL對象(合并已有的ACL對象和剛生成的用戶帳戶訪問控制信息)

              if (ERROR_SUCCESS != ::SetEntriesInAcl(1, &ea, pOldDacl, &pNewDacl))

              {

              bSuccess   =  FALSE;

              break;

              }[next]

              // 設置文件(夾)安全對象的DACL列表

              if (ERROR_SUCCESS != ::SetNamedSecurityInfo ((LPTSTR)pszPath, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pNewDacl, NULL))

              {

              bSuccess   =  FALSE;

              }

              } while (FALSE);

              // 釋放資源

              if (pNewDacl != NULL)

              ::LocalFree(pNewDacl);

              return bSuccess;

              }ATL封裝了安全操作函數,用ATL來寫就簡單多了: //

              // 啟用某個賬戶對某個文件(夾)的所有操作權限(ATL版本)

              // pszPath: 文件(夾)路徑

              // pszAccount: 賬戶名稱

              //

              BOOL  AtlEnableFileAccountPrivilege (PCTSTR pszPath, PCTSTR pszAccount)

              {

              CDacl  dacl;

              CSid   sid;

              // 獲取用戶帳戶標志符

              if (!sid.LoadAccount (pszAccount))

              {

              return FALSE;

              }

              // 獲取文件(夾)的DACL

              if (!AtlGetDacl (pszPath, SE_FILE_OBJECT, &dacl))

              {

              return FALSE;

              }

              // 在DACL中添加新的ACE項

              dacl.AddAllowedAce (sid, GENERIC_ALL);

              // 設置文件(夾)的DACL

              return AtlSetDacl (pszPath, SE_FILE_OBJECT, dacl) ? TRUE : FALSE;

              }

            來源:http://www.uniuc.com/computer/show-6322-1.html\\\



            通過程序對文件夾的訪問權限進行控制。
            BOOL   My_SetFolderSecurity(WCHAR*   szPath)
            {
            SID_IDENTIFIER_AUTHORITY   sia   =   SECURITY_NT_AUTHORITY;
            PSID   pSidSystem   =   NULL;
            PSID   pSidAdmins   =   NULL;
            PSID   pSidWorld   =   NULL;
            PACL   pDacl   =   NULL;
            EXPLICIT_ACCESS   ea[4];
            SECURITY_DESCRIPTOR   SecDesc;

            ULONG   lRes   =   ERROR_SUCCESS;

            __try
            {
            //   create   SYSTEM   SID
            if   (!AllocateAndInitializeSid(&sia,   1,   SECURITY_LOCAL_SYSTEM_RID,
            0,   0,   0,   0,   0,   0,   0,   &pSidSystem))
            {
            lRes   =   GetLastError();
            __leave;
            }

            //   create   Local   Administrators   alias   SID
            if   (!AllocateAndInitializeSid(&sia,   2,   SECURITY_BUILTIN_DOMAIN_RID,
            DOMAIN_ALIAS_RID_ADMINS,   0,   0,   0,   0,  
            0,   0,   &pSidAdmins))
            {
            lRes   =   GetLastError();
            __leave;
            }


            //   create   Authenticated   users   well-known   group   SID
            if   (!AllocateAndInitializeSid(&sia,   1,   SECURITY_AUTHENTICATED_USER_RID,
            0,   0,   0,   0,   0,   0,   0,   &pSidWorld))
            {
            lRes   =   GetLastError();
            __leave;
            }

            //   fill   an   entry   for   the   SYSTEM   account
            ea[0].grfAccessMode   =   GRANT_ACCESS;
            ea[0].grfAccessPermissions   =   FILE_ALL_ACCESS;
            ea[0].grfInheritance   =   OBJECT_INHERIT_ACE|CONTAINER_INHERIT_ACE;
            ea[0].Trustee.MultipleTrusteeOperation   =   NO_MULTIPLE_TRUSTEE;
            ea[0].Trustee.pMultipleTrustee   =   NULL;
            ea[0].Trustee.TrusteeForm   =   TRUSTEE_IS_SID;
            ea[0].Trustee.TrusteeType   =   TRUSTEE_IS_WELL_KNOWN_GROUP;
            ea[0].Trustee.ptstrName   =   (LPTSTR)pSidSystem;

            //   fill   an   entry   entries   for   the   Administrators   alias
            ea[1].grfAccessMode   =   GRANT_ACCESS;
            ea[1].grfAccessPermissions   =   FILE_ALL_ACCESS;
            ea[1].grfInheritance   =   OBJECT_INHERIT_ACE|CONTAINER_INHERIT_ACE;
            ea[1].Trustee.MultipleTrusteeOperation   =   NO_MULTIPLE_TRUSTEE;
            ea[1].Trustee.pMultipleTrustee   =   NULL;
            ea[1].Trustee.TrusteeForm   =   TRUSTEE_IS_SID;
            ea[1].Trustee.TrusteeType   =   TRUSTEE_IS_ALIAS;
            ea[1].Trustee.ptstrName   =   (LPTSTR)pSidAdmins;

            //   fill   an   entry   for   the   Authenticated   users   well-known   group
            ea[2].grfAccessMode   =   GRANT_ACCESS;
            ea[2].grfAccessPermissions   =   FILE_GENERIC_READ|FILE_GENERIC_WRITE   ;
            ea[2].grfInheritance   =   OBJECT_INHERIT_ACE|CONTAINER_INHERIT_ACE;
            ea[2].Trustee.MultipleTrusteeOperation   =   NO_MULTIPLE_TRUSTEE;
            ea[2].Trustee.pMultipleTrustee   =   NULL;
            ea[2].Trustee.TrusteeForm   =   TRUSTEE_IS_SID;
            ea[2].Trustee.TrusteeType   =   TRUSTEE_IS_WELL_KNOWN_GROUP;
            ea[2].Trustee.ptstrName   =   (LPTSTR)pSidWorld;


            //   create   a   DACL
            lRes   =   SetEntriesInAcl(3,   ea,   NULL,   &pDacl);
            if   (lRes   !=   ERROR_SUCCESS)
            __leave;

            //   initialize   security   descriptor
            if(!InitializeSecurityDescriptor(&SecDesc,   SECURITY_DESCRIPTOR_REVISION))
            __leave   ;

            if(!SetSecurityDescriptorDacl(&SecDesc,   TRUE,   pDacl,   FALSE))
            __leave   ;

            //   assign   security   descriptor   to   the   key
            //lRes   =   RegSetKeySecurity(hKey,   DACL_SECURITY_INFORMATION,   &SecDesc);

            lRes   =   SR_SetFileSecurityRecursive(szPath,   DACL_SECURITY_INFORMATION,   &SecDesc);
            //lRes   =   SetFileSecurity(szPath,   DACL_SECURITY_INFORMATION,   &SecDesc);


            }
            __finally
            {
            if   (pSidSystem   !=   NULL)
            FreeSid(pSidSystem);
            if   (pSidAdmins   !=   NULL)
            FreeSid(pSidAdmins);
            if   (pSidWorld   !=   NULL)
            FreeSid(pSidWorld);
            if   (pDacl   !=   NULL)
            LocalFree((HLOCAL)pDacl);
            }

            SetLastError(lRes);
            return   lRes   !=   ERROR_SUCCESS;
            }  


            Command   what   is   yours
            Conquer   what   is   not

            ==========================================================
            我解決了,在MSDN里找到的
            (取自MSDN)

            #define   _WIN32_WINNT   0x0500

            #include   <windows.h>
            #include   <sddl.h>
            #include   <stdio.h>

            BOOL   CreateMyDACL(SECURITY_ATTRIBUTES   *);

            void   main()
            {
            SECURITY_ATTRIBUTES     sa;

            sa.nLength   =   sizeof(SECURITY_ATTRIBUTES);
            sa.bInheritHandle   =   FALSE;    

            //   Call   function   to   set   the   DACL.   The   DACL
            //   is   set   in   the   SECURITY_ATTRIBUTES  
            //   lpSecurityDescriptor   member.
            if   (!CreateMyDACL(&sa))
            {
            //   Error   encountered;   generate   message   and   exit.
            printf( "Failed   CreateMyDACL\n ");
            exit(1);
            }

            //   Use   the   updated   SECURITY_ATTRIBUTES   to   specify
            //   security   attributes   for   securable   objects.
            //   This   example   uses   security   attributes   during
            //   creation   of   a   new   directory.
            if   (0   ==   CreateDirectory(TEXT( "C:\\MyFolder "),   &sa))
            {
            //   Error   encountered;   generate   message   and   exit.
            printf( "Failed   CreateDirectory\n ");
            exit(1);
            }

            //   Free   the   memory   allocated   for   the   SECURITY_DESCRIPTOR.
            if   (NULL   !=   LocalFree(sa.lpSecurityDescriptor))
            {
            //   Error   encountered;   generate   message   and   exit.
            printf( "Failed   LocalFree\n ");
            exit(1);
            }
            }

            BOOL   CreateMyDACL(SECURITY_ATTRIBUTES   *   pSA)
            {
            TCHAR   *   szSD   =   TEXT( "D: ")               //   Discretionary   ACL
            TEXT( "(D;OICI;GA;;;BG) ")           //   Deny   access   to   built-in   guests
            TEXT( "(D;OICI;GA;;;AN) ")           //   Deny   access   to   anonymous   logon
            TEXT( "(A;OICI;GRGWGX;;;AU) ")   //   Allow   read/write/execute   to   authenticated   users
            TEXT( "(A;OICI;GA;;;BA) ");         //   Allow   full   control   to   administrators

            if   (NULL   ==   pSA)
            return   FALSE;

            return   ConvertStringSecurityDescriptorToSecurityDescriptor(
            szSD,
            SDDL_REVISION_1,
            &(pSA-> lpSecurityDescriptor),
            NULL);
            }

            posted @ 2011-08-23 13:02 wrh 閱讀(7918) | 評論 (0)編輯 收藏
            1 echo 和 @
            回顯命令
            @ #關閉單行回顯
            echo off #從下一行開始關閉回顯
            @echo off #從本行開始關閉回顯。一般批處理第一行都是這個
            echo on #從下一行開始打開回顯
            echo #顯示當前是 echo off 狀態還是 echo on 狀態
            echo. #輸出一個”回車換行”,空白行
            #(同echo, echo; echo+ echo[ echo] echo/ echo\)

            2 errorlevel
            echo %errorlevel%
            每個命令運行結束,可以用這個命令行格式查看返回碼
            默認值為0,一般命令執行出錯會設 errorlevel 為1

            3 dir
            顯示文件夾內容
            dir #顯示當前目錄中的文件和子目錄
            dir /a #顯示當前目錄中的文件和子目錄,包括隱藏文件和系統文件
            dir c: /a:d #顯示 C 盤當前目錄中的目錄
            dir c: /a:-d #顯示 C 盤根目錄中的文件
            dir c:\ /b/p #/b只顯示文件名,/p分頁顯示
            dir *.exe /s #顯示當前目錄和子目錄里所有的.exe文件

            4 cd
            切換目錄
            cd\ #進入根目錄
            cd #顯示當前目錄
            cd /d d:\sdk #可以同時更改盤符和目錄

            5 md
            創建目錄
            md d:\a\b\c #如果 d:\a 不存在,將會自動創建中級目錄
            D A J p(|0#如果命令擴展名被停用,則需要鍵入 mkdir \a\b\c。

            6 rd
            刪除目錄
            rd abc #刪除當前目錄里的 abc 子目錄,要求為空目錄
            rd /s/q d:\temp #刪除 d:\temp 文件夾及其子文件夾和文件,/q安靜模式

            7 del
            刪除文件
            del d:\test.txt #刪除指定文件,不能是隱藏、系統、只讀文件
            del /q/a/f d:\temp\*.*
            刪除 d:\temp 文件夾里面的所有文件,包括隱藏、只讀、系統文件,不包括子目錄
            del /q/a/f/s d:\temp\*.*
            刪除 d:\temp 及子文件夾里面的所有文件,包括隱藏、只讀、系統文件,不包括子目錄

            8 ren
            重命名命令
            ren d:\temp tmp #支持對文件夾的重命名

            9 cls
            清屏
            10 type
            顯示文件內容
            type c:\boot.ini #顯示指定文件的內容,程序文件一般會顯示亂碼
            type *.txt #顯示當前目錄里所有.txt文件的內容

            11 copy
            拷貝文件
            copy c:\test.txt d:\test.bak
            復制 c:\test.txt 文件到 d:\ ,并重命名為 test.bak
            copy con test.txt
            從屏幕上等待輸入,按 Ctrl+Z 結束輸入,輸入內容存為test.txt文件
            con代表屏幕,prn代表打印機,nul代表空設備
            copy 1.txt + 2.txt 3.txt
            合并 1.txt 和 2.txt 的內容,保存為 3.txt 文件
            如果不指定 3.txt ,則保存到 1.txt
            copy test.txt +
            復制文件到自己,實際上是修改了文件日期

            12 title
            設置cmd窗口的標題
            title 新標題 #可以看到cmd窗口的標題欄變了

            13 ver
            顯示系統版本

            14 label 和 vol
            設置卷標
            vol #顯示卷標
            label #顯示卷標,同時提示輸入新卷標
            label c:system #設置C盤的卷標為 system

            15 pause
            暫停命令

            16 rem 和 ::
            注釋命令
            注釋行不執行操作

            17 date 和 time
            日期和時間
            date #顯示當前日期,并提示輸入新日期,按\"回車\"略過輸入
            date/t #只顯示當前日期,不提示輸入新日期
            time #顯示當前時間,并提示輸入新時間,按\"回車\"略過輸入
            time/t #只顯示當前時間,不提示輸入新時間

            18 goto 和 :
            跳轉命令
            :label #行首為:表示該行是標簽行,標簽行不執行操作
            goto label #跳轉到指定的標簽那一行

            19 find (外部命令)
            查找命令
            find \"abc\" c:\test.txt
            在 c:\test.txt 文件里查找含 abc 字符串的行
            如果找不到,將設 errorlevel 返回碼為1
            find /i “abc” c:\test.txt
            查找含 abc 的行,忽略大小寫
            find /c \"abc\" c:\test.txt
            顯示含 abc 的行的行數

            20 more (外部命令)
            逐屏顯示
            more c:\test.txt #逐屏顯示 c:\test.txt 的文件內容

            21 tree
            顯示目錄結構
            tree d:\ #顯示D盤的文件目錄結構

            22 &
            順序執行多條命令,而不管命令是否執行成功

            23 &&
            順序執行多條命令,當碰到執行出錯的命令后將不執行后面的命令
            find \"ok\" c:\test.txt && echo 成功
            如果找到了\"ok\"字樣,就顯示\"成功\",找不到就不顯示

            24 ||
            順序執行多條命令,當碰到執行正確的命令后將不執行后面的命令
            find \"ok\" c:\test.txt || echo 不成功
            如果找不到\"ok\"字樣,就顯示\"不成功\",找到了就不顯示

            25 |
            管道命令
            dir *.* /s/a | find /c \".exe\"
            管道命令表示先執行 dir 命令,對其輸出的結果執行后面的 find 命令
            該命令行結果:輸出當前文件夾及所有子文件夾里的.exe文件的個數
            type c:\test.txt|more
            這個和 more c:\test.txt 的效果是一樣的

            26 > 和 >>
            輸出重定向命令
            > 清除文件中原有的內容后再寫入
            >> 追加內容到文件末尾,而不會清除原有的內容
            主要將本來顯示在屏幕上的內容輸出到指定文件中
            指定文件如果不存在,則自動生成該文件
            type c:\test.txt >prn
            屏幕上不顯示文件內容,轉向輸出到打印機
            echo hello world>con
            在屏幕上顯示hello world,實際上所有輸出都是默認 >con 的
            copy c:\test.txt f: >nul
            拷貝文件,并且不顯示\"文件復制成功\"的提示信息,但如果f盤不存在,還是會顯示出錯信息
            copy c:\test.txt f: >nul 2>nul
            不顯示”文件復制成功”的提示信息,并且f盤不存在的話,也不顯示錯誤提示信息
            echo ^^W ^> ^W>c:\test.txt
            生成的文件內容為 ^W > W
            ^ 和 > 是控制命令,要把它們輸出到文件,必須在前面加個 ^ 符號

            27 <
            從文件中獲得輸入信息,而不是從屏幕上
            一般用于 date time label 等需要等待輸入的命令
            @echo off
            echo 2005-05-01>temp.txt
            date <temp.txt
            del temp.txt
            這樣就可以不等待輸入直接修改當前日期

            28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
            命令行傳遞給批處理的參數
            %0 批處理文件本身
            %1 第一個參數
            %9 第九個參數
            %* 從第一個參數開始的所有參數

            批參數(%n)的替代已被增強。您可以使用以下語法:

            %~1 - 刪除引號(\"),擴充 %1
            %~f1 - 將 %1 擴充到一個完全合格的路徑名
            %~d1 - 僅將 %1 擴充到一個驅動器號
            %~p1 - 僅將 %1 擴充到一個路徑
            %~n1 - 僅將 %1 擴充到一個文件名
            %~x1 - 僅將 %1 擴充到一個文件擴展名
            %~s1 - 擴充的路徑指含有短名
            %~a1 - 將 %1 擴充到文件屬性
            %~t1 - 將 %1 擴充到文件的日期/時間
            %~z1 - 將 %1 擴充到文件的大小
            %~$PATH : 1 - 查找列在 PATH 環境變量的目錄,并將 %1
            擴充到找到的第一個完全合格的名稱。如果環境
            變量名未被定義,或者沒有找到文件,此組合鍵會
            擴充到空字符串

            可以組合修定符來取得多重結果:

            %~dp1 - 只將 %1 擴展到驅動器號和路徑
            %~nx1 - 只將 %1 擴展到文件名和擴展名
            %~dp$PATH:1 - 在列在 PATH 環境變量中的目錄里查找 %1,
            并擴展到找到的第一個文件的驅動器號和路徑。
            %~ftza1 - 將 %1 擴展到類似 DIR 的輸出行。
            可以參照 call/? 或 for/? 看出每個參數的含意
            echo load \"%%1\" \"%%2\">c:\test.txt
            生成的文件內容為 load \"%1\" \"%2\"
            批處理文件里,用這個格式把命令行參數輸出到文件

            29 if
            判斷命令
            if \"%1\"==\"/a\" echo 第一個參數是/a
            if /i \"%1\" equ \"/a\" echo 第一個參數是/a
            /i 表示不區分大小寫,equ 和 == 是一樣的,其它運算符參見 if/?
            if exist c:\test.bat echo 存在c:\test.bat文件
            if not exist c:\windows (
            echo 不存在c:\windows文件夾

            if exist c:\test.bat (
            echo 存在c:\test.bat
            ) else (
            echo 不存在c:\test.bat
            )

            30 setlocal 和 endlocal
            設置”命令擴展名”和”延緩環境變量擴充”

            SETLOCAL ENABLEEXTENSIONS #啟用\"命令擴展名\"
            SETLOCAL DISABLEEXTENSIONS #停用\"命令擴展名\"
            SETLOCAL ENABLEDELAYEDEXPANSION #啟用\"延緩環境變量擴充\"
            SETLOCAL DISABLEDELAYEDEXPANSION #停用\"延緩環境變量擴充\"
            ENDLOCAL #恢復到使用SETLOCAL語句以前的狀態
            “命令擴展名”默認為啟用
            “延緩環境變量擴充”默認為停用
            批處理結束系統會自動恢復默認值
            可以修改注冊表以禁用\"命令擴展名\",詳見 cmd /? 。所以用到\"命令擴展名\"的程
            序,建議在開頭和結尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 語句,以確
            保程序能在其它系統上正確運行
            “延緩環境變量擴充\”主要用于 if 和 for 的符合語句,在 set 的說明里有其實用例程

            31 set
            設置變量
            引用變量可在變量名前后加 % ,即 %變量名%
            set #顯示目前所有可用的變量,包括系統變量和自定義的變量
            echo %SystemDrive% #顯示系統盤盤符。系統變量可以直接引用
            set p #顯示所有以p開頭的變量,要是一個也沒有就設errorlevel=1
            set p=aa1bb1aa2bb2 #設置變量p,并賦值為 = 后面的字符串,即aa1bb1aa2bb2
            echo %p% #顯示變量p代表的字符串,即aa1bb1aa2bb2
            echo %p:~6% #顯示變量p中第6個字符以后的所有字符,即aa2bb2
            echo %p:~6,3% #顯示第6個字符以后的3個字符,即aa2
            echo %p:~0,3% #顯示前3個字符,即aa1
            echo %p:~-2% #顯示最后面的2個字符,即b2
            echo %p:~0,-2% #顯示除了最后2個字符以外的其它字符,即aa1bb1aa2b
            echo %p:aa=c% #用c替換變量p中所有的aa,即顯示c1bb1c2bb2
            echo %p:aa=% #將變量p中的所有aa字符串置換為空,即顯示1bb12bb2
            echo %p:*bb=c% #第一個bb及其之前的所有字符被替換為c,即顯示c1aa2bb2
            set p=%p:*bb=c% #設置變量p,賦值為 %p:*bb=c% ,即c1aa2bb2
            set /a p=39 #設置p為數值型變量,值為39
            set /a p=39/10 #支持運算符,有小數時用去尾法,39/10=3.9,去尾得3,p=3
            set /a p=p/10 #用 /a 參數時,在 = 后面的變量可以不加%直接引用
            set /a p=”1&0″ #”與”運算,要加引號。其它支持的運算符參見set/?
            set p= #取消p變量
            set /p p=請輸入
            屏幕上顯示”請輸入”,并會將輸入的字符串賦值給變量p
            注意這條可以用來取代 choice 命令
            注意變量在 if 和 for 的復合語句里是一次性全部替換的,如
            @echo off
            set p=aaa
            if %p%==aaa (
            echo %p%
            set p=bbb
            echo %p%
            )
            結果將顯示
            aaa
            aaa
            因為在讀取 if 語句時已經將所有 %p% 替換為aaa
            這里的\"替換\",在 /? 幫助里就是指\"擴充\"、\"環境變量擴充\"
            可以啟用”延緩環境變量擴充”,用 ! 來引用變量,即 !變量名!
            @echo off
            SETLOCAL ENABLEDELAYEDEXPANSION
            set p=aaa
            if %p%==aaa (
            echo %p%
            set p=bbb
            echo !p!
            )
            ENDLOCAL
            結果將顯示
            aaa
            bbb
            還有幾個動態變量,運行 set 看不到
            %CD% #代表當前目錄的字符串
            %DATE% #當前日期
            %TIME% #當前時間
            %RANDOM% #隨機整數,介于0~32767
            %ERRORLEVEL% #當前 ERRORLEVEL 值
            %CMDEXTVERSION% #當前命令處理器擴展名版本號
            %CMDCMDLINE% #調用命令處理器的原始命令行
            可以用echo命令查看每個變量值,如 echo %time%
            注意 %time% 精確到毫秒,在批處理需要延時處理時可以用到

            32 start
            批處理中調用外部程序的命令,否則等外部程序完成后才繼續執行剩下的指令

            33 call
            批處理中調用另外一個批處理的命令,否則剩下的批處理指令將不會被執行
            有時有的應用程序用start調用出錯的,也可以call調用

            34 choice (外部命令)
            選擇命令
            讓用戶輸入一個字符,從而選擇運行不同的命令,返回碼errorlevel為1234……
            win98里是choice.com
            win2000pro里沒有,可以從win98里拷過來
            win2003里是choice.exe
            choice /N /C y /T 5 /D y>nul
            延時5秒

            35 assoc 和 ftype
            文件關聯
            assoc 設置'文件擴展名'關聯,關聯到'文件類型'
            ftype 設置'文件類型'關聯,關聯到'執行程序和參數'
            當你雙擊一個.txt文件時,[url=file::;]windows[/url]并不是根據.txt直接判斷用 notepad.exe 打開
            而是先判斷.txt屬于 txtfile '文件類型'
            再調用 txtfile 關聯的命令行 txtfile=%SystemRoot%\system32\NOTEPAD.EXE %1
            可以在\"文件夾選項\"→\"文件類型\"里修改這2種關聯
            assoc #顯示所有'文件擴展名'關聯
            assoc .txt #顯示.txt代表的'文件類型',結果顯示 .txt=txtfile
            assoc .doc #顯示.doc代表的'文件類型',結果顯示 .doc=Word.Document.8
            assoc .exe #顯示.exe代表的'文件類型',結果顯示 .exe=exefile
            ftype #顯示所有'文件類型'關聯
            ftype exefile #顯示exefile類型關聯的命令行,結果顯示 exefile=\"%1\" %*
            assoc .txt=Word.Document.8
            設置.txt為word類型的文檔,可以看到.txt文件的圖標都變了
            assoc .txt=txtfile
            恢復.txt的正確關聯
            ftype exefile=\"%1\" %*
            恢復 exefile 的正確關聯
            如果該關聯已經被破壞,可以運行 command.com ,再輸入這條命令

            36 pushd 和 popd
            切換當前目錄
            @echo off
            c: & cd\ & md mp3 #在 C:\ 建立 mp3 文件夾
            md d:\mp4 #在 D:\ 建立 mp4 文件夾
            cd /d d:\mp4 #更改當前目錄為 d:\mp4
            pushd c:\mp3 #保存當前目錄,并切換當前目錄為 c:\mp3
            popd #恢復當前目錄為剛才保存的 d:\mp4

            37 for
            循環命令
            這個比較復雜,請對照 for/? 來看
            for %%i in (c: d: e: f:) do echo %%i
            依次調用小括號里的每個字符串,執行 do 后面的命令
            注意%%i,在批處理中 for 語句調用參數用2個%
            默認的字符串分隔符是\"空格鍵\",\"Tab鍵\",\"回車鍵\"
            for %%i in (*.txt) do find \"abc\" %%i
            對當前目錄里所有的txt文件執行 find 命令
            for /r . %%i in (*.txt) do find \"abc\" %%i
            在當前目錄和子目錄里所有的.txt文件中搜索包含 abc 字符串的行
            for /r . %%i in (.) do echo %%~pni
            顯示當前目錄名和所有子目錄名,包括路徑,不包括盤符
            for /r d:\mp3 %%i in (*.mp3) do echo %%i>>d:\mp3.txt
            把 d:\mp3 及其子目錄里的mp3文件的文件名都存到 d:\mp3.txt 里去
            for /l %%i in (2,1,8) do echo %%i
            生成2345678的一串數字,2是數字序列的開頭,8是結尾,1表示每次加1
            for /f %%i in ('set') do echo %%i
            對 set 命令的輸出結果循環調用,每行一個
            for /f \"eol=P\" %%i in ('set') do echo %%i
            取 set 命令的輸出結果,忽略以 P 開頭的那幾行
            for /f %%i in (d:\mp3.txt) do echo %%i
            顯示 d:\mp3.txt 里的每個文件名,每行一個,不支持帶空格的名稱
            for /f \"delims=\" %%i in (d:\mp3.txt) do echo %%i
            顯示 d:\mp3.txt 里的每個文件名,每行一個,支持帶空格的名稱
            for /f \"skip=5 tokens=4\" %%a in ('dir') do echo %%a
            對 dir 命令的結果,跳過前面5行,余下的每行取第4列
            每列之間的分隔符為默認的\"空格\"
            可以注意到 dir 命令輸出的前5行是沒有文件名的
            for /f \"tokens=1,2,3 delims=- \" %%a in ('date /t') do (
            echo %%a
            echo %%b
            echo %%c
            )
            對 date /t 的輸出結果,每行取1、2、3列
            第一列對應指定的 %%a ,后面的 %%b 和 %%c 是派生出來的,對應其它列
            分隔符指定為 - 和\"空格\",注意 delims=- 后面有個\"空格\"
            其中 tokens=1,2,3 若用 tokens=1-3 替換,效果是一樣的
            for /f \"tokens=2* delims=- \" %%a in ('date /t') do echo %%b
            取第2列給 %%a ,其后的列都給 %%b

            38 subst (外部命令)
            映射磁盤。
            subst z: \server\d #這樣輸入z:就可以訪問\server\d了
            subst z: /d #取消該映射
            subst #顯示目前所有的映時

            39 xcopy (外部命令)
            文件拷貝
            xcopy d:\mp3 e:\mp3 /s/e/i/y
            復制 d:\mp3 文件夾、所有子文件夾和文件到 e:\ ,覆蓋已有文件
            加 /i 表示如果 e:\ 沒有 mp3 文件夾就自動新建一個,否則會有詢問




            posted @ 2011-08-20 10:52 wrh 閱讀(432) | 評論 (0)編輯 收藏

            3、if結合errorlevel使用:
            說明:環境變量errorlevel的初始值為0,當一些命令執行不成功,就會返回一個數值,如:1 ,2 等
            IF-ERRORLEVEL
            測試代碼:
            復制代碼 代碼如下:
            @ECHO OFF
            XCOPY F:\test.bat D:\
            IF ERRORLEVEL 1 ECHO 文件拷貝失敗
            IF ERRORLEVEL 0 ECHO 成功拷貝文件

            如果文件拷貝成功,屏幕就會顯示“成功拷貝文件”,否則就會顯示“文件拷貝失敗”。
            IF ERRORLEVEL 是用來測試它的上一個DOS命令的返回值的,注意只是上一個命令的返回值,而且返回值必須依照從大到小次序順序判斷。
            因此下面的批處理文件是錯誤的:
            @ECHO OFF
            XCOPY C:\AUTOEXEC.BAT D:\
            IF ERRORLEVEL 0 ECHO 成功拷貝文件
            IF ERRORLEVEL 1 ECHO 未找到拷貝文件
            IF ERRORLEVEL 2 ECHO 用戶通過ctrl-c中止拷貝操作
            IF ERRORLEVEL 3 ECHO 預置錯誤阻止文件拷貝操作
            IF ERRORLEVEL 4 ECHO 拷貝過程中寫盤錯誤
            無論拷貝是否成功,后面的:
            未找到拷貝文件
            用戶通過ctrl-c中止拷貝操作
            預置錯誤阻止文件拷貝操作
            拷貝過程中寫盤錯誤
            都將顯示出來。
            復制代碼 代碼如下:
            附錄:
            以下就是幾個常用命令的返回值及其代表的意義:
            backup
            0 備份成功
            1 未找到備份文件
            2 文件共享沖突阻止備份完成
            3 用戶用ctrl-c中止備份
            4 由于致命的錯誤使備份操作中止
            diskcomp
            0 盤比較相同
            1 盤比較不同
            2 用戶通過ctrl-c中止比較操作
            3 由于致命的錯誤使比較操作中止
            4 預置錯誤中止比較
            diskcopy
            0 盤拷貝操作成功
            1 非致命盤讀/寫錯
            2 用戶通過ctrl-c結束拷貝操作
            3 因致命的處理錯誤使盤拷貝中止
            4 預置錯誤阻止拷貝操作
            format
            0 格式化成功
            3 用戶通過ctrl-c中止格式化處理
            4 因致命的處理錯誤使格式化中止
            5 在提示“proceed with format(y/n)?”下用戶鍵入n結束
            xcopy
            0 成功拷貝文件
            1 未找到拷貝文件
            2 用戶通過ctrl-c中止拷貝操作
            4 預置錯誤阻止文件拷貝操作
            5 拷貝過程中寫盤錯誤

            4、if還有一個特殊的用法就是可以用來檢測某個變量是否已經被定義
            用法示例:
            復制代碼 代碼如下:
            @echo off
            set "str1=ok"
            set "str2=no"
            if defined str1 echo str1已經被定義
            if defined str2 echo str2已經被定義
            if defined str3 (echo str3已經被定義) else echo str3 沒有被定義
            pause>nul



             

            if 命令示例詳解

            if,正如它E文中的意思,就是“如果”的意思,用來進行條件判斷。翻譯過來的意思就是:如果符合某一條件,便執行后面的命令。
            主要用來判斷,1、兩個“字符串”是否相等;2、兩個數值是大于、小于、等于,然后執行相應的命令。
            當然還有特殊用法,如結合errorlevel:if errorlevel 1 echo error
            或者結合defined(定義的意思):if defined test (echo It is defined) else echo It isn't defined

            用法示例:
            1、檢測字符串(注意,用if檢測字符串是否相等的時候,后面用的不是“=”,而是“==”):
            復制代碼 代碼如下:
            @echo off
            set "str=this is a test"
            REM 檢測變量%str%是否等于test,如果相等,顯示OK,否則顯示NO
            if "%str%"=="test" (echo OK) else echo NO
            pause>nul

            2、檢測數值:(注意,批處理中大于符號不能用:“>”,而用"gtr",其它的也類似)
            比較運算符一覽:
            EQU - 等于
            NEQ - 不等于
            LSS - 小于
            LEQ - 小于或等于
            GTR - 大于
            GEQ - 大于或等于
            檢測數值 20 是否大于 15演示代碼:
            復制代碼 代碼如下:
            @echo off
            set /a num1=20
            set /a num2=15
            if %num1% gtr %num2% echo %num1%大于%num2%
            if %num1% EQU %num2% echo %num1%等于%num2%
            if %num1% LSS %num2% echo %num1%小于%num2%
            pause>nul

             

            posted @ 2011-08-20 10:42 wrh 閱讀(8838) | 評論 (1)編輯 收藏

            在VC工程中添加多個RC文件


            rc2里面的格式跟普通的rc是一樣的文本格式,直接手工修改,也可以用VS打開修改.

             

            有時需要把VC_Project2工程的資源合到VC_Project1工程的資源中(*.rc文件), 通常的做法就是用文本的方式打開VC_Project2.rc和VC_Project1.rc然后人工的判斷拷貝粘貼了。

             

            其實我們可以直接把VC_Project2.rc文件添加到VC_Project1工程中, 但此時編譯可能會報下面錯誤

            1>CVTRES : fatal error CVT1100: 重復的資源。type:VERSION, name:1, language:0x0804

            1>LINK : fatal error LNK1123: 轉換到 COFF 期間失敗: 文件無效或損壞

             

            這個錯誤的意思就是資源定義重復了,其實重復也很正常,因為在創建VC_Project1和VC_Project2兩個工程時,很多代碼都是VC自動生成的,通常這些自動生成的代碼就是產生這個錯誤的原因了。

             

            解決辦法就是把其中一個(那肯定是后來添加進來的那一個了)(這里是VC_Project2.rc)rc文件中與工程本身的rc(這里是VC_Project1.rc)文件相同的部分刪掉即可。

             

            還要注意的是移了VC_Project2.rc文件過來, 必須要把VC_Project2工程中對應的cpp和h文件還有最重要的一個是VC_Project2工程的resource.h文件也要移到VC_Project1工程中。

             

            例子:

            具體步驟如下:

            1. 分別創建了TryRC和TryRC2的基于對話框的VC工程。

            并在TryRC2工程中添加了對話框 ID是IDC_DIALOG1, IDC_DIALOG1中添加了一個按鈕IDC_BUTTON1, IDC_DIALOG1綁定到CDlgR類中,兩個文件分別是DlgR.cpp和DlgR.h

             

            2. 看對比TryRC.rc和TryRC2.rc文件的內容

            TryRC.rc(TryRC2.rc和TryRC.rc內容基本一致,只是多了一個IDC_DIALOG1)

            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

            // Microsoft Visual C++ generated resource script.

            //

            #include "resource.h"

             

            #define APSTUDIO_READONLY_SYMBOLS

            /////////////////////////////////////////////////////////////////////////////

            //

            // Generated from the TEXTINCLUDE 2 resource.

            //

            #include "afxres.h"

             

            /////////////////////////////////////////////////////////////////////////////

            #undef APSTUDIO_READONLY_SYMBOLS

             

            /////////////////////////////////////////////////////////////////////////////

            // 中文(中華人民共和國) resources

             

            #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)

            #ifdef _WIN32

            LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

            #pragma code_page(936)

            #endif //_WIN32

             

            #ifdef APSTUDIO_INVOKED

            /////////////////////////////////////////////////////////////////////////////

            //

            // TEXTINCLUDE

            //

             

            1 TEXTINCLUDE

            BEGIN

                "resource.h\0"

            END

             

            2 TEXTINCLUDE

            BEGIN

                "#include ""afxres.h""\r\n"

                "\0"

            END

             

            3 TEXTINCLUDE

            BEGIN

                "#define _AFX_NO_SPLITTER_RESOURCES\r\n"

                "#define _AFX_NO_OLE_RESOURCES\r\n"

                "#define _AFX_NO_TRACKER_RESOURCES\r\n"

                "#define _AFX_NO_PROPERTY_RESOURCES\r\n"

                "\r\n"

                "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)\r\n"

                "LANGUAGE 4, 2\r\n"

                "#pragma code_page(936)\r\n"

                "#include ""res\\TryRC.rc2""  // 非Microsoft Visual C++ 編輯的資源\r\n"

                "#include ""afxres.rc""     // 標準組件\r\n"

                "#endif\r\n"

                "\0"

            END

             

            #endif    // APSTUDIO_INVOKED

             

             

            /////////////////////////////////////////////////////////////////////////////

            //

            // Icon

            //

             

            // Icon with lowest ID value placed first to ensure application icon

            // remains consistent on all systems.

            IDR_MAINFRAME           ICON                    "res\\TryRC.ico"

             

            /////////////////////////////////////////////////////////////////////////////

            //

            // Dialog

            //

             

            IDD_ABOUTBOX DIALOGEX 0, 0, 235, 55

            STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU

            CAPTION "關于TryRC"

            FONT 9, "宋體", 0, 0, 0x1

            BEGIN

                ICON            IDR_MAINFRAME,IDC_STATIC,11,17,20,20

                LTEXT           "TryRC 1.0 版",IDC_STATIC,40,10,119,8,SS_NOPREFIX

                LTEXT           "Copyright (C) 2010",IDC_STATIC,40,25,119,8

                DEFPUSHBUTTON   "確定",IDOK,178,7,50,16,WS_GROUP

            END

             

            IDD_TRYRC_DIALOG DIALOGEX 0, 0, 320, 200

            STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU

            EXSTYLE WS_EX_APPWINDOW

            CAPTION "TryRC"

            FONT 9, "宋體", 0, 0, 0x1

            BEGIN

                DEFPUSHBUTTON   "確定",IDOK,263,7,50,16

                PUSHBUTTON      "取消",IDCANCEL,263,25,50,16

                CTEXT           "TODO: 在此放置對話框控件。",IDC_STATIC,10,96,300,8

                PUSHBUTTON      "Button1",IDC_BUTTON1,7,7,50,14

            END

             

             

            /////////////////////////////////////////////////////////////////////////////

            //

            // Version

            //

             

            VS_VERSION_INFO VERSIONINFO

             FILEVERSION 1,0,0,1

             PRODUCTVERSION 1,0,0,1

             FILEFLAGSMASK 0x3fL

            #ifdef _DEBUG

             FILEFLAGS 0x1L

            #else

             FILEFLAGS 0x0L

            #endif

             FILEOS 0x4L

             FILETYPE 0x1L

             FILESUBTYPE 0x0L

            BEGIN

                BLOCK "StringFileInfo"

                BEGIN

                    BLOCK "080403a8"

                    BEGIN

                        VALUE "CompanyName", "TODO: <公司名>"

                        VALUE "FileDescription", "TODO: <文件說明>"

                        VALUE "FileVersion", "1.0.0.1"

                        VALUE "InternalName", "TryRC.exe"

                        VALUE "LegalCopyright", "TODO: (C) <公司名>。保留所有權利。"

                        VALUE "OriginalFilename", "TryRC.exe"

                        VALUE "ProductName", "TODO: <產品名>"

                        VALUE "ProductVersion", "1.0.0.1"

                    END

                END

                BLOCK "VarFileInfo"

                BEGIN

                    VALUE "Translation", 0x804, 936

                END

            END

             

             

            /////////////////////////////////////////////////////////////////////////////

            //

            // DESIGNINFO

            //

             

            #ifdef APSTUDIO_INVOKED

            GUIDELINES DESIGNINFO

            BEGIN

                IDD_ABOUTBOX, DIALOG

                BEGIN

                    LEFTMARGIN, 7

                    RIGHTMARGIN, 228

                    TOPMARGIN, 7

                    BOTTOMMARGIN, 48

                END

             

                IDD_TRYRC_DIALOG, DIALOG

                BEGIN

                    LEFTMARGIN, 7

                    RIGHTMARGIN, 313

                    TOPMARGIN, 7

                    BOTTOMMARGIN, 193

                END

            END

            #endif    // APSTUDIO_INVOKED

             

             

            /////////////////////////////////////////////////////////////////////////////

            //

            // String Table

            //

             

            STRINGTABLE

            BEGIN

                IDS_ABOUTBOX            "關于TryRC(&A)..."

            END

             

            #endif    // 中文(中華人民共和國) resources

            /////////////////////////////////////////////////////////////////////////////

             

             

             

            #ifndef APSTUDIO_INVOKED

            /////////////////////////////////////////////////////////////////////////////

            //

            // Generated from the TEXTINCLUDE 3 resource.

            //

            #define _AFX_NO_SPLITTER_RESOURCES

            #define _AFX_NO_OLE_RESOURCES

            #define _AFX_NO_TRACKER_RESOURCES

            #define _AFX_NO_PROPERTY_RESOURCES

             

            #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)

            LANGUAGE 4, 2

            #pragma code_page(936)

            #include "res\TryRC.rc2"  // 非Microsoft Visual C++ 編輯的資源

            #include "afxres.rc"     // 標準組件

            #endif

             

            /////////////////////////////////////////////////////////////////////////////

            #endif    // not APSTUDIO_INVOKED

            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

             

            3. 把TryRC2工程中的TryRC2.rc, DlgR.cpp, DlgR.h和resource.h添加到TryRC工程中,由于TryRC2工程resource.h與TryRC工程resource.h同名(也要注意其他文件的同名情況),所以我把TryRC2工程resource.h改名為resource1.h(如果不把他們放在同一個目錄應該就不用改名了)

             

            4. 此時編譯就會報上面說到的錯誤了。

            所以在這里就要修改TryRC2.rc文件, 修改后的文件如下:

            // Microsoft Visual C++ generated resource script.

            //

            #include "resource1.h"           // 看這里,修改了

             

            #define APSTUDIO_READONLY_SYMBOLS

            /////////////////////////////////////////////////////////////////////////////

            //

            // Generated from the TEXTINCLUDE 2 resource.

            //

            #include "afxres.h"

             

            /////////////////////////////////////////////////////////////////////////////

            #undef APSTUDIO_READONLY_SYMBOLS

             

            /////////////////////////////////////////////////////////////////////////////

            // 中文(中華人民共和國) resources

             

            #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)

            #ifdef _WIN32

            LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

            #pragma code_page(936)

            #endif //_WIN32

             

            #ifdef APSTUDIO_INVOKED

            /////////////////////////////////////////////////////////////////////////////

            //

            // TEXTINCLUDE

            //

             

            1 TEXTINCLUDE

            BEGIN

                "resource1.h\0"                  // 看這里,修改了

            END

             

            2 TEXTINCLUDE

            BEGIN

                "#include ""afxres.h""\r\n"

                "\0"

            END

             

            3 TEXTINCLUDE

            BEGIN

                 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++//

                 //++這些部分不注釋掉沒編譯錯誤,注釋掉也沒有編譯錯誤

                "#define _AFX_NO_SPLITTER_RESOURCES\r\n"

                "#define _AFX_NO_OLE_RESOURCES\r\n"

               "#define _AFX_NO_TRACKER_RESOURCES\r\n"

                "#define _AFX_NO_PROPERTY_RESOURCES\r\n"

                "\r\n"

                "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)\r\n"

                "LANGUAGE 4, 2\r\n"

                "#pragma code_page(936)\r\n"

                "#include ""res\\TryRC2.rc2""  // 非Microsoft Visual C++ 編輯的資源\r\n"

                "#include ""afxres.rc""     // 標準組件\r\n"

                "#endif\r\n"

                "\0"

                     "\r\n"

                 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++//

            END

             

            #endif    // APSTUDIO_INVOKED

             

             

            /////////////////////////////////////////////////////////////////////////////

            //

            // Icon

            //

             

            // Icon with lowest ID value placed first to ensure application icon

            // remains consistent on all systems.

            //-IDR_MAINFRAME           ICON                    "res\\TryRC2.ico"

             

            /////////////////////////////////////////////////////////////////////////////

            //

            // Dialog

            //

            //-------------------------------------------------------------------------//

            //-----About對話框, 這些就是與TryRC.rc重復的了---------------------------//

            //IDD_ABOUTBOX DIALOGEX 0, 0, 235, 55

            //STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU

            //CAPTION "關于TryRC2"

            //FONT 9, "宋體", 0, 0, 0x1

            //BEGIN

            //    ICON            IDR_MAINFRAME,IDC_STATIC,11,17,20,20

            //    LTEXT           "TryRC2 1.0 版",IDC_STATIC,40,10,119,8,SS_NOPREFIX

            //    LTEXT           "Copyright (C) 2010",IDC_STATIC,40,25,119,8

            //    DEFPUSHBUTTON   "確定",IDOK,178,7,50,16,WS_GROUP

            //END

             

            //-------------------------------------------------------------------------//

            //-----這個是TryRC2工程的主對話框,不包進來--------------------------------//

            //IDD_TRYRC2_DIALOG DIALOGEX 0, 0, 320, 200

            //STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU

            //EXSTYLE WS_EX_APPWINDOW

            //CAPTION "TryRC2"

            //FONT 9, "宋體", 0, 0, 0x1

            //BEGIN

            //    DEFPUSHBUTTON   "確定",IDOK,263,7,50,16

            //    PUSHBUTTON      "取消",IDCANCEL,263,25,50,16

            //    CTEXT           "TODO: 在此放置對話框控件。",IDC_STATIC,10,96,300,8

            //END

            //----------------------------------------------------------------------------//

            IDD_DIALOG1 DIALOGEX 0, 0, 313, 142

            STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU

            CAPTION "Dialog"

            FONT 8, "MS Shell Dlg", 400, 0, 0x1

            BEGIN

                DEFPUSHBUTTON   "確定",IDOK,61,121,50,14

                PUSHBUTTON      "取消",IDCANCEL,197,121,50,14

                PUSHBUTTON      "Button1",IDC_BUTTON1,39,46,50,14

            END

             

             

            /////////////////////////////////////////////////////////////////////////////

            //

            // Version

            //

            //-------------------------------------------------------------------------//

            //----刪掉刪掉刪掉------------------------------------------------//

            //VS_VERSION_INFO VERSIONINFO

            // FILEVERSION 1,0,0,1

            // PRODUCTVERSION 1,0,0,1

            // FILEFLAGSMASK 0x3fL

            //#ifdef _DEBUG

            // FILEFLAGS 0x1L

            //#else

            // FILEFLAGS 0x0L

            //#endif

            // FILEOS 0x4L

            // FILETYPE 0x1L

            // FILESUBTYPE 0x0L

            //BEGIN

            //    BLOCK "StringFileInfo"

            //    BEGIN

            //        BLOCK "080403a8"

            //        BEGIN

            //            VALUE "CompanyName", "TODO: <公司名>"

            //            VALUE "FileDescription", "TODO: <文件說明>"

            //            VALUE "FileVersion", "1.0.0.1"

            //            VALUE "InternalName", "TryRC2.exe"

            //            VALUE "LegalCopyright", "TODO: (C) <公司名>。保留所有權利。"

            //            VALUE "OriginalFilename", "TryRC2.exe"

            //            VALUE "ProductName", "TODO: <產品名>"

            //            VALUE "ProductVersion", "1.0.0.1"

            //        END

            //    END

            //    BLOCK "VarFileInfo"

            //    BEGIN

            //        VALUE "Translation", 0x804, 936

            //    END

            //END

            //-------------------------------------------------------------------------//

             

            /////////////////////////////////////////////////////////////////////////////

            //

            // DESIGNINFO

            //

             

            #ifdef APSTUDIO_INVOKED

            GUIDELINES DESIGNINFO

            BEGIN

               

                 //------------------------------------------------------------//

                 //-----------------刪掉刪掉刪掉------------------------------//

            //IDD_ABOUTBOX, DIALOG

                //BEGIN

                //    LEFTMARGIN, 7

                //    RIGHTMARGIN, 228

                //    TOPMARGIN, 7

                //    BOTTOMMARGIN, 48

                //END

             

                //IDD_TRYRC2_DIALOG, DIALOG

                //BEGIN

                //    LEFTMARGIN, 7

                //    RIGHTMARGIN, 313

                //    TOPMARGIN, 7

                //    BOTTOMMARGIN, 193

                //END

                 //------------------------------------------------------------//

             

                IDD_DIALOG1, DIALOG

                BEGIN

                    LEFTMARGIN, 7

                    RIGHTMARGIN, 306

                    TOPMARGIN, 7

                    BOTTOMMARGIN, 135

                END

            END

            #endif    // APSTUDIO_INVOKED

             

             

            /////////////////////////////////////////////////////////////////////////////

            //

            // String Table

            //

             

            //STRINGTABLE

            //BEGIN

             //   IDS_ABOUTBOX            "關于TryRC2(&A)..."

            //END

             

            #endif    // 中文(中華人民共和國) resources

            /////////////////////////////////////////////////////////////////////////////

             

             

             

            #ifndef APSTUDIO_INVOKED

            /////////////////////////////////////////////////////////////////////////////

            //

            //-------------------------------------------------------------------------//

            //------------------ 不刪除會有錯誤----------------------------------------//

            // Generated from the TEXTINCLUDE 3 resource.

            //

            //#define _AFX_NO_SPLITTER_RESOURCES

            //#define _AFX_NO_OLE_RESOURCES

            //#define _AFX_NO_TRACKER_RESOURCES

            //#define _AFX_NO_PROPERTY_RESOURCES

             

            //#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)

            //LANGUAGE 4, 2

            //#pragma code_page(936)

            //#include "res\TryRC2.rc2"  // 非Microsoft Visual C++ 編輯的資源

            //#include "afxres.rc"     // 標準組件

            //#endif

            // 這里有一個TryRC2.rc2暫時不清楚它有什么用

            //--------------------------------------------------------------------------//

            /////////////////////////////////////////////////////////////////////////////

            #endif    // not APSTUDIO_INVOKED

             

             

            5. 在DlgR.h中添加該語句 #include "resource1.h"

            這樣子包含不是很好,一修改resource1.h就要編譯DlgR.h和DlgR.cpp了

            暫時沒有解決辦法。

             

             

            6. 總結:其實這樣子添加多個RC文件到工程的修改和拷貝粘貼RC文件差不多, 只是在工程的結構上比較明了一點,感覺也是比拷貝粘貼RC文件好。

             

            本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/cay22/archive/2010/05/26/5625951.aspx

            posted @ 2011-05-18 10:05 wrh 閱讀(5648) | 評論 (2)編輯 收藏

            (注:%0就是該batch文件的文件名 )

            這句的意思是
            更改當前目錄為批處理本身的目錄
            有些暈吧?不急,我舉例
            比如你有個批處理a.bat在D:\qq文件夾下 
            a.bat內容為
            cd /d %~dp0
            在這里
            cd /d %~dp0的意思就是cd /d d:\qq
            %0代表批處理本身 d:\qq\a.bat
            ~dp是變量擴充
            d既是擴充到分區號 d:
            p就是擴充到路徑 \qq
            dp就是擴充到分區號路徑 d:\qq


            擴充變量語法詳解:

            :: 選項語法:
            :: ~I - 刪除任何引號("),擴充 %I
            :: %~fI - 將 %I 擴充到一個完全合格的路徑名
            :: %~dI - 僅將 %I 擴充到一個驅動器號
            :: %~pI - 僅將 %I 擴充到一個路徑
            :: %~nI - 僅將 %I 擴充到一個文件名
            :: %~xI - 僅將 %I 擴充到一個文件擴展名
            :: %~sI - 擴充的路徑只含有短名
            :: %~aI - 將 %I 擴充到文件的文件屬性
            :: %~tI - 將 %I 擴充到文件的日期/時間
            :: %~zI - 將 %I 擴充到文件的大小
            :: %~$PATH:I - 查找列在路徑環境變量的目錄,并將 %I 擴充
            :: 到找到的第一個完全合格的名稱。如果環境變量名
            :: 未被定義,或者沒有找到文件,此組合鍵會擴充到
            :: 空字符串
            :: 可以組合修飾符來得到多重結果:
            :: %~dpI - 僅將 %I 擴充到一個驅動器號和路徑
            :: %~nxI - 僅將 %I 擴充到一個文件名和擴展名
            :: %~fsI - 僅將 %I 擴充到一個帶有短名的完整路徑名
            :: %~dp$PATH:i - 查找列在路徑環境變量的目錄,并將 %I 擴充
            :: 到找到的第一個驅動器號和路徑。
            :: %~ftzaI - 將 %I 擴充到類似輸出線路的 DIR

             

            本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/lightyearwp/archive/2008/08/06/2778677.aspx

            posted @ 2011-05-17 15:57 wrh 閱讀(678) | 評論 (0)編輯 收藏

              0   操作成功完成。
              1   功能錯誤。
              2   系統找不到指定的文件。
              3   系統找不到指定的路徑。
              4   系統無法打開文件。
              5   拒絕訪問。
              6   句柄無效。
              7   存儲控制塊被損壞。
              8   存儲空間不足,無法處理此命令。
              9   存儲控制塊地址無效。
              10   環境錯誤。
              11   試圖加載格式錯誤的程序。
              12   訪問碼無效。
              13   數據無效。
              14   存儲器不足,無法完成此操作。
              15   系統找不到指定的驅動器。
              16   無法刪除目錄。
              17   系統無法將文件移到不同的驅動器。
              18   沒有更多文件。
              19   介質受寫入保護。
              20   系統找不到指定的設備。
              21   設備未就緒。
              22   設備不識別此命令。
              23   數據錯誤 (循環冗余檢查)。
              24   程序發出命令,但命令長度不正確。
              25   驅動器無法找出磁盤上特定區域或磁道的位置。
              26   無法訪問指定的磁盤或軟盤。
              27   驅動器找不到請求的扇區。
              28   打印機缺紙。
              29   系統無法寫入指定的設備。
              30   系統無法從指定的設備上讀取。
              31   連到系統上的設備沒有發揮作用。
              32   進程無法訪問文件,因為另一個程序正在使用此文件。
              33   進程無法訪問文件,因為另一個程序已鎖定文件的一部分。
              36   用來共享的打開文件過多。
              38   到達文件結尾。
              39   磁盤已滿。
              50   不支持網絡請求。
              51   遠程計算機不可用 。
              52   在網絡上已有重復的名稱。
              53   找不到網絡路徑。
              54   網絡忙。
              55   指定的網絡資源或設備不再可用。
              56   已到達網絡 BIOS 命令限制。
              57   網絡適配器硬件出錯。
              58   指定的服務器無法運行請求的操作。
              59   發生意外的網絡錯誤。
              60   遠程適配器不兼容。
              61   打印機隊列已滿。
              62   無法在服務器上獲得用于保存待打印文件的空間。
              63   刪除等候打印的文件。
              64   指定的網絡名不再可用。
              65   拒絕網絡訪問。
              66   網絡資源類型錯誤。
              67   找不到網絡名。
              68   超過本地計算機網卡的名稱限制。
              69   超出網絡 BIOS 會話限制。
              70   遠程服務器已暫停,或正在啟動過程中。
              71   當前已無法再同此遠程計算機連接,因為已達到計算機的連接數目極限。
              72   已暫停指定的打印機或磁盤設備。
              80   文件存在。
              82   無法創建目錄或文件。
              83   INT 24 失敗。
              84   無法取得處理此請求的存儲空間。
              85   本地設備名已在使用中。
              86   指定的網絡密碼錯誤。
              87   參數錯誤。
              88   網絡上發生寫入錯誤。
              89   系統無法在此時啟動另一個進程。
              100   無法創建另一個系統信號燈。
              101   另一個進程擁有獨占的信號燈。
              102   已設置信號燈且無法關閉。
              103   無法再設置信號燈。
              104   無法在中斷時請求獨占的信號燈。
              105   此信號燈的前一個所有權已結束。
              107   程序停止,因為替代的軟盤未插入。
              108   磁盤在使用中,或被另一個進程鎖定。
              109   管道已結束。
              110   系統無法打開指定的設備或文件。
              111   文件名太長。
              112   磁盤空間不足。
              113   無法再獲得內部文件的標識。
              114   目標內部文件的標識不正確。
              117   應用程序制作的 IOCTL 調用錯誤。
              118   驗證寫入的切換參數值錯誤。
              119   系統不支持請求的命令。
              120   此功能只被此系統支持。
              121   信號燈超時時間已到。
              122   傳遞到系統調用的數據區太小。
              123   文件名、目錄名或卷標語法不正確。
              124   系統調用級別錯誤。
              125   磁盤沒有卷標。
              126   找不到指定的模塊。
              127   找不到指定的程序。
              128   沒有等候的子進程。
              130   試圖使用操作(而非原始磁盤 I/O)的已打開磁盤分區的文件句柄。
              131   試圖移動文件指針到文件開頭之前。
              132   無法在指定的設備或文件上設置文件指針。
              133   包含先前加入驅動器的驅動器無法使用 JOIN 或 SUBST 命令。
              134   試圖在已被合并的驅動器上使用 JOIN 或 SUBST 命令。
              135   試圖在已被合并的驅動器上使用 JOIN 或 SUBST 命令。
              136   系統試圖解除未合并驅動器的 JOIN。
              137   系統試圖解除未替代驅動器的 SUBST。
              138   系統試圖將驅動器合并到合并驅動器上的目錄。
              139   系統試圖將驅動器替代為替代驅動器上的目錄。
              140   系統試圖將驅動器合并到替代驅動器上的目錄。
              141   系統試圖替代驅動器為合并驅動器上的目錄。
              142   系統無法在此時運行 JOIN 或 SUBST。
              143   系統無法將驅動器合并到或替代為相同驅動器上的目錄。
              144   目錄并非根目錄下的子目錄。
              145   目錄非空。
              146   指定的路徑已在替代中使用。
              147   資源不足,無法處理此命令。
              148   指定的路徑無法在此時使用。
              149   企圖將驅動器合并或替代為驅動器上目錄是上一個替代的目標的驅動器。
              150   系統跟蹤信息未在 CONFIG.SYS 文件中指定,或不允許跟蹤。
              151   為 DosMuxSemWait 指定的信號燈事件個數錯誤。
              152   DosMuxSemWait 不可運行。已設置過多的信號燈。
              153   DosMuxSemWait 清單錯誤。
              154   輸入的卷標超過目標文件系統的長度限制
              155   無法創建另一個線程。
              156   接收進程已拒絕此信號。
              157   段已被放棄且無法鎖定。
              158   段已解除鎖定。
              159   線程標識的地址錯誤。
              160   傳遞到 DosExecPgm 的參數字符串錯誤。
              161   指定的路徑無效。
              162   信號已暫停。
              164   無法在系統中創建更多的線程。
              167   無法鎖定文件區域。
              170   請求的資源在使用中。
              173   對于提供取消區域進行鎖定的請求不明顯。
              174   文件系統不支持鎖定類型的最小單元更改。
              180   系統檢測出錯誤的段號。
              183   當文件已存在時,無法創建該文件。
              186   傳遞的標志錯誤。
              187   找不到指定的系統信號燈名稱。
              196   操作系統無法運行此應用程序。
              197   操作系統當前的配置不能運行此應用程序。
              199   操作系統無法運行此應用程序。
              200   代碼段不可大于或等于 64K。
              203   操作系統找不到已輸入的環境選項。
              205   命令子樹中的進程沒有信號處理程序。
              206   文件名或擴展名太長。
              207   第 2 環堆棧已被占用。
              208   沒有正確輸入文件名通配符 * 或 ?,或指定過多的文件名通配符。
              209   正在發送的信號錯誤。
              210   無法設置信號處理程序。
              212   段已鎖定且無法重新分配。
              214   連到該程序或動態鏈接模塊的動態鏈接模塊太多。
              215   無法嵌套調用 LoadModule。
              230   管道狀態無效。
              231   所有的管道實例都在使用中。
              232   管道正在關閉中。
              233   管道的另一端上無任何進程。
              234   更多數據可用。
              240   取消會話。
              254   指定的擴展屬性名無效。
              255   擴展屬性不一致。
              258   等待的操作過時。
              259   沒有可用的數據了。
              266   無法使用復制功能。
              267   目錄名無效。
              275   擴展屬性在緩沖區中不適用。
              276   裝在文件系統上的擴展屬性文件已損壞。
              277   擴展屬性表格文件已滿。
              278   指定的擴展屬性句柄無效。
              282   裝入的文件系統不支持擴展屬性。
              288   企圖釋放并非呼叫方所擁有的多用戶終端運行程序。
              298   發向信號燈的請求過多。
              299   僅完成部分的 ReadProcessMemoty 或 WriteProcessMemory 請求。
              300   操作鎖定請求被拒絕。
              301   系統接收了一個無效的操作鎖定確認。
              487   試圖訪問無效的地址。
              534   算術結果超過 32 位。
              535   管道的另一端有一進程。
              536   等候打開管道另一端的進程。
              994   拒絕訪問擴展屬性。

            posted @ 2011-05-17 10:24 wrh 閱讀(926) | 評論 (0)編輯 收藏

            ini文件(即Initialization file),這種類型的文件中通常存放的是一個程序的初始化信息。ini文件由若干個節(Section)組成,每個Section由若干鍵(Key)組成,每個Key可以賦相應的值。讀寫ini文件實際上就是讀寫某個的Section中相應的Key的值,而這只要借助幾個函數即可完成。
            一、向ini文件中寫入信息的函數
            1. 把信息寫入系統的win.ini文件
            BOOL WriteProfileString(
              LPCTSTR lpAppName, // 節的名字,是一個以0結束的字符串
              LPCTSTR lpKeyName, // 鍵的名字,是一個以0結束的字符串。若為NULL,則刪除整個節
              LPCTSTR lpString // 鍵的值,是一個以0結束的字符串。若為NULL,則刪除對應的鍵
            )


            2. 把信息寫入自己定義的.ini文件
            BOOL WritePrivateProfileString(
              LPCTSTR lpAppName, // 同上
              LPCTSTR lpKeyName, // 同上
              LPCTSTR lpString, // 同上
              LPCTSTR lpFileName // 要寫入的文件的文件名。若該ini文件與程序在同一個目錄下,也可使用相對路徑,否則需要給出絕度路徑。
            )

            如:
            ::WriteProfileString("Test","id","xym");
            //在win.ini中創建一個Test節,并在該節中創建一個鍵id,其值為xym

            ::WritePrivateProfileString("Test","id","xym","d:\\vc\\Ex1\\ex1.ini");
            //在Ex1目錄下的ex1.ini中創建一個Test節,并在該節中創建一個鍵id,其值為xym

            //若Ex1.ini文件與讀寫該文件的程序在同一個目錄下,則上面語句也可寫為:
            ::WritePrivateProfileString("Test","id","xym",".\\ex1.ini");

            需要注意的是,C系列的語言中,轉義字符'\\'表示反斜線'\'。另外,當使用相對路徑時,\\前的.號不能丟掉了。

            二、從ini文件中讀取數據的函數
            1、從系統的win.ini文件中讀取信息
            (1) 讀取字符串
            DWORD GetProfileString(
              LPCTSTR lpAppName, // 節名
              LPCTSTR lpKeyName, // 鍵名,讀取該鍵的值
              LPCTSTR lpDefault, // 若指定的鍵不存在,該值作為讀取的默認值
              LPTSTR lpReturnedString, // 一個指向緩沖區的指針,接收讀取的字符串
              DWORD nSize // 指定lpReturnedString指向的緩沖區的大小
            )

            如:
            CString str;
            ::GetProfileString("Test","id","Error",str.GetBuffer(20),20);

            (2) 讀取整數
            UINT GetProfileInt(
              LPCTSTR lpAppName, // 同上
              LPCTSTR lpKeyName, // 同上
              INT nDefault // 若指定的鍵名不存在,該值作為讀取的默認值
            )

            如使用以下語句寫入了年齡信息:
            ::WriteProfileString("Test","age","25");
            //在win.ini中創建一個Test節,并在該節中創建一個鍵age,其值為25

            則可用以下語句讀取age鍵的值:
            int age;
            age=::GetProfileInt("Test","age",0);

            2、從自己的ini文件中讀取信息
            (1) 讀取字符串
            DWORD GetPrivateProfileString(
              LPCTSTR lpAppName, // 同1(1)
              LPCTSTR lpKeyName, // 同1(1)
              LPCTSTR lpDefault, // 同1(1)
              LPTSTR lpReturnedString, // 同1(1)
              DWORD nSize, // 同1(1)
              LPCTSTR lpFileName // 讀取信息的文件名。若該ini文件與程序在同一個目錄下,也可使用相對路徑,否則需要給出絕度路徑。
            )

            如:
            CString str;
            ::GetPrivateProfileString("Test","id","Error",str.GetBuffer(20),20,".\\ex1.ini");
            或:
            ::GetPrivateProfileString("Test","id","Error",str.GetBuffer(20),20,"d:\\vc\\Ex1\\ex1.ini");

            (2) 讀取整數

            UINT GetPrivateProfileInt(
              LPCTSTR lpAppName, // 同上
              LPCTSTR lpKeyName, // 同上
              INT nDefault, // 若指定的鍵名不存在,該值作為讀取的默認值
              LPCTSTR lpFileName // 同上
            )

            如使用以下語句寫入了年齡信息:
            ::WritePrivateProfileString("Test","age","25",".\\ex1.ini");
            //在ex1.ini中創建一個Test節,并在該節中創建一個鍵age,其值為25

            則可用以下語句讀取age鍵的值:
            int age;
            age=::GetPrivateProfileInt("Test","age",0,".\\ex1.ini");

            三、 刪除鍵值或節

            回顧一下WriteProfileString函數的說明
            BOOL WriteProfileString(
              LPCTSTR lpAppName, // 節的名字,是一個以0結束的字符串
              LPCTSTR lpKeyName, // 鍵的名字,是一個以0結束的字符串。若為NULL,則刪除整個節
              LPCTSTR lpString // 鍵的值,是一個以0結束的字符串。若為NULL,則刪除對應的鍵
            )

            由此可見,要刪除某個節,只需要將WriteProfileString第二個參數設為NULL即可。而要刪除某個鍵,則只需要將該函數的第三個參數設為NULL即可。這是刪除系統的win.ini中的節或鍵,類似的,要刪除自己定義的ini文件中的節或鍵,也可做相同的操作。
            如:
            ::WriteProfileString("Test",NULL,NULL); //刪除win.ini中的Test節
            ::WriteProfileString("Test","id",NULL); //刪除win.ini中的id鍵

            ::WritePrivateProfileString("Test",NULL,NULL,".\\ex1.ini"); //刪除ex1.ini中的Test節
            ::WritePrivateProfileString("Test","id",NULL,".\\ex1.ini"); //刪除ex1.ini中的id鍵

            四、如何判斷一個ini文件中有多少個節
            要判斷一個ini文件中有多少個節,最簡單的辦法就是將所有的節名都找出來,然后統計節名的個數。而要將所有的節名找出來,使用GetPrivateProfileSectionNames函數就可以了,其原型如下:
            DWORD GetPrivateProfileSectionNames(
              LPTSTR lpszReturnBuffer, // 指向一個緩沖區,用來保存返回的所有節名
              DWORD nSize, // 參數lpszReturnBuffer的大小
              LPCTSTR lpFileName // 文件名,若該ini文件與程序在同一個目錄下,

            //也可使用相對路徑,否則需要給出絕度路徑
            )

            下面的是用來統計一個ini文件中共有多少個節的函數,當然,如果需要同時找到每個節中的各個鍵及其值,根據找到節名就可以很容易的得到了。


            /*統計共有多少個節
            節名的分離方法:若chSectionNames數組的第一字符是'\0'字符,則表明
            有0個節。否則,從chSectionNames數組的第一個字符開始,順序往后找,
            直到找到一個'\0'字符,若該字符的后繼字符不是 '\0'字符,則表明前
            面的字符組成一個節名。若連續找到兩個'\0'字符,則統計結束*/


            int CTestDlg::CalcCount(void)

              TCHAR chSectionNames[2048]={0}; //所有節名組成的字符數組 
              char * pSectionName; //保存找到的某個節名字符串的首地址 
              int i; //i指向數組chSectionNames的某個位置,從0開始,順序后移 
              int j=0; //j用來保存下一個節名字符串的首地址相對于當前i的位置偏移量
              int count=0; //統計節的個數

              //CString name;
              //char id[20];
              ::GetPrivateProfileSectionNames(chSectionNames,2048,".\\ex1.ini");
              for(i=0;i<2048;i++,j++)
              { 
                if(chSectionNames[0]=='\0')
                  break; //如果第一個字符就是0,則說明ini中一個節也沒有
                if(chSectionNames[i]=='\0')
                {
                  pSectionName=&chSectionNames[i-j]; //找到一個0,則說明從這個字符往前,減掉j個  偏移量,
                  //就是一個節名的首地址

                  j=-1; //找到一個節名后,j的值要還原,以統計下一個節名地址的偏移量
                  //賦成-1是因為節名字符串的最后一個字符0是終止符,不能作為節名

                  //的一部分
                  /*::GetPrivateProfileString(pSectionName,"id","Error",id,20,".\\ex1.ini");
                  name.Format("%s",id);*/
                  //在獲取節名的時候可以獲取該節中鍵的值,前提是我們知道該節中有哪些鍵。 

                  AfxMessageBox(pSectionName); //把找到的顯示出來

                  if(chSectionNames[i+1]==0)
                  {
                      break; //當兩個相鄰的字符都是0時,則所有的節名都已找到,循環終止 
                  }
                }

              }

              return count;
            }

            本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/rbagglo/archive/2008/07/27/2719814.aspx

            在我們寫的程序當中,總有一些配置信息需要保存下來,以便完成程序的功能,最簡單的辦法就是將這些信息寫入INI文件中,程序初始化時再讀入.具體應用如下:
            一.將信息寫入.INI文件中.
              1.所用的WINAPI函數原型為:
            BOOL WritePrivateProfileString(
            LPCTSTR lpAppName,
            LPCTSTR lpKeyName,
            LPCTSTR lpString,
            LPCTSTR lpFileName
            );
            其中各參數的意義:
               LPCTSTR lpAppName 是INI文件中的一個字段名.
               LPCTSTR lpKeyName 是lpAppName下的一個鍵名,通俗講就是變量名.
               LPCTSTR lpString 是鍵值,也就是變量的值,不過必須為LPCTSTR型或CString型的.
               LPCTSTR lpFileName 是完整的INI文件名.
            2.具體使用方法:設現有一名學生,需把他的姓名和年齡寫入 c:\stud\student.ini 文件中.
            CString strName,strTemp;
            int nAge;
            strName="張三";
            nAge=12;
            ::WritePrivateProfileString("StudentInfo","Name",strName,"c:\\stud\\student.ini");
              此時c:\stud\student.ini文件中的內容如下:
               [StudentInfo]
            3.要將學生的年齡保存下來,只需將整型的值變為字符型即可:
            strTemp.Format("%d",nAge);
            ::WritePrivateProfileString("StudentInfo","Age",strTemp,"c:\\stud\\student.ini");
            二.將信息從INI文件中讀入程序中的變量.
            1.所用的WINAPI函數原型為:
            DWORD GetPrivateProfileString(
            LPCTSTR lpAppName,
            LPCTSTR lpKeyName,
            LPCTSTR lpDefault,
            LPTSTR lpReturnedString,
            DWORD nSize,
            LPCTSTR lpFileName
            );
            其中各參數的意義:
               前二個參數與 WritePrivateProfileString中的意義一樣.
               lpDefault : 如果INI文件中沒有前兩個參數指定的字段名或鍵名,則將此值賦給變量.
               lpReturnedString : 接收INI文件中的值的CString對象,即目的緩存器.
               nSize : 目的緩存器的大小.
               lpFileName : 是完整的INI文件名.
            2.具體使用方法:現要將上一步中寫入的學生的信息讀入程序中.
            CString strStudName;
            int nStudAge;
            GetPrivateProfileString("StudentInfo","Name","默認姓名",strStudName.GetBuffer(MAX_PATH),MAX_PATH,"c:\\stud\\student.ini");
            執行后 strStudName 的值為:"張三",若前兩個參數有誤,其值為:"默認姓名".
            3.讀入整型值要用另一個WINAPI函數:
            UINT GetPrivateProfileInt(
            LPCTSTR lpAppName,
            LPCTSTR lpKeyName,
            INT nDefault,
            LPCTSTR lpFileName
            );
            這里的參數意義與上相同.使用方法如下:
            nStudAge=GetPrivateProfileInt("StudentInfo","Age",10,"c:\\stud\\student.ini");
            三.循環寫入多個值,設現有一程序,要將最近使用的幾個文件名保存下來,具體程序如下:
            1.寫入:
            CString strTemp,strTempA;
            int i;
            int nCount=6;
            file://共有6個文件名需要保存
            for(i=0;i {strTemp.Format("%d",i);
            strTempA=文件名;
            file://文件名可以從數組,列表框等處取得.
            ::WritePrivateProfileString("UseFileName","FileName"+strTemp,strTempA,
            "c:\\usefile\\usefile.ini");
            }
            strTemp.Format("%d",nCount);
            ::WritePrivateProfileString("FileCount","Count",strTemp,"c:\\usefile\\usefile.ini");
            file://將文件總數寫入,以便讀出.
            2.讀出:
            nCount=::GetPrivateProfileInt("FileCount","Count",0,"c:\\usefile\\usefile.ini");
            for(i=0;i {strTemp.Format("%d",i);
            strTemp="FileName"+strTemp;
            ::GetPrivateProfileString("CurrentIni",strTemp,"default.fil", strTempA.GetBuffer(MAX_PATH),MAX_PATH,"c:\\usefile\\usefile.ini");
            file://使用strTempA中的內容.
            }
            另外要注意以下三點:
            1.INI文件的路徑必須完整,文件名前面的各級目錄必須存在,否則寫入不成功,該函數返回 FALSE 值.
            2.文件名的路徑中必須為 \\ ,因為在VC++中, \\ 才表示一個 \ .
            3.也可將INI文件放在程序所在目錄,此時 lpFileName 參數為: ".\\student.ini".
            posted @ 2011-05-13 13:42 wrh 閱讀(2098) | 評論 (0)編輯 收藏
            僅列出標題
            共25頁: 1 2 3 4 5 6 7 8 9 Last 

            導航

            <2011年3月>
            272812345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統計

            常用鏈接

            留言簿(19)

            隨筆檔案

            文章檔案

            收藏夾

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久久久97| 久久se精品一区二区影院| 久久久亚洲欧洲日产国码aⅴ | 午夜精品久久久久成人| 久久久一本精品99久久精品88| 久久水蜜桃亚洲av无码精品麻豆 | 97超级碰碰碰久久久久| 久久精品无码一区二区三区免费| 欧美成人免费观看久久| 日本免费一区二区久久人人澡| 2021国内久久精品| 99久久精品国产一区二区蜜芽| 久久精品国产亚洲AV不卡| 很黄很污的网站久久mimi色 | 青春久久| 久久夜色tv网站| 国内精品久久久久影院优 | 一本久久久久久久| 久久久久无码精品国产不卡| 亚洲精品无码专区久久同性男| 精品免费tv久久久久久久| 亚洲欧美日韩中文久久| 狠狠色丁香婷婷久久综合 | 久久精品www人人爽人人| 中文字幕久久亚洲一区| 久久九九久精品国产免费直播| 亚洲精品国产成人99久久| 国产精品久久午夜夜伦鲁鲁| 亚洲精品乱码久久久久久蜜桃不卡| 久久综合视频网站| 欧美激情精品久久久久久久| 99久久无码一区人妻| 一本久久a久久精品综合夜夜| 久久91精品久久91综合| 国产成人久久精品激情| 欧美牲交A欧牲交aⅴ久久 | 国内精品久久人妻互换| 国产麻豆精品久久一二三| 77777亚洲午夜久久多喷| 国产精品久久久久久久| 青青国产成人久久91网 |