【问题标题】:Convert argument to LPWSTR CreateProcess将参数转换为 LPWSTR CreateProcess
【发布时间】:2019-02-18 03:04:40
【问题描述】:

我正在尝试使用cmd.exe 执行一些操作,但我想隐藏cmd.exe。当我尝试使用完整路径而不是 cmd.exe 时,我总是收到此错误:

char Process[] = "C:\\WINDOWS\\System32\\cmd.exe";
                STARTUPINFO sinfo;
                PROCESS_INFORMATION pinfo;
                memset(&sinfo, 0, sizeof(sinfo));
                sinfo.cb = sizeof(sinfo);
                sinfo.dwFlags = (STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW);
                sinfo.hStdInput = sinfo.hStdOutput = sinfo.hStdError = (HANDLE)mySocket;
                CreateProcess(NULL, Process, NULL, NULL, TRUE, 0, NULL, NULL, &sinfo, &pinfo);
                WaitForSingleObject(pinfo.hProcess, INFINITE);
                CloseHandle(pinfo.hProcess);
                CloseHandle(pinfo.hThread);

我总是得到:

CreateProcessW(LPCWSTR,LPWSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,LPVOID,LPCWSTR,LPSTARTUPINFOW,LPPROCESS_INFORMATION)':无法将参数 2 从 'char [28]' 转换为 'LPWSTR' ConsoleApplication1

【问题讨论】:

    标签: c++


    【解决方案1】:

    您传递的是窄字符数组而不是宽字符数组。

    将项目的字符编码设置更改为 MultiByte 而不是 Unicode,以便 CreateProcess 使用 CreateProcessA 而不是 CreateProcessW

    或者,使用wchar_t(或WCHAR,这是Windows 中wchar_t 可用的typedef)代替char

    wchar_t Process[] = L"C:\\WINDOWS\\System32\\cmd.exe";
    

    或者,您可以手动更改代码以使用CreateProcessA

    char Process[] = "C:\\WINDOWS\\System32\\cmd.exe";
    ...
    CreateProcessA(NULL, Process, NULL, NULL, TRUE, 0, NULL, NULL, &sinfo, &pinfo);
    ...
    

    【讨论】:

    • 注意:如果你依赖项目的字符编码,那么你应该使用TCHAR而不是charwchar_t:TCHAR Process[] = TEXT("C:\\WINDOWS\\System32\\cmd.exe"); ... CreateProcess(NULL, Process, ...);
    • @RemyLebeau 同意。如果项目应该同时兼容多字节和 unicode,建议使用 TCHAR 和其他宏。
    猜你喜欢
    • 2011-08-25
    • 1970-01-01
    • 2016-06-07
    • 2011-10-15
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多