Как правило, GUI к консольным утилитам запускает консольную утилиту скрытно (самый распространённый пример - ffMpeg, на нём 95% Windows-конверторов форматов базируются... и нет, я не согласен, что проще командную строку написать, из GUI утилиты проще выбрать пресет, кинуть туда пять файликов, нажать галку "Выключить комп по завершению", запустить процесс и уйти спать... в консоли придётся целый батник писать строчек на десять). Что можно почитать по теме? Самое простое:
http://wiki.lazarus.freepascal.org/Exec ... s#TProcessТеоретически, это должно работать кроссплатформенно. Если кроссплатформенность не интересует - можно сделать на WinAPI:
http://www.delphikingdom.com/asp/viewit ... alogid=736Варианты решения, где GUI и консоль разделяют одну библиотеку тоже бывают, но существенно реже, обычно это делается вынесением 99% функционала консольной утилиты в DLL (в линуксе тоже есть что-то подобное), а GUI может этот функционал использовать. Пример - 7z.
Вариант решения, в котором GUI и консоль используют один и тот же блок кода при компиляции (пакет, модуль), а потом становятся независимыми друг от друга - самый простой, но на моей практике я не припомню, чтобы он где-то встречался. Понятное дело, этот вариант - самый простой.
Ну и последний вариант, которым я обычно пользуюсь - в зависимости от запуска программы (с аргументами или без) она запускается либо как коньсоль, либо как GUI приложение. В первом случае её можно использовать в скриптах для автоматизации (например, надо отработать 3000 файлов - руками указать каждый файл... не, проще сразу застрелиться, а for %%i in ... делает работу за десять минут на всё про всё...) а во втором случае - пользоваться при небольшом количестве файлов. Минус очевиден - программа начинает весить столько же, сколько сумма консольной+GUI версии, но я бы назвал это оправданным - нельзя ничего потерять