1

解决方案:”

    ShellAndWait(NULL, _FinalShellStrCmd, "WAIT", 240, 1);

使用 stringstream 将 App 和 Arg 组合成 _FinalShellStrCmd,将第一个 arg 保留为 NULL。它适用于正斜杠或反斜杠。再次感谢大家。

我正在使用 boost 来获取当前路径,然后我得到“d:/bin/test。现在,我尝试使用 CreateProcess() 库函数调用下面的 ShellAndWait()。在目录路径中使用反斜杠“\ 例如..d: \bin\测试。它就像魅力一样。

我已将应用程序路径和参数打印输出到 dos 提示符,然后我将它们复制并传递到 dos 提示符,它执行正常。例如,D:/bin/test/test.exe d:/bin/test/test.dat app-path args

如果我将 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", AppName, AppArgument);
    UINT olderrormode;

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

    if (CreateProcess(AppName, AppArgument,
                      NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,
                      NULL,&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;

}
4

3 回答 3

2

您已经有了答案: CreateProcess 不适用于正斜杠。修复斜线 => 代码有效。某些面向用户的 API 和接口比其他的更容易接受

于 2011-04-13T17:02:57.950 回答
0

CreateProcess 不能使用正斜杠是有充分理由的:Windows 程序经常将它们用作命令行选项说明符(如“dir /w”或“format c: /q”)。来自 DOS 的旧包表明,正斜杠参数不需要用空格分隔 - 因此 DOS/Windows 控制台命令的以下格式也是有效的:“dir/w”、“format c:/q ”。

我猜 Windows API 程序员希望 CreateProcess 支持这一点,所以他们决定不将正斜杠解析为路径分隔符。与 DOS 和现有 Windows 程序的兼容性比与 POSIX 的兼容性更重要。

于 2011-04-13T17:09:52.400 回答
0

我认为最好的方法是创建一个boost:filesystem::path对象,然后使用make_preferred(). 让 boost 库处理字符替换工作。

于 2011-04-13T17:20:52.597 回答