我正在添加我的程序以启动:
TCHAR szPath[MAX_PATH];
GetModuleFileName(NULL,szPath,MAX_PATH);
HKEY newValue;
RegOpenKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&newValue);
RegSetValueEx(newValue,"myprogram",0,REG_SZ,(LPBYTE)szPath,sizeof(szPath));
RegCloseKey(newValue);
return 0;
我想添加一个检查,如果 key 不存在,然后才创建它。我的代码还有一些奇怪的地方,我已经检查了注册表中的 key ,并且在数据列中看到了我的应用程序路径 +“...”(在 .exe 之后),当我双击以检查弹出窗口打开的数据时,没关系,只是 .exe 不是 .exe...
谢谢你的帮助:)
最佳答案
无论路径实际有多长,您写出的值都是 MAX_PATH
字节宽。因此,您可能在 .exe 之后有很多非打印字符,这就是您看到“...”的原因。
文档说最后一个参数是字符串的大小,以字节 为单位,包括空终止符。所以我们需要知道字符串的长度 (lstrlen(szPath)
),我们需要考虑空终止符 (+ 1
),我们需要从TCHAR 到字节 (sizeof(TCHAR)*
)。
const DWORD cbData = sizeof(TCHAR) * (lstrlen(szPath) + 1);
RegSetValueEx(newValue, "myprogram", 0, REG_SZ, (LPBYTE)szPath, cbData);
此 API 容易出错,应非常小心地使用,以避免意外截断或缓冲区溢出。 (事实上你需要那些转换来让它编译应该让你非常谨慎。)许多接受字符串指针的 Windows 函数需要字符长度(可能不是字节)或者它们计算终止的长度。这个不会做这些事情中的任何一个。
关于c++ - 如果注册表项不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15868852/