Как вы запускаете внешние программы с параметрами без отображения окна cmd в Windows? - PullRequest
2 голосов
/ 02 апреля 2012

Я только что задал вопрос ранее сегодня, потому что я хотел запустить исполняемый файл, который получает параметры из моего кода C ++, и он не работал.

Это работает сейчас, но у меня все еще есть проблемы, так какЯ думал, что поступаю правильно, но кажется, что то, чего я хочу достичь, не может быть достигнуто так, как я к нему подхожу ...

Это мой исправленный код из моего другого вопроса:

#include <stdlib.h>
#include <conio.h>

int main (){
    system("\"\"C:\\Users\\Adam\\Desktop\\pdftotext\" -layout \"C:\\Users\\Adam\\Desktop\\week 4.pdf\"\"");
    _getch();
}

что я запускаю "pdftotext -layout myfile.pdf", как будто я запускаю его из окна CMD.

Дело в том, что я на самом деле не хочуcmd, чтобы показать, так как у меня есть интерфейс GUI поверх него, и я хочу отобразить более приятный индикатор выполнения вместо того, чтобы видеть всплывающие окна для каждого файла, который мне нужно проанализировать.

Я посмотрел вокруг и либоЯ не понимаю, что я читаю, так как я относительно новичок в C ++, или я просто не нашел то, что искал.Я обнаружил, что с помощью CreateProcess я смог бы сделать это, но после копирования некоторого кода, который я нашел в другом месте, окно cmd все равно всплывает.

Мне бы хотелось, чтобы кто-то мог дать мне имяфункции, которую я мог бы использовать для выполнения чего-то подобного, или если бы кто-то мог дать пример кода для этого небольшого случая в коде, который я разместил, так как я не уверен, что понимаю все как следует, будучи новичком в C ++ и всем.

Редактировать: В соответствии с просьбой в комментарии, код для CreateProcess, который я пробовал, - это то, что я нашел по этому URL:

http://www.goffconcepts.com/techarticles/development/cpp/createprocess.html

(с моими собственными параметрами, которые, я думаю, должны идти туда):

#include <windows.h>
#include <string>
#include <conio.h>

size_t ExecuteProcess(std::wstring FullPathToExe, std::wstring Parameters, size_t SecondsToWait)
{
    size_t iMyCounter = 0, iReturnVal = 0, iPos = 0;
    DWORD dwExitCode = 0;
    std::wstring sTempStr = L"";

    /* - NOTE - You should check here to see if the exe even exists */

    /* Add a space to the beginning of the Parameters */
    if (Parameters.size() != 0)
    {
        if (Parameters[0] != L' ')
        {
            Parameters.insert(0,L" ");
        }
    }

    /* The first parameter needs to be the exe itself */
    sTempStr = FullPathToExe;
    iPos = sTempStr.find_last_of(L"\\");
    sTempStr.erase(0, iPos +1);
    Parameters = sTempStr.append(Parameters);

     /* CreateProcessW can modify Parameters thus we allocate needed memory */
    wchar_t * pwszParam = new wchar_t[Parameters.size() + 1];
    if (pwszParam == 0)
    {
        return 1;
    }
    const wchar_t* pchrTemp = Parameters.c_str();
    wcscpy_s(pwszParam, Parameters.size() + 1, pchrTemp);

    /* CreateProcess API initialization */
    STARTUPINFOW siStartupInfo;
    PROCESS_INFORMATION piProcessInfo;
    memset(&siStartupInfo, 0, sizeof(siStartupInfo));
    memset(&piProcessInfo, 0, sizeof(piProcessInfo));
    siStartupInfo.cb = sizeof(siStartupInfo);

    if (CreateProcessW(const_cast<LPCWSTR>(FullPathToExe.c_str()),
                            pwszParam, 0, 0, false,
                            CREATE_DEFAULT_ERROR_MODE, 0, 0,
                            &siStartupInfo, &piProcessInfo) != false)
    {
         /* Watch the process. */
        dwExitCode = WaitForSingleObject(piProcessInfo.hProcess, (SecondsToWait * 1000));
    }
    else
    {
        /* CreateProcess failed */
        iReturnVal = GetLastError();
    }

    /* Free memory */
    delete[]pwszParam;
    pwszParam = 0;

    /* Release handles */
    CloseHandle(piProcessInfo.hProcess);
    CloseHandle(piProcessInfo.hThread);

    return iReturnVal;
} 

int main(void){
    ExecuteProcess(L"C:\\Users\\Adam\\Desktop\\pdftotext", L"-layout \"C:\\Users\\Adam\\Desktop\\week 4.pdf\"", 0);
    _getch();
}

Я немного ошеломлен, поскольку он использует некоторые вещи, которые я никогда раньше не использовал, но я думаю, что понимаю ядро ​​(ключевое слово: думаю ).Тем не менее, это не решает мою проблему, потому что cmd обнаруживается и при повторном тестировании я действительно заметил, что cmd даже не запускает .exe и не выдает мне сообщение об ошибке.

Iнадеюсь, что этот фрагмент кода поможет ... Я не хотел вдаваться в подробности, так как казалось, что я даже не двигался в правильном направлении.

Ответы [ 3 ]

0 голосов
/ 02 апреля 2012

После добавления следующих строк для siStartupInfo окно cmd больше не будет отображаться с моим собственным тестом * .exe.

siStartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
siStartupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
siStartupInfo.hStdOutput =  GetStdHandle(STD_OUTPUT_HANDLE);
siStartupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
siStartupInfo.wShowWindow = SW_HIDE;

Но у меня есть другая проблема.Когда я пытаюсь запустить другой исполняемый файл, командная строка которого будет

TEST.exe <input-file> output-file

в окне cmd, WaitForSingleObject () вернет 258, а GetLastError () вернет 1813 («Указанный тип ресурса не найденфайл изображения. ").См. system () и CreateProcess () / CreateProcessW () для получения более подробной информации.

Любые идеи будут высоко оценены!

0 голосов
/ 21 января 2014

Единственный способ, с помощью которого я нашел способ запуска внешней программы: system («start C: \ file path \ file»);Единственная проблема заключается в том, что в файле или каталоге не должно быть пробелов.

0 голосов
/ 02 апреля 2012

Используйте CreateProcess вместо системы.

- EDIT -

код для CreateProcess, который я пробовал, - это то, что я нашел по этому адресу:

Код беспорядок, я бы посоветовал избегать этого URL в будущем.

В конце статьи «CreateProcess» находится ссылка « Создание процессов» , в которой содержится более простой пример, который легче читать. Используйте это как отправную точку.

...