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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:36:16