ShellExecute调用mame64.exe部分指令无返回结果问题咨询
排查ShellExecute调用MAME -createconfig无反应的问题
我之前也碰到过类似用ShellExecute调用MAME命令的坑,尤其是这类不直接输出到控制台的指令,给你几个实用的排查方向:
先确认指令本身的行为:
-createconfig这个参数的作用是静默生成MAME的配置文件(默认是mame.ini),它本身就不会在控制台输出任何内容!你之前看到-listfull有结果,是因为这个参数会强制输出游戏列表到控制台,但-createconfig是后台写文件,所以你得去MAME的安装目录下找mame.ini,看看它有没有被创建或者更新——说不定指令已经成功执行了,只是你没找对地方。检查权限与路径问题:
- 如果你的程序是普通权限运行,而MAME装在系统保护目录(比如
C:\Program Files),那-createconfig可能因为没有写入权限失败。试试把MAME移到非系统目录(比如D:\MAME),或者给你的程序提权后再调用。 - 确保调用
ShellExecute时用的是mame64.exe的绝对路径,避免因为当前工作目录不对导致找不到程序,看起来像是“无反应”。
- 如果你的程序是普通权限运行,而MAME装在系统保护目录(比如
验证参数传递是否正确:
检查你拼接的参数有没有拼写错误,比如是不是把-createconfig写成了-create-config?另外,ShellExecute的参数格式要注意,比如如果路径里有空格,要给路径加引号,比如:ShellExecute(NULL, L"open", L"D:\\MAME Folder\\mame64.exe", L"-createconfig", NULL, SW_HIDE);换用更可控的CreateProcess替代ShellExecute:
ShellExecute更适合启动关联程序,对于需要确认执行状态、捕获输出的场景,CreateProcess是更好的选择。它能让你明确知道进程是否启动成功,还能获取退出码判断执行结果。比如这个简单的C++示例:STARTUPINFO si = { sizeof(STARTUPINFO) }; PROCESS_INFORMATION pi; // 注意第二个参数要包含程序名和参数,或者第一个参数用NULL,第二个参数传完整命令行 BOOL isSuccess = CreateProcess( L"D:\\MAME\\mame64.exe", L"mame64.exe -createconfig", NULL, NULL, FALSE, 0, NULL, L"D:\\MAME", &si, &pi ); if (isSuccess) { // 等待进程执行完成 WaitForSingleObject(pi.hProcess, INFINITE); DWORD exitCode; GetExitCodeProcess(pi.hProcess, &exitCode); if (exitCode == 0) { // 执行成功,去检查mame.ini MessageBox(NULL, L"配置文件生成成功!", L"提示", MB_OK); } else { // 执行失败,exitCode可能对应MAME的错误码 MessageBox(NULL, L"生成配置文件失败!", L"错误", MB_OK); } // 记得关闭句柄 CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } else { MessageBox(NULL, L"无法启动MAME程序!", L"错误", MB_OK); }
先从检查mame.ini是否存在开始排查,大概率是你误以为指令没执行,其实已经生成文件了~
内容的提问来源于stack exchange,提问作者azrael11
相关产品推荐
相关产品推荐

