Как мне скомпилировать программу на C для запуска без командной строки? - PullRequest
0 голосов
/ 17 апреля 2011

Мне нужна очень простая программа для запуска на любой версии Windows, скажем,> = Win 98, без какой-либо предустановленной инфраструктуры, такой как dotnet.Я подумал, что C было бы хорошей идеей сделать это.

Программа должна запустить процесс из родительского каталога с помощью системной команды.

Запустить программу C (невидимо)>программа запускает процесс> программа завершается

Вот как это выглядит:

#include <stdio.h>
#include <stdlib.h>

int main() {
    system("..\\someprogram.exe");
    return 0;
}

Я вызываю эту программу из Flash-проектора, который позволяет запускать программы только в определенной подпапке "fscommand "- но мне нужно запустить процесс, расположенный в том же каталоге, что и проектор.

В любом случае, он работает нормально!Но программа C открывает окно команд, затем запускает процесс и оставляет окно команд открытым, пока процесс выполняется.Итак, вот как это должно работать, для того, как бы я это оценил:

  1. Не открывать окно команд вообще (мне бы этого хотелось, правда;)
  2. Оба3) и 4)
  3. Закройте окно команд после запуска процесса (выйдите из программы C)
  4. Откройте окно команд, свернутое по умолчанию

Я могу '• не изменяйте настройки Windows для исполняемого файла C или используйте ярлык, поскольку он будет запущен непосредственно с компакт-диска позже.

Я использую Open Watcom для компиляции своей программы.Оба типа изображений (целевые параметры), которые создают исполняемый файл (Исполняемый файл в символьном режиме / Исполняемый файл в режиме окна), имеют одинаковый результат.

Ответы [ 6 ]

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

Друг придумал совершенно другое решение. Теперь я использую AutoIt с коротким скомпилированным скриптом для запуска процесса. Это очень просто, и процесс запуска полностью невидим. :)

filename = ..\someprogram.exe

if FileExist(filename) {    
    Run, open %filename%
}
0 голосов
/ 17 апреля 2011

Окно консоли появляется, потому что вы создали свою программу как консольное приложение.Я не знаю, как избежать этого в C, но в Delphi была простая {$Console Off} прагма в файле проекта.

GCC имеет параметр командной строки -mwindows, который, я думаю, достигает того же, чтобы вы могли искать в этом направлении.

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

CreateProcess с флагом CREATE_NO_WINDOW - это то, что вы хотите, но я хочу кое-что добавить.Для поддержки команд в стиле cmd (таких как DIR, SET, ...), которые не имеют исполняемых файлов и не могут быть переданы только в CreateProcess, следует вызвать cmd.exe /C someprogram, где someprogram - это имяисполняемый файл, файл bat или команда.

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

Я выполнил поиск в Google и нашел http://www.ntwind.com/software/utilities/hstart.html

Вы используете консольное приложение, вы можете изменить его на Windows-приложение, используя winmain()

Вы можете использовать ярлык дляфайл в той же папке, не уверен, почему ваш дисконтирование этого метода.

start даст вам вилку, чтобы ваше промежуточное приложение могло закрыться - не уверен насчет win98 tho.

system("start ..\\someprogram.exe");

Вместо системы вы можете использовать createProcess для запуска приложения, они будут избегать консоли команд system.

STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

// Start the child process. 
if( !CreateProcess( "..\\someprogram.exe",   // module name 
    NULL,        // Command line
    NULL,           // Process handle not inheritable
    NULL,           // Thread handle not inheritable
    FALSE,          // Set handle inheritance to FALSE
    0,              // No creation flags
    NULL,           // Use parent's environment block
    NULL,           // Use parent's starting directory 
    &si,            // Pointer to STARTUPINFO structure
    &pi )           // Pointer to PROCESS_INFORMATION structure
) 
{
    printf( "CreateProcess failed (%d).\n", GetLastError() );
    return;
}

// Wait until child process exits.  In your case you don't care to wait anyway
// WaitForSingleObject( pi.hProcess, INFINITE );

// Close process and thread handles. 
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
0 голосов
/ 17 апреля 2011

Вы можете (например) использовать hstart вместо собственной программы для запуска этого exe.

(Это приведет к тому, что черный ящик вообще не будет.)

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

I думаю функции _exec и / или _spawn делают то, что вам нужно, хотя я не уверен.

Если нет, вы всегда можете использовать CreateProcess , хотя в некоторых случаях это может быть немного утомительно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...