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");