代码改变世界

Visual C++ 2011-4-12

2011-04-12 22:11  Clingingboy  阅读(1805)  评论(0编辑  收藏  举报

 

1.MakeSureDirectoryPathExists

多级目录创建,如果目录不存在的话,则会自动创建目录

MakeSureDirectoryPathExists("E:\\C\\D\\E\\");

2.PathFileExists

判断一个目录或者文件是否存在

BOOL validFile=PathFileExists(_T("E:\\MyTest.txt"));
BOOL validPath=PathFileExists(_T("E:\develop"));

3.PathIsDirectory

判断路径是否为目录

BOOL validFile=PathIsDirectory(_T("E:\\MyTest.txt"));
BOOL validPath=PathIsDirectory(_T("E:\develop"));

4.获取和设置程序内部环境变量

LPCWSTR key=_T("testword");
::SetEnvironmentVariableW(key,_T("hello world"));
TCHAR chars[1024];
::GetEnvironmentVariableW(key,chars,sizeof(chars));

5.关于全球化及相关信息格式化的介绍

参考:http://msdn.microsoft.com/zh-cn/goglobal/bb688121

6.获取模块句柄和路径

WCHAR key[1024]={};
HMODULE module=GetModuleHandle(_T("kernel32.dll"));
GetModuleFileName(module,key,sizeof(key) -1); 
//获取当前程序exe路径
wchar_t pszFileLoc[1024] = {0}; 
wchar_t *PToken = NULL;
GetModuleFileName(NULL,pszFileLoc,sizeof(pszFileLoc) -1); 

7.二进制的逻辑运算

运算规则: And: 同为真则为真 Or : 同为假则为假 Xor: 相同为假,相异为真

参考:http://zhidao.baidu.com/question/90093606.html

通过二进制的逻辑运算可以用一个数字来代替多个标识.如下

[Flags]
enum Days2
{
    None = 0x0,
    Sunday = 0x1,        //1
    Monday = 0x2,       //10
    Tuesday = 0x4,     //100
    Wednesday = 0x8,  //1000
    Thursday = 0x10, //10000
    Friday = 0x20,  //100000
    Saturday = 0x40//1000000
}

虽然以十六进制来表示,但实际运算是用二进制的,因为如上格式,每个数字”逻辑或|”计算都不会出现重复,这样就可以组成一个新的数字代表多个标识,比较时则用”逻辑与&”,则可以判断出是有有此标识,
去除标识时则用逻辑异或”^”,同理在Win32下的定义也是如此,可以看到每个数字都会进一位二进制,以避免重复(可以理解为一个数字连续x2的结果)

#define SHGFI_ICON              0x000000100     // get icon
#define SHGFI_DISPLAYNAME       0x000000200     // get display name
#define SHGFI_TYPENAME          0x000000400     // get type name
#define SHGFI_ATTRIBUTES        0x000000800     // get attributes
#define SHGFI_ICONLOCATION      0x000001000     // get icon location
#define SHGFI_EXETYPE           0x000002000     // return exe type
#define SHGFI_SYSICONINDEX      0x000004000     // get system icon index
#define SHGFI_LINKOVERLAY       0x000008000     // put a link overlay on icon
#define SHGFI_SELECTED          0x000010000     // show icon in selected state


移位操作: >>(右移)和 <<(左移动),如二进制的111(7)右移2为7>>2=1,左移2为7<<2=11100(28)

八.WaitForSingleObject

在多线程程序中,等待一个线程(可以是其他内核对象,这里方便举例)结束之前,阻塞其他进程.

如下示例

CString strCommand="";
  STARTUPINFO si = {sizeof(si)};
  PROCESS_INFORMATION pi;
  CHAR cWindowsDir[MAX_PATH];
  CHAR cCommand[MAX_PATH];
 
  GetWindowsDirectory(cWindowsDir,MAX_PATH);  //获取系统目录
  strCommand= (CString)cWindowsDir+"\\NotePad.exe";
  strcpy(cCommand,strCommand);  //得到记事本的程序路径
 
  BOOL bRet = CreateProcess(NULL,cCommand,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);//启动记事本程序
  if (bRet)
  {
   if (!WaitForSingleObject(pi.hProcess,INFINITE))// 等待记事本程序关闭
   {
    AfxMessageBox("记事本已经关闭!");
   }
  }

用WaitForSingleObject可以等待记事本关闭后再继续执行,好比程序中弹出一个Dialog的意思是一样的,不这么做的话,程序则会继续往下执行

参考:http://wenku.baidu.com/view/71c713d5360cba1aa811dab2.html

九.SendDlgItemMessage

SendDlgItemMessage是向对话框中的指定控件发送消息。
SendMessage是向指定窗口或者控件发送消息。
SendDlgItemMessage(hDlg,IDC_LIST,LB_ADDSTRING,0,(LPARAM)"ListBox");
可以正常向List中AddString。
SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_LIST,LB_ADDSTRING),(LPARAM)"ListBox");
不能达到预期的目的。
因为WM_COMMAND是命令消息,主要是菜单或者工具按钮发给窗口的消息,而窗口中没有向List中AddString这种命令,除非你自己加入相应的代码处理。用SendMessage应该向List发送AddString消息。
::SendMessage(::GetDlgItem(this->m_hWnd, IDC_LIST),LB_ADDSTRING,0,(LPARAM)"ListBox");