在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(不是当前程序) }
问题原因
- test.exe语法错误:直接给字符数组赋值字符串(
delFp[200] = "del...";)不符合C语言语法,编译器会报错,导致参数传递失败。 - 参数解析逻辑错误:当传递
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
相关产品推荐
相关产品推荐

