MFC小技巧



帮朋友做的小程序,里面用到一些以前没有用过的(MayBe以后将要用的J),Record!!!


我的环境:Windows XP Professional SP2 ,Visual Studio 2005 Professional SP1


1. 只允许一个用户实例:
该功能的实现MS建议使用Mutex(互斥体)进行实现。那么我们首先需要给这个Mutex一个标示,用编写COM组件的GUID生成器生成吧!
1.在Visual Studio Tools中的 Visual Studio 2005 命令提示 中输入guidgen,生成一个guid供使用
2.创建互斥体,我是在OnInitDialog()中创建的,在文件××××Dlg.cpp中(××××为你的工程名),事实上大部分的初始化代码都可以放在这里,这里的代码会在MFC程序启动时运行,首先在××××Dlg.h中声明一个HANDLE对象,我是用的是m_hOneInstance
接着在BOOL C×××Dlg::OnInitDialog()中加入如下代码

//创建互斥体
m_hOneInstance = ::CreateMutex(NULL, false, _T(UNIQUE_NAME));
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
AfxMessageBox(_T("
此程序禁止两次运行!"));
ExitProcess(0); //
退出程序
}
3.为这个程序添加退出事件,即就是重写void C××××Dlg::PostNcDestroy()函数。该函数在退出MFC程序时会调用。我们可以在××××Dlg.h中看到OnInitDialog()函数的声明,那么,照猫画虎吧
我的PostNcDestroy()实现
void CMutextestApp::PostNcDestroy()
{
CloseHandle(m_hOneInstance);
CDialog::PostNcDestroy(); //
调用原本的PostNcDestroy()函数
}


2. VC的注册表操作
主要是添加了开机自启动项
函数详解
a)打开注册表,定位到某个KEY

long
RegOpenKeyEx(
HKEY hKey, //
待打开的预定义键
LPCTSTR lpSubKey, // 待打开的子键的地址
DWORD ulOptions, // 保留
REGSAM samDesired, // 安全访问掩码
PHKEY phkResult // 打开的键的地址
);
b) 关闭注册表
RegCloseKey(HKEY hKey, // 待打开的预定义键
)
c)向注册表写入值
long RegSetValueEx(
HKEY hKey, //
待打开的预定义键
LPCTSTR lpValueName, //一个指向包含值名的字符串指针
DWORD Reserved, //保留,通常必须设置为
DWORD dwType, //设置的值的类型
CONST BYTE lpData, //指向包含插入注册表的键值的缓冲区的指针
DWORD cbData //指向保存返回值长度的变量的指针
);
d)
从注册表删除值
long RegDeleteValue(
HKEY hKey, //
待打开的预定义键
LPCTSTR lpSubKEY //欲删除的键名
);
实例
//写入注册表,开机自启动
HKEY hKey;//找到系统的启动项
LPCTSTR lpRun = _T("Software\Microsoft\Windows\CurrentVersion\Run");//打开启动项Keylong lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);if(lRet == ERROR_SUCCESS){ unsigned
char pFileName[MAX_PATH] = {0}; //
得到程序自身的全路径
DWORD dwRet = GetModuleFileName(NULL, (LPWCH)pFileName, MAX_PATH); //添加一个子Key,并设置值
lRet = RegSetValueEx(hKey, _T("Mutextest"), 0, REG_SZ, (BYTE )pFileName, dwRet); //关闭注册表
RegCloseKey(hKey); if(lRet != ERROR_SUCCESS) { AfxMessageBox(_T("系统参数错误,不能随系统启动")); CHECK1.SetCheck(0);
}}


3. VC的获取系统时间
使用VC的一个结构体SYSTEMTIME,其中包括年、月、日、时、分、秒等信息。可以使用结构体的访问方式访问其中值。
使用
GetSystemTime(&SYSTEMTIME)传入一个SYSTEMTIME类型的引用/指针即可取得当前系统时间。注意,取得的时间是格林尼治时间,比如我们在正8时区就要手动给当前时间进行修正。
SYSTEMTIME tm;
GetSystemTime(&tm);
//
输出时间
outfile << setw(2) << tm.wMonth << "/" << setw(2) << tm.wDay << "/" << tm.wYear << " " << setw(2) << (tm.wHour + 8)%24 << ":" << setw(2) << tm.wMinute << ":" << setw(2) << tm.wSecond << " ";


4.
VC的获取当前用户名
使用函数GetUserName(),用法如下
char buf[64];GetUserName(buf, sizeof(buf));
<span style="font-family:微软雅黑;">参考文章:

如何在VC++中使用注册表
MFC访问注册表和ini文件