Конвертировать консольный exe в dll в C - PullRequest
4 голосов
/ 25 сентября 2008

Я заинтересован в вызове SoX , консольного приложения с открытым исходным кодом, из другой программы Windows GUI (естественно, написанной на Delphi). Вместо того, чтобы заниматься очисткой и скрытием окна консоли, я хотел бы просто преобразовать приложение в DLL, которую я могу вызвать из своего приложения.

Прежде чем я начну идти по этому пути, мне интересно, сколько работы мне следует ожидать? Мы говорим о крупном предприятии или есть прямое решение? Я знаю немного C, но ни в коем случае не эксперт.

Я не ожидаю подробностей от SoX, просто преобразование консольного приложения EXE в DLL в целом. Если кто-то знаком с SoX, тем лучше.

Ответы [ 7 ]

6 голосов
/ 25 сентября 2008

Для конкретной темы превращения исполняемого файла консоли в библиотеку путем изменения исходного кода на языке C это зависит от того, как разложено приложение командной строки. Если он написан таким образом, что ввод / вывод направляется через небольшой набор функций или даже лучшие указатели на функции, то, очевидно, это будет тривиально.

Если все это сделано с printf, scanf и друзьями, то вам, вероятно, лучше всего найти / создать включаемый файл, включающий все исходные файлы, и добавить макрос, который перенаправляет printf / scanf и друзей на ваши собственные функции. которые написаны так, чтобы быть поддающимися реализации DLL. Такие вещи, как printf, могут быть построены из vsnprintf (используйте n-версию для безопасности), поэтому вам не нужно переопределять всю подсистему ввода / вывода C RTL. Однако vsscanf не существует, но в Интернете есть сторонние реализации.

Если код использует fprintf, fscanf и т. Д. Для включения косвенного обращения между файлами и консолью, вам все равно не повезло. Структура FILE непрозрачна, и в отличие от текстовых файлов Pascal, драйвер переносимого текстового файла не может быть реализован. Это все еще возможно, если вы запишите свой конкретный C RTL, но вам лучше посоветовать пойти по макро-маршруту и ​​переопределить свой переименованный тип FILE.

Наконец, подход «popen ()» возможен в Delphi и несколько упрощен в Delphi 2009 с классами TTextReader и TTextWriter. Объедините их с TFileStream, обернутым вокруг каналов, и укажите каналы для стандартного ввода, стандартного вывода и стандартной ошибки в новом процессе, STARTF_USESTDHANDLES и т. Д., И это будет работать. Если вы не хотите писать свои собственные, есть и сторонние эквиваленты / примеры в сети для Delphi. Вот один.

5 голосов
/ 25 сентября 2008

В Windows вы просто вызываете CreateProcess с командной строкой SoX. Я не знаю привязок Delphi для Win32, но я точно так и сделал в Win32 и C #.

И теперь, когда вы знаете, что CreateProcess - это то, что вы хотите назвать, поиск в Google о том, как это сделать из Delphi, должен дать вам весь необходимый код.

Статья Delphi Corner - Использование CreateProcess для выполнения программ

Простой вызов метода CreateProcess ()

4 голосов
/ 25 сентября 2008

Вам может даже не понадобиться DLL, вы можете использовать функцию popen () для запуска консольного приложения и сбора любого выходного текста.

3 голосов
/ 25 сентября 2008

Запустите процесс, как советовал Индив, и запишите результат, как показано на примере Адама

Однако, если вы все еще хотите выполнить преобразование DLL, это поможет вам начать работу

  1. Настроить SOX для Windows и скомпилировать его
  2. Создайте пустой проект DLL с помощью инструмента C ++
  3. Добавьте SOX-файлы для участия в проекте
  4. Добавить новую функцию с именем DLLMain

    BOOL APIENTRY DllMain (HANDLE hModule, DWORD ul_reason_for_call, LPVOID) {return TRUE;}

  5. Добавьте файл .DEF (используйте имя проекта в качестве имени файла), в котором перечислены экспорты в DLL. - Добавьте следующее содержимое

    LIBRARY      "name.DLL" 
    

    ЭКСПОРТ

    CallOldMain ЧАСТНЫЙ

  6. Переименование основного SOX в CallOldMain

  7. Напишите функцию CUSTOM для регистрации ошибок вывода / возврата и т. Д.

  8. Найдите все printfs / cout в приложении SOX и замените их вызовами вашей пользовательской функции выше

  9. После того, как DLL скомпилирована, вы можете теперь вызывать функцию CallOldMain с теми же параметрами, которые ожидаются основными программами Си. Вы можете изменить эту подпись так, чтобы она возвращала ошибки / выходные данные сверху.

3 голосов
/ 25 сентября 2008

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

Сначала вы хотите найти функции в приложении SoX, которые хотите вызвать. Скорее всего, консольное приложение имеет код для разбора командной строки и вызова соответствующих функций. Итак, во-первых, найдите функции, которые вы хотите использовать.

Далее ознакомьтесь с информацией об экспорте функций в DLL из C на этом сайте: Создание и использование DLL

Затем создайте новый файл проекта make-файла или визуальной студии с целью, являющейся DLL, и добавьте исходные файлы из программы SoX, которую вы изменили, для экспорта.

1 голос
/ 25 сентября 2008

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

Вы можете увидеть рабочий пример, написанный на delphi здесь: http://delphi.about.com/cs/adptips2001/a/bltip0201_2.htm

1 голос
/ 25 сентября 2008

Вы не упоминаете, какой у вас набор инструментов, но если вы сконфигурируете gcc в Windows, вы можете использовать обычный config; make; make install для простой компиляции sox. В процессе, он создаст файл dll и консольное приложение. Или вы можете просто указать цель make только для создания dll. Это скомпилирует собственную библиотеку Windows, которая зависит только от библиотеки DLL времени выполнения MS C, и вы можете использовать ее в своем собственном приложении.

...