c++ - 如果注册表项不存在

标签 c++ c registry

我正在添加我的程序以启动:

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/

相关文章:

c++ - 丢弃限定符未知原因 (std::bind()/lambda)

c - `va_num` 在这个可变参数宏中意味着什么?

c# - DeleteSubKey UnauthorizedAccessException

c - 如何从 C 中的 char 数组中释放内存

c - 在引用的字符串中扩展宏变量

c++ - 监视内核注册表更改

PowerShell 获取具有最大属性值的注册表项

c++ - 对象成员的位置

c++ - 在 map 中使用 lambda 作为比较器时的匿名类型警告

c++ - C++ 中的字符串文字的类型推导如何工作?