微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c ++ CreateProcess无法与app和带有反斜杠“ /”的args一起使用-与App = NULL一起使用

如何解决c ++ CreateProcess无法与app和带有反斜杠“ /”的args一起使用-与App = NULL一起使用

| 解:\”
    ShellAndWait(NULL,_FinalShellStrCmd,\"WAIT\",240,1);
使用stringstream将App和Arg组合成_FinalShellStrCmd,将第一个arg保留为NULL。向前或向后斜杠都可以正常工作。再次谢谢大家。 我使用boost来获取当前路径,然后得到\“ d:/ bin / test。 现在,我尝试使用CreateProcess()库函数在下面调用ShellAndWait()。在目录路径中使用反斜杠\“ \\,例如d:\\ bin \\ test。它的工作方式类似于charm。 我已经将应用程序路径和args打印输出到dos提示符下,然后将它们复制并粘贴到dos提示符下,它执行OK。例如,D:/bin/test/test.exe d:/bin/test/test.dat                                        应用程序路径参数 如果我将app-path和args放在下面的ShellWandWait函数中,它什么也没做。我怀疑CreateProcess()不会采用带有正斜杠“ /”的路径或目录。 有人给我点灯吗?再次感谢。
int BasicExcelCell::ShellAndWait(char *AppName,char *AppArgument,char *Wait,DWORD       TimeOut=0,DWORD IgnoreErrorFlag=0)
{

PROCESS_informatION ProcessInfo; //This is what we get as an [out] parameter
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo,sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field


TimeOut =  TimeOut * 1000;

if (Wait == \"NowAIT\")
    ShellExecute(NULL,\"open\",AppName,AppArgument,\" \",SW_SHOW );
else //WAIT
{
    //printf(\"ShellExecute WAIT\\n\");
    printf(\"Appname:%s  AppArgs:%s\\n\",AppArgument);
    UINT olderrormode;

    if (IgnoreErrorFlag)
    {
          olderrormode = SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOGPFAULTERRORBox);
    }

    if (CreateProcess(AppName,NULL,FALSE,CREATE_NEW_CONSOLE,&StartupInfo,&ProcessInfo))
    {
        std::cout<<\"WaitingSingleOjbec\"<<endl;
        DWORD dwret = WaitForSingleObject(ProcessInfo.hProcess,TimeOut);
        switch (dwret)
        {
        case WAIT_OBJECT_0:
            break;
        case WAIT_TIMEOUT:
        default:
            TerminateProcess(ProcessInfo.hProcess,0);
            break;
        }
        CloseHandle(ProcessInfo.hThread);
        CloseHandle(ProcessInfo.hProcess);
    }

    if (IgnoreErrorFlag)
    {
        SetErrorMode(olderrormode);
    }
}

return 0;

}
    

解决方法

您已经有了答案:CreateProcess不适用于正斜杠。修复斜杠=>代码有效。某些面向用户的API和接口比其他的更具接受性     ,有一个很好的理由说明CreateProcess无法使用正斜杠:Windows程序经常将它们用作命令行选项说明符(例如\“ dir / w \”或\“ format c:/ q \”)。 DOS的一个旧包规定,正斜杠参数不需要用空格分隔-因此,DOS / Windows控制台命令的以下格式也有效:\“ dir / w \”,\“ format c:/ q \“。 我猜想Windows API程序员希望CreateProcess支持此功能,因此他们决定不将正斜杠解析为路径分隔符。与DOS和现有Windows程序的兼容性比与POSIX的兼容性更重要。     ,我认为最好的方法是创建一个
boost:filesystem::path
对象,然后使用
make_preferred()
。让boost库处理字符替换作业。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。