В C ++ Попытка запустить EXE из UN C в Windows 10. Очень плохо знаком с C ++ - PullRequest
0 голосов
/ 13 апреля 2020

Я только начал писать консольное приложение на C ++. Он выполняет некоторую проверку, а затем ему нужно найти и запустить исполняемый файл, который может находиться в разных местах в зависимости от того, как он был развернут. Таким образом, большая часть сценария работает, и даже часть выполнения работает в зависимости от ОС и местоположения. Если он локальный, он работает, а если он windows 7, то, похоже, работает даже на UN C. Но в Windows 10 он просто завершается.

Скрипт находит исполняемый файл и запускает его по пути, по которому он находится. Он работает, когда я создал приложение в виде пакетного файла и использует popD для перемещения к Расположение exe для рабочего каталога, но я не могу имитировать c эту функциональность в C ++. Я попытался SetCurrentDirectory, но моя строка не пройдет, которую я пытаюсь передать.

if (version >= minver)
    {
        std::string name = "testApp.exe";
        std::string path = (fs::current_path().string());
        for (const auto& entry : fs::recursive_directory_iterator(path))
        {
            std::string list = entry.path().string();
            int found;
            if ((found = list.find(name)) !=list.npos)
            {
                std::cout << list << std::endl;
\\This is the part that sometimes works and sometimes doesn't
                system(list.c_str());

            }
        }
    }   

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Так что в конечном итоге я преследовал проблему неправильно. Спасибо LandStalker за лучший путь. Я был прав насчет подражания popD, но мне было трудно сделать это правильно, чтобы действительно работать.
I SetCurrentDirectory, а затем сделал ShellExecute в имени программы.

0 голосов
/ 14 апреля 2020

Поскольку вы можете запустить программу из консоли, попробуйте использовать функцию CreateProcess в режиме консоли:

int runProcessFromCmd( char* pcExecPath)
{

    if( NULL == pcExecPath)
    {
        printf("empty path!");
        return -1;
    }

    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    memset( &si, 0, sizeof(si) );
    memset( &pi, 0, sizeof(pi) );
    si.cb = sizeof(si);

    // Start child process from command line
    // First parameter = NULL => we use cmd
    if( !CreateProcess( NULL, pcExecPath, NULL,NULL, FALSE, 0, NULL,    NULL, &si, &pi )) 
    {
        printf( "CreateProcess failed with error (%d).\n", GetLastError() );
        return -2;
    }

    // Wait child process 
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close all handles
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}
...