青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

一、CStatic從文件夾加載位圖

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

//讓所有的靜態(tài)文本都透明好顯示背景色
if(nCtlColor   ==   CTLCOLOR_DLG)  
{  
        //返回對話框的顏色  
   hbr=(HBRUSH)::CreateSolidBrush(RGB(146,161,202));    
}  
if(nCtlColor==CTLCOLOR_STATIC)  
{  
   //讓靜態(tài)文本框透明  
   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 閱讀(2553) | 評論 (0)編輯 收藏

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

聲明:
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系統上驗證了一下,發(fā)現HORZSIZE值與LOGPIXELSX的值也是不變的,如果改變HORZRES的話,則HORZSIZE會發(fā)生相應變化,但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中的區(qū)別是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 閱讀(1624) | 評論 (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 閱讀(485) | 評論 (1)編輯 收藏

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

  先來個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長度是固定,必須重新創(chuàng)建一個DACL對象

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

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

  // 創(chuàng)建新的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 閱讀(7963) | 評論 (0)編輯 收藏
1 echo 和 @
回顯命令
@ #關閉單行回顯
echo off #從下一行開始關閉回顯
@echo off #從本行開始關閉回顯。一般批處理第一行都是這個
echo on #從下一行開始打開回顯
echo #顯示當前是 echo off 狀態(tài)還是 echo on 狀態(tài)
echo. #輸出一個”回車換行”,空白行
#(同echo, echo; echo+ echo[ echo] echo/ echo\)

2 errorlevel
echo %errorlevel%
每個命令運行結束,可以用這個命令行格式查看返回碼
默認值為0,一般命令執(zhí)行出錯會設 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
創(chuàng)建目錄
md d:\a\b\c #如果 d:\a 不存在,將會自動創(chuàng)建中級目錄
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 和 ::
注釋命令
注釋行不執(zhí)行操作

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

18 goto 和 :
跳轉命令
:label #行首為:表示該行是標簽行,標簽行不執(zhí)行操作
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 &
順序執(zhí)行多條命令,而不管命令是否執(zhí)行成功

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

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

25 |
管道命令
dir *.* /s/a | find /c \".exe\"
管道命令表示先執(zhí)行 dir 命令,對其輸出的結果執(zhí)行后面的 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 環(huán)境變量的目錄,并將 %1
擴充到找到的第一個完全合格的名稱。如果環(huán)境
變量名未被定義,或者沒有找到文件,此組合鍵會
擴充到空字符串

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

%~dp1 - 只將 %1 擴展到驅動器號和路徑
%~nx1 - 只將 %1 擴展到文件名和擴展名
%~dp$PATH:1 - 在列在 PATH 環(huán)境變量中的目錄里查找 %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 表示不區(qū)分大小寫,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
設置”命令擴展名”和”延緩環(huán)境變量擴充”

SETLOCAL ENABLEEXTENSIONS #啟用\"命令擴展名\"
SETLOCAL DISABLEEXTENSIONS #停用\"命令擴展名\"
SETLOCAL ENABLEDELAYEDEXPANSION #啟用\"延緩環(huán)境變量擴充\"
SETLOCAL DISABLEDELAYEDEXPANSION #停用\"延緩環(huán)境變量擴充\"
ENDLOCAL #恢復到使用SETLOCAL語句以前的狀態(tài)
“命令擴展名”默認為啟用
“延緩環(huán)境變量擴充”默認為停用
批處理結束系統會自動恢復默認值
可以修改注冊表以禁用\"命令擴展名\",詳見 cmd /? 。所以用到\"命令擴展名\"的程
序,建議在開頭和結尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 語句,以確
保程序能在其它系統上正確運行
“延緩環(huán)境變量擴充\”主要用于 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
這里的\"替換\",在 /? 幫助里就是指\"擴充\"、\"環(huán)境變量擴充\"
可以啟用”延緩環(huán)境變量擴充”,用 ! 來引用變量,即 !變量名!
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set p=aaa
if %p%==aaa (
echo %p%
set p=bbb
echo !p!
)
ENDLOCAL
結果將顯示
aaa
bbb
還有幾個動態(tài)變量,運行 set 看不到
%CD% #代表當前目錄的字符串
%DATE% #當前日期
%TIME% #當前時間
%RANDOM% #隨機整數,介于0~32767
%ERRORLEVEL% #當前 ERRORLEVEL 值
%CMDEXTVERSION% #當前命令處理器擴展名版本號
%CMDCMDLINE% #調用命令處理器的原始命令行
可以用echo命令查看每個變量值,如 echo %time%
注意 %time% 精確到毫秒,在批處理需要延時處理時可以用到

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

33 call
批處理中調用另外一個批處理的命令,否則剩下的批處理指令將不會被執(zhí)行
有時有的應用程序用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 設置'文件類型'關聯,關聯到'執(zhí)行程序和參數'
當你雙擊一個.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
循環(huán)命令
這個比較復雜,請對照 for/? 來看
for %%i in (c: d: e: f:) do echo %%i
依次調用小括號里的每個字符串,執(zhí)行 do 后面的命令
注意%%i,在批處理中 for 語句調用參數用2個%
默認的字符串分隔符是\"空格鍵\",\"Tab鍵\",\"回車鍵\"
for %%i in (*.txt) do find \"abc\" %%i
對當前目錄里所有的txt文件執(zhí)行 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 命令的輸出結果循環(huán)調用,每行一個
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 閱讀(455) | 評論 (0)編輯 收藏

3、if結合errorlevel使用:
說明:環(huán)境變量errorlevel的初始值為0,當一些命令執(zhí)行不成功,就會返回一個數值,如: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文中的意思,就是“如果”的意思,用來進行條件判斷。翻譯過來的意思就是:如果符合某一條件,便執(zhí)行后面的命令。
主要用來判斷,1、兩個“字符串”是否相等;2、兩個數值是大于、小于、等于,然后執(zhí)行相應的命令。
當然還有特殊用法,如結合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 閱讀(8864) | 評論 (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 期間失敗: 文件無效或損壞

 

這個錯誤的意思就是資源定義重復了,其實重復也很正常,因為在創(chuàng)建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. 分別創(chuàng)建了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 閱讀(5688) | 評論 (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既是擴充到分區(qū)號 d:
p就是擴充到路徑 \qq
dp就是擴充到分區(qū)號路徑 d:\qq


擴充變量語法詳解:

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

 

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

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

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

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

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


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

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

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

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

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

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

如:
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中創(chuàng)建一個Test節(jié),并在該節(jié)中創(chuàng)建一個鍵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中創(chuàng)建一個Test節(jié),并在該節(jié)中創(chuàng)建一個鍵age,其值為25

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

三、 刪除鍵值或節(jié)

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

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

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

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

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

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


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


int CTestDlg::CalcCount(void)

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

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

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

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

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

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

  }

  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.要將學生的年齡保存下來,只需將整型的值變?yōu)樽址图纯?
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");
執(zhí)行后 strStudName 的值為:"張三",若前兩個參數有誤,其值為:"默認姓名".
3.讀入整型值要用另一個WINAPI函數:
UINT GetPrivateProfileInt(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
INT nDefault,
LPCTSTR lpFileName
);
這里的參數意義與上相同.使用方法如下:
nStudAge=GetPrivateProfileInt("StudentInfo","Age",10,"c:\\stud\\student.ini");
三.循環(huán)寫入多個值,設現有一程序,要將最近使用的幾個文件名保存下來,具體程序如下:
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 閱讀(2111) | 評論 (0)編輯 收藏
僅列出標題
共25頁: 1 2 3 4 5 6 7 8 9 Last 

導航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統計

常用鏈接

留言簿(19)

隨筆檔案

文章檔案

收藏夾

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美日本视频在线观看| 亚洲精品视频免费在线观看| 亚洲午夜一区二区三区| 亚洲午夜激情网站| 国产亚洲激情| 亚洲国产精品一区二区三区| 国产精品av一区二区| 久久婷婷国产综合国色天香| 欧美精品日韩www.p站| 欧美在线一区二区| 免费观看国产成人| 欧美一级视频一区二区| 欧美激情1区2区3区| 久久精品国产一区二区三| 欧美激情在线有限公司| 久久精品一区二区三区四区| 欧美日韩系列| 欧美黄色成人网| 国产视频欧美视频| 亚洲乱码精品一二三四区日韩在线 | 久久一区二区三区av| 亚洲性xxxx| 久久阴道视频| 久久精品在线视频| 国产精品va在线播放我和闺蜜| 美女精品在线观看| 国产欧美日韩精品在线| 亚洲精品一区二区三区av| 在线观看成人网| 香蕉久久夜色精品| 性做久久久久久| 欧美亚洲成人免费| 亚洲伦理在线| 亚洲毛片一区| 欧美成人在线免费观看| 免费日韩av| 国产日韩欧美亚洲| 亚洲一区二区成人| 亚洲女女女同性video| 欧美激情中文字幕乱码免费| 欧美激情第1页| 亚洲成色www8888| 久久久蜜臀国产一区二区| 欧美伊久线香蕉线新在线| 国产精品久久久久久久久免费 | 国产精品久久国产三级国电话系列| 欧美不卡在线视频| 黄色av日韩| 欧美一级精品大片| 久久成人精品视频| 国产亚洲欧洲997久久综合| 校园春色国产精品| 久久精品2019中文字幕| 国产婷婷精品| 久久久精品网| 欧美不卡激情三级在线观看| 影音先锋久久精品| 狼人天天伊人久久| 亚洲国产精品欧美一二99| 亚洲美女一区| 国产精品高潮呻吟久久| 午夜影院日韩| 麻豆精品91| 亚洲精品免费网站| 欧美视频在线免费看| 亚洲视屏一区| 久久精品国产99| 在线电影国产精品| 欧美成人一区二区三区在线观看| 亚洲人精品午夜| 亚洲欧美日韩在线综合| 国产夜色精品一区二区av| 欧美一区观看| 亚洲第一二三四五区| 亚洲一区二区成人在线观看| 国产日产精品一区二区三区四区的观看方式 | 欧美激情视频在线播放| 亚洲最黄网站| 久久久人人人| 日韩午夜在线播放| 国产精品美女久久久| 欧美中文在线字幕| 欧美国产一区在线| 亚洲欧美国产三级| 精品99视频| 欧美日韩成人| 性欧美办公室18xxxxhd| 亚洲国产精品成人综合| 欧美在线地址| 99精品国产在热久久下载| 国产精品夜夜夜| 老司机一区二区| 亚洲一区不卡| 亚洲第一久久影院| 欧美在线观看一区二区三区| 亚洲激情影视| 国产一区二区日韩| 欧美视频一区在线观看| 久久精品一区二区三区中文字幕| 亚洲精品九九| 欧美va日韩va| 久久蜜桃精品| 亚洲欧美日韩在线| 一本色道久久88亚洲综合88| 国产一区二区高清| 欧美巨乳在线观看| 六月婷婷一区| 欧美中文字幕第一页| 一本到12不卡视频在线dvd| 欧美成人午夜激情| 好吊一区二区三区| 亚洲四色影视在线观看| 欧美福利一区二区| 久久成人免费网| 中日韩男男gay无套| 亚洲人成网站777色婷婷| 黑人操亚洲美女惩罚| 国产精品黄色| 欧美日韩一区二区三区在线看| 老司机午夜免费精品视频| 久久国产加勒比精品无码| 亚洲欧美精品中文字幕在线| 夜夜狂射影院欧美极品| 亚洲精品在线看| 亚洲激情一区二区| 亚洲第一精品久久忘忧草社区| 免费日韩av| 欧美成人在线免费观看| 美日韩精品免费| 免费看亚洲片| 欧美国产日韩一区| 欧美成人一区二区在线| 欧美成人自拍视频| 欧美大尺度在线观看| 嫩草伊人久久精品少妇av杨幂| 玖玖玖国产精品| 美女主播视频一区| 欧美不卡在线视频| 亚洲电影下载| 亚洲精品在线视频观看| 一区二区免费在线播放| 这里只有精品丝袜| 亚洲在线电影| 久久精品最新地址| 久久综合九色综合欧美狠狠| 麻豆freexxxx性91精品| 欧美大片91| 欧美午夜性色大片在线观看| 国产精品国产自产拍高清av王其 | 久久综合色婷婷| 欧美va天堂| 亚洲美女区一区| 亚洲一区欧美二区| 欧美在线视频一区二区| 久久一区激情| 欧美精品一卡| 国产精品视频免费在线观看| 国产日韩综合| 亚洲国产mv| 亚洲视频一区| 久久精品欧美日韩精品| 欧美成人一品| 一区二区三区四区五区精品| 性色av一区二区三区| 老司机一区二区| 国产精品白丝jk黑袜喷水| 国产日韩欧美视频在线| 亚洲激情在线视频| 亚洲一二三级电影| 久久久亚洲成人| 亚洲人被黑人高潮完整版| 亚洲欧美日产图| 欧美黄色影院| 国产一区二区视频在线观看 | 久久九九全国免费精品观看| 免费在线亚洲| 国产乱码精品一区二区三区不卡| 在线看片日韩| 亚洲欧美日韩在线一区| 欧美电影免费观看| 亚洲在线成人精品| 欧美二区在线| 国产视频精品xxxx| 亚洲视频在线观看一区| 美女尤物久久精品| 亚洲一区二区视频在线观看| 老鸭窝亚洲一区二区三区| 国产精品免费一区豆花| 欧美一区二区三区播放老司机| 欧美日韩国产探花| 亚洲国内欧美| 亚洲欧美在线网| 欧美精品一区二区三| 国色天香一区二区| 亚洲天堂偷拍| 亚洲国产精品v| 久久久噜噜噜久久中文字幕色伊伊 | 在线色欧美三级视频| 午夜国产精品视频| 亚洲激情视频在线播放|