一、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 阅读(2510) | 评论 (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 阅读(1583) | 评论 (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 阅读(438) | 评论 (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 阅读(7880) | 评论 (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 阅读(412) | 评论 (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 阅读(8827) | 评论 (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 阅读(5628) | 评论 (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 阅读(663) | 评论 (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 阅读(916) | 评论 (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 阅读(2091) | 评论 (0)编辑 收藏
仅列出标题
共25页: 1 2 3 4 5 6 7 8 9 Last 

导航

<2025年1月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

统计

常用链接

留言簿(19)

随笔档案

文章档案

收藏夹

搜索

最新评论

阅读排行榜

评论排行榜