You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让注册表写入程序接收命令行参数并写入路径值?

实现通过命令行参数修改注册表值的方法

问题描述

现有一段修改注册表的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;
}

关键修改说明

  1. 参数校验:通过argc < 2判断用户是否传入路径参数,若未传入则输出用法提示并退出。
  2. 路径构造:原代码中路径带有file://前缀,因此需要将用户传入的路径与该前缀拼接,确保写入的格式与原逻辑一致。使用malloc动态分配内存存储拼接后的字符串,避免栈溢出风险。
  3. 错误处理增强:对RegOpenKeyEx、RegSetValueEx的返回值进行检查,输出错误码帮助排查问题;同时处理内存分配失败的情况。
  4. 资源清理:使用free释放动态分配的内存,调用RegCloseKey关闭注册表句柄,避免资源泄漏。

内容的提问来源于stack exchange,提问作者Mardook

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:25:32