1. 获取逻辑驱动器字符串:
BOOL CVoicePlayerDlg::GetLogicalDrives(HTREEITEM hParent)
{
size_t szAllDriveStrings = GetLogicalDriveStrings(0,NULL);//返回需要的Buffer长度,包括了最后的NULL字符
char *pDriveStrings = new char[szAllDriveStrings ]; //分配存放逻辑驱动器字符串空间
size_t len = GetLogicalDriveStrings(szAllDriveStrings,pDriveStrings); //获取逻辑驱动器字符串
size_t szDriveString = strlen(pDriveStrings); //获取第一个字符串的长度
//循环读取每一个驱动器字符串
while(szDriveString > 0)
{
this->m_treelist.InsertItem(pDriveStrings,hParent);//将每一个驱动器字符串插入树形节点下
pDriveStrings += szDriveString + 1; //移动指针,每次移动的长度等于字符串有效长度加上NULL所占字节数
szDriveString = strlen(pDriveStrings); //获取下一个字串长度
}
return true;
}
实验截图:
程序分配了13个字节的空间,然后将逻辑驱动器字符串分别存入分配的空间内,每一个字符串以NULL结尾,总共有3个驱动器字符串,占用12个字节。在最后还有一个NULL字节用来表示结束。
2. 在MFC编程中可以在对话框类的OnInitDialog()函数中初始化相关成员变量和一些前期的准备工作;同时添加消息响应函数OnClose()中做清理工作。
3. 在一个进程中创建了另一个进程,如果想在父进程中手动结束子进程,则在创建子进程结束后不要关闭子进程句柄,否则会出错。
4. 有malloc 就一定有free, MFC的类成员变量最好都在OnInitDlalog()函数里初始化,而不要在其它某个函数里初始化。一些成员变量在使用前得先检查是否有合法的值,否则程序会在某些情况下意外崩溃。
5. CString的TrimLeft和TrimRightf方法可以去掉字符串左右两边指定的字符或字符串或者空格。
6. MFC程序也可以传参数,但是它和console程序不同,举个例子,假如给console程序传某个文件的路径参数,你可能需要加引号将路径参数括起来,但是mfc不需要。mfc获取参数的方法:
CString strCmdLine = AfxGetApp()->m_lpCmdLine;//传入的参数如果加了引号的话,这里获得的字符串也会含有引号
7. MFC程序可以修改编译方式,如最快速度、最小大小、默认等。产生的可执行程序也有些许差异。
8. 函数指针:假如有一个DLL,知道其某个函数的偏移(相对加载的基址),不是导出函数,怎么才能使用该函数呢?
假设已知道该函数的原型为 int ***func(int,int);偏移为0x0a0b;
①定义一个函数指针 typedef int (__stdcall *Func)(int, int);
②HADLE hModule = LoadLibrary("*****.dll");
③Func MyFunc = (Func)(hModule + ox0a0b);
④调用MyFunc(int a, int b);
如果该函数是导出函数,那就更好办,直接用GetProcAddress,把返回的值赋给定义的函数指针变量就行了。