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

在C语言中使用ShellExecuteA无法传递含空格字符串的问题求助

解决ShellExecuteA传递含空格路径的问题

我尝试通过ShellExecuteA向自己开发的另一个程序传递文件路径,但路径包含空格时无法正常工作。

test.exe中的代码:

// 原代码直接给数组赋值字符串的方式存在语法错误,需修正
char delFp[200];
strcpy_s(delFp, 200, "del \"C:\\Users\\John Doe\\Documents\\Winsock\\Winsock\\x64\\Release\\test.exe\"");
ShellExecuteA(
    NULL,
    NULL,
    "MyOtherApplication.exe",
    delFp,
    NULL,
    SW_SHOW);

MyOtherApplication.exe中的代码:

if (strncmp(argv[1], "del", 3) == 0)
{
    printf("Deleting origin...\n");
    Sleep(1000);
    str_cut(argv[1], 0, 3);
    char del[200];
    strcat_s(del, 200, "del \"");
    strcat_s(del, 200, argv[1]);
    strcat_s(del, 200, "\"");
    system(del); // 删除test.exe(不是当前程序)
}

问题原因

  1. test.exe语法错误:直接给字符数组赋值字符串(delFp[200] = "del...";)不符合C语言语法,编译器会报错,导致参数传递失败。
  2. 参数解析逻辑错误:当传递del "带空格的路径"时,系统会自动拆分参数:argv[1]是del,argv[2]才是带空格的路径(引号会被解析器移除,空格内的内容被识别为单个参数)。但MyOtherApplication.exe错误认为整个命令都在argv[1]中,截断后丢失了实际路径。

修正方案

1. 修复test.exe的参数赋值

用strcpy_s安全赋值字符串,避免语法错误:

char delFp[200];
strcpy_s(delFp, 200, "del \"C:\\Users\\John Doe\\Documents\\Winsock\\Winsock\\x64\\Release\\test.exe\"");

2. 修正MyOtherApplication.exe的参数解析逻辑

正确读取拆分后的参数,路径在argv[2]中:

// 先检查参数数量是否足够
if (argc >= 2 && strncmp(argv[1], "del", 3) == 0)
{
    printf("Deleting origin...\n");
    Sleep(1000);
    // 确保路径参数存在
    if (argc >= 3)
    {
        char del[200];
        // 直接使用argv[2]作为路径,无需额外截断
        strcat_s(del, 200, "del \"");
        strcat_s(del, 200, argv[2]);
        strcat_s(del, 200, "\"");
        system(del);
    }
}

额外优化(可选)

也可以直接传递del和路径作为两个独立参数,不需要给路径加引号(ShellExecuteA会自动处理空格):

// test.exe中修改参数
strcpy_s(delFp, 200, "del C:\\Users\\John Doe\\Documents\\Winsock\\Winsock\\x64\\Release\\test.exe");

此时MyOtherApplication.exe的逻辑保持上面的修正即可,系统仍会将del作为argv[1],路径作为argv[2]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:45:34