error:Createprocess接收命令行的参数时,无法找到指定的文件。。

本文详细探讨了在使用CreateProcess函数时,不同编码设置导致的问题及解决方案,通过实例展示了如何在多字节工程下正确调用命令行参数,避免错误提示并确保程序顺利执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、在cmd命令行中输入的命令是: E:\P2PDownLoadCall.exe “p2pdownload.exe -r image\boot.img” 结果,CreateProcess failed,而且 GetLastError的结果为2,找不到对应的文件。

2、我也没辙了,然后就用写死的路径 Text(“p2pdownload.exe -r image\boot.img”);来作为CreateProcess函数的第二个参数,结果竟可以成功。

3、我才明白,是cmd的输入是多字节的,而vs默认当前的工程为Unicode型,因此会调用CreateProcessW函数,遇到多字节的参数,肯定会保存错误,因此得出了“找不到相应的文件的错误”

4、为了验证我的错误,我将本工程改为多字节的,结果,程序就顺利执行了。默认调用的是CreateProcessA,会以多字节的形式处理参数,因此会无误地识别cmd命令行传进来的参数。

5、多字节的工程代码如下:

#include <Windows.h>
#include <stdio.h>
#include <tchar.h>

int main( int argc, TCHAR ** argv )
{
    int nReturn = 1;
    if ( argc < 2 )
    {
        nReturn = 1;
        goto exit;
    }
    else
    {
        PROCESS_INFORMATION pi;
        STARTUPINFO si;
        DWORD dwExitCode = 1;
        TCHAR szCommand[500];

        ZeroMemory( &pi, sizeof( pi ) );
        ZeroMemory( &si, sizeof( si ) );
        si.cb = sizeof( si );
        si.dwFlags = STARTF_USESHOWWINDOW;
        si.wShowWindow = SW_HIDE;

        printf("argv[1]:%s\n",argv[1]);

        _tcscpy( szCommand, argv[1] );
        if ( CreateProcess( NULL, szCommand, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ) )
        {
            printf("CreateProcess succeeded!\n");
        } 
        else
        {
            printf("CreateProcess failed!GetLastError:%d\n",GetLastError());
            nReturn = 2;
            goto exit;
        }

        WaitForSingleObject( pi.hProcess, INFINITE );

        if ( GetExitCodeProcess( pi.hProcess, &dwExitCode ) )
        {
            printf("GetExitCodeProcess succeeded,dwExitCode is %d\n",dwExitCode);
            nReturn = 0;
        } 
        else
        {
            printf("GetExitCodeProcess failed,dwExitCode is %d,GetLastError:%d\n",dwExitCode,GetLastError());
            nReturn = 3;
        }
        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );
        goto exit;

    }
exit:

    return nReturn;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值