如何用CreateProcess启动ClientProc.exe并读取SA_Client.ini?遇ERROR_DIRECTORY问题
问题分析与解决方案
错误码267(ERROR_DIRECTORY)的原因
错误码267表示“目录名称无效”,你的问题大概率是字符集不匹配导致的:
- 若项目采用VS默认的Unicode字符集,
CreateProcess会自动映射为宽字符版本CreateProcessW,但你传入的是ANSI格式的字符串(不带L前缀),系统无法正确解析路径,因此返回目录无效错误。
修复步骤
1. 统一字符集与路径格式
根据项目字符集选择对应格式的路径:
- Unicode字符集(推荐):
使用宽字符前缀L定义路径,变量类型改为LPCWSTR/LPWSTR:STARTUPINFOW si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); LPCWSTR lpApplicationName = L"C:\\projects\\Client\\ClientProc.exe"; LPCWSTR lpCurrentDir = L"C:\\projects\\Client"; if (!CreateProcessW(lpApplicationName, NULL, NULL, NULL, FALSE, 0, NULL, lpCurrentDir, &si, &pi)) { wprintf(L"CreateProcess failed (%d).\n", GetLastError()); return; } WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); - ANSI字符集:
确保项目设置为多字节字符集,路径使用ANSI格式,调用CreateProcessA:STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); LPCSTR lpApplicationName = "C:\\projects\\Client\\ClientProc.exe"; LPCSTR lpCurrentDir = "C:\\projects\\Client"; if (!CreateProcessA(lpApplicationName, NULL, NULL, NULL, FALSE, 0, NULL, lpCurrentDir, &si, &pi)) { printf("CreateProcess failed (%d).\n", GetLastError()); return; } WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread);
2. 解决INI文件读取问题
ClientProc.exe无法读取同目录INI的核心原因是:子进程默认继承父进程的当前工作目录,而非自身可执行文件所在目录。当你显式设置lpCurrentDirectory为程序所在目录后,子进程启动时的当前工作目录就是INI文件所在目录,此时程序用相对路径读取SA_Client.ini即可成功。
进阶优化(自动提取程序目录)
如果不想硬编码目录路径,可以从lpApplicationName中自动提取所在目录,避免路径硬编码:
// 以Unicode版本为例 wchar_t exePath[MAX_PATH] = {0}; wcscpy_s(exePath, MAX_PATH, lpApplicationName); // 找到最后一个反斜杠的位置 wchar_t* lastSlash = wcsrchr(exePath, L'\\'); if (lastSlash != NULL) { *lastSlash = L'\0'; // 截断文件名,保留目录路径 } // 此时exePath就是程序所在目录,传给lpCurrentDirectory
内容的提问来源于stack exchange,提问作者Taki
相关产品推荐
相关产品推荐

