如何让注册表写入程序接收命令行参数并写入路径值?
实现通过命令行参数修改注册表值的方法
问题描述
现有一段修改注册表的C代码,会将硬编码的EXE路径写入HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Event Viewer下的MicrosoftRedirectionUrl值。需要修改代码,支持通过命令行传入路径(例如myprogram.exe C:\Users\User\MrUser\temp.exe),将传入的路径作为值写入注册表。
原代码如下:
#include <windows.h> #include <string.h> int main(int argc, char* argv[]) { HKEY hkey = NULL; const char* evtwvr = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Event Viewer"; const char* exepath = "file://C:\\Users\\MrUser\\Desktop\\temp.exe"; LONG rgdt = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCSTR)evtwvr, 0 , KEY_WRITE, &hkey); if (rgdt == ERROR_SUCCESS) { RegSetValueEx(hkey, (LPCSTR)"MicrosoftRedirectionUrl", 0, REG_SZ, (unsigned char*)exepath, strlen(exepath)); RegCloseKey(hkey); } return 0; }
修改方案
要实现命令行传参,需要做以下关键修改:
- 校验命令行参数数量,确保用户传入了目标路径
- 构造符合原格式的路径字符串(添加
file://前缀) - 增强错误处理,输出调试信息
- 避免内存泄漏
修改后的代码如下:
#include <windows.h> #include <string.h> #include <stdio.h> int main(int argc, char* argv[]) { HKEY hkey = NULL; const char* evtwvr = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Event Viewer"; char* exepath = NULL; LONG status; // 检查命令行参数是否存在 if (argc < 2) { printf("用法: %s <目标EXE路径>\n示例: %s C:\\Users\\User\\MrUser\\temp.exe\n", argv[0], argv[0]); return 1; } // 构造带file://前缀的路径字符串 size_t prefix_len = strlen("file://"); size_t path_len = strlen(argv[1]); exepath = (char*)malloc(prefix_len + path_len + 1); // +1 用于存储终止符 if (exepath == NULL) { printf("内存分配失败\n"); return 1; } strcpy(exepath, "file://"); strcat(exepath, argv[1]); // 打开注册表项 status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, evtwvr, 0, KEY_WRITE, &hkey); if (status != ERROR_SUCCESS) { printf("打开注册表项失败,错误码: %ld\n", status); free(exepath); return 1; } // 写入注册表值 status = RegSetValueEx(hkey, "MicrosoftRedirectionUrl", 0, REG_SZ, (unsigned char*)exepath, strlen(exepath)); if (status == ERROR_SUCCESS) { printf("注册表值修改成功\n"); } else { printf("写入注册表值失败,错误码: %ld\n", status); } // 清理资源 RegCloseKey(hkey); free(exepath); return 0; }
关键修改说明
- 参数校验:通过
argc < 2判断用户是否传入路径参数,若未传入则输出用法提示并退出。 - 路径构造:原代码中路径带有
file://前缀,因此需要将用户传入的路径与该前缀拼接,确保写入的格式与原逻辑一致。使用malloc动态分配内存存储拼接后的字符串,避免栈溢出风险。 - 错误处理增强:对
RegOpenKeyEx、RegSetValueEx的返回值进行检查,输出错误码帮助排查问题;同时处理内存分配失败的情况。 - 资源清理:使用
free释放动态分配的内存,调用RegCloseKey关闭注册表句柄,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Mardook
相关产品推荐
相关产品推荐

