在做一个后台服务应用时,需要修改注册表,为了写上值名称,用到
LONG RegSetValueEx(
HKEY hKey,
LPCWSTR lpValueName,
DWORD Reserved,
DWORD dwType,
const BYTE* lpData,
DWORD cbData
)
一开始,直接转换,代码如下
spath=L"e:/L's Documents/Visual Studio 2008/Projects/mslsrv/Debug/mslsrv.exe";
RegSetValueEx(hkey,L"svr1",0,REG_SZ,(LPBYTE)(LPCTSTR)spath,spath.GetLength());
运行后查注册表,写的值竟是"e:/L's Documents/Visual Studio 20",
而后换用RegSetValue(hkey,NULL,REG_SZ,spath,spath.GetLength()),运行后查注册表,对了!
不想用默认的名称!
想起编码unicode的长度与ASCII有区别,
CString s=L"我是";
assert(s.GetLength()==2);
char s="我是";
assert(strlen(s)==4);
也就是上面spath转换成LPBYTE后,长度就不是spath.GetLengh()了!于是把RegSetValueEx改成
RegSetValueEx(hkey,L"svr1",0,REG_SZ,(LPBYTE)(LPCTSTR)spath,spath.GetLength()+100);
运行后查注册表,值对了!
记录一下之余,值得研究的是,spath转换成LPBYTE后,准确长度是多少呢?