代码改变世界

Visual C++ 2011-4-12

  Clingingboy  阅读(1812)  评论(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");

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2007-04-12 ASP.NET 2.0服务器控件与组件开发中文版即将出版
点击右上角即可分享
微信分享提示