c ++ CreateProcess () не будет работать с приложением и аргументы с косой чертой "/" - работает с App = NULL - PullRequest
0 голосов
/ 13 апреля 2011

Решение: "

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

Используя stringstream, чтобы объединить App и Arg в _FinalShellStrCmd, оставьте первый аргумент равным NULL. Он работал нормально с прямой или обратной косой чертой. Еще раз спасибо.

Я использую повышение, чтобы получить текущий путь, затем я получаю "d: / bin / test.Теперь я пытаюсь вызвать ShellAndWait () ниже с помощью библиотечной функции CreateProcess ().С обратной косой чертой "\ в пути к каталогу, например .. d: \ bin \ test. Это работает как charm.

У меня есть распечатка пути к приложению и аргументы для приглашения dos, затем я копирую их и вставляю в dosподсказка, она выполнена ОК. Пример, D: /bin/test/test.exe d: /bin/test/test.dat путь к приложению 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;

}

Ответы [ 3 ]

2 голосов
/ 13 апреля 2011

У вас уже есть ответ: CreateProcess не работает с косой чертой. Исправить косую черту => код работает. Некоторые пользовательские API и интерфейсы более приемлемы, чем другие

0 голосов
/ 13 апреля 2011

Я думаю, что лучший способ - создать объект boost:filesystem::path и затем использовать make_preferred().Пусть библиотека Boost обрабатывает работу по замене символов.

0 голосов
/ 13 апреля 2011

Есть веская причина, по которой CreateProcess не будет работать с косой чертой: программы Windows часто используют их в качестве спецификатора параметра командной строки (например, «dir / w» или «format c: / q»). Старый багаж из DOS требует, чтобы аргументы forward-slash не разделялись пробелом, поэтому допустим также следующий формат для команды консоли DOS / Windows: "dir / w", "format c: / q ».

Я предполагаю, что программисты Windows API хотели, чтобы CreateProcess поддерживал это, поэтому они решили не анализировать косые черты как разделители пути. Совместимость с DOS и существующими программами Windows важнее, чем совместимость с POSIX.

...