Выполните автоматическую установку программно с помощью C++

У меня есть установщик приложения, скажем, app_installer.exe. Я могу автоматически установить его в свою систему с cmd, используя app_installer.exe /S. Теперь мне нужно сделать то же самое из службы Windows, и я создал для этого сервисное приложение в MSVS 2013. Я попытался использоватьCreateProcess() следующим образом:

if (CreateProcess(NULL,"E:\\app_installer.exe \S",NULL,NULL,FALSE,0,NULL,NULL,&StartupInfo, &ProcessInfo))
    {
        myfile << "Wait for object...\n";
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
    myfile << "Handles closed\n";

    }
    else
    {
        myfile << "The process could not be started...\n";
        myfile << GetLastError();
    }

Хотя CreateProcess (я также пробовал /SD,/silent,/q,/qn вместо /S) вернул ненулевое значение, мое приложение не было установлено. Затем я добавил в свой код следующую строку:

system("E:\\app_installer.exe \S \norestart);

При добавлении этой строчки, после запуска service у меня спросила view the message ли из службы и когда я нажал на View message пришел мастер установки.. Однако не молчит...

Это проблема с параметрами, которые я передал? Как может выполняться автоматическая установка на C++?


person Jackzz    schedule 24.07.2015    source источник
comment
Вам нужно экранировать символы обратной косой черты другой обратной косой чертой.   -  person Galik    schedule 24.07.2015
comment
@Galik: в CreateProcess или в системе?   -  person Jackzz    schedule 24.07.2015
comment
Во всех строковых литералах, если только вы не используете необработанные строковые литералы C++11.   -  person Galik    schedule 24.07.2015
comment
@Galik: я добавил.. все равно установка не бесшумная :(   -  person Jackzz    schedule 24.07.2015
comment
Подумайте, как компилятор должен отличать символ конца строки '\n' от символа обратной косой черты '\'? Вы должны экранировать символ обратной косой черты другой обратной косой чертой, например: '\\'.   -  person Galik    schedule 24.07.2015
comment
Попробуйте либо: "E:\\app_installer.exe \\S \\norestart", либо, альтернативно, "E:/app_installer.exe /S /norestart" (Windows также должна принимать косую черту).   -  person Galik    schedule 24.07.2015
comment
Попробовал.. появляется мастер установки...   -  person Jackzz    schedule 24.07.2015
comment
@Galik: правильная строка, скорее всего, будет "E:\\app_installer.exe /S /norestart" (вы не можете зависеть от Windows, принимающей косую черту в пути, это работает только иногда)   -  person Harry Johnston    schedule 25.07.2015
comment
Обратите внимание, что некоторые установщики просто не будут работать в контексте службы, хотя, к счастью, такие проблемы случаются редко. Тем не менее, вероятно, было бы проще сначала устранить неполадки в вашем коде как в обычном приложении, и только после того, как оно заработает, попытаться превратить его в службу.   -  person Harry Johnston    schedule 25.07.2015
comment
Кроме того, вы пробовали /S /norestart из интерактивной командной строки? То есть вы точно знаете, что установщик действительно принимает /norestart в качестве флага?   -  person Harry Johnston    schedule 25.07.2015
comment
@Harry На самом деле нет. Из командной строки я пробовал только /S .. поскольку он работал нормально, меня это не беспокоило. Это было, когда я не мог запустить его программно, я искал другие флаги .. я попробую .. также вы имели в виду написать простой cpp pgm для бесшумного запуска установщика?   -  person Jackzz    schedule 25.07.2015
comment
Да, в основном просто main(), содержащий код, который вы разместили.   -  person Harry Johnston    schedule 25.07.2015
comment
@HarryJohnston: да ... можно установить без вывода сообщений из простой программы на C++ (содержащей только main()), используя system("E:\\app_installer.exe /S");. Но та же команда в WinService дает интерактивный установщик...   -  person Jackzz    schedule 27.07.2015
comment
Может быть ошибка в системе(). Теперь, когда вы знаете, какую командную строку использовать, попробуйте снова использовать CreateProcess. Но это также может быть проблема с установщиком.   -  person Harry Johnston    schedule 27.07.2015


Ответы (1)


Пожалуйста, проверьте элемент структуры STARTUPINFO «StartupInfo.wShowWinodw», как показано ниже, и повторите попытку.

STARTUPINFO StartupInfo;
memset(&StartupInfo, 0, sizeof(StartupInfo));
StartupInfo.cb = sizeof(STARTUPINFO);
StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow = SW_HIDE; //Set this flag to hide windows while create process.
person Dattatraya Mengudale    schedule 07.03.2021