Как добавить внешний исполняемый файл в проект Borland C++ Builder 2010?

Итак, вопрос в том, как добавить в C++ Builder 2010 какой-то внешний файл .exe? Допустим, я сделал какую-то программу в Visual Basic и имею исполняемый файл, поэтому мне не нужно делать тот же код на С++. Я хочу просто включить этот исполняемый файл в свой проект? Можно ли сделать переносимое приложение одним исполняемым файлом, внутри которого находится другой исполняемый файл (возможно, в пути к ресурсам)? Как это вызвать в коде, если это один exe в другом? Я знаю, как вызвать его системной функцией или другим способом, указав направление на исполняемый файл, но как это сделать, если он находится по тому же адресу, что и основной исполняемый файл?


person raptor    schedule 11.01.2011    source источник
comment
В общем, вам следует вместо этого создать dll с кодом, который вы хотите вызвать. Обратите внимание, однако, что намного проще вызывать код C++ из VB, чем наоборот.   -  person Matteo Italia    schedule 11.01.2011
comment
exe в Visual Basic сказано просто для примера, суть в том, что я не знаю (или не хочу знать) функцию которая используется в exe, мне нужен только конечный результат выполнения, скажем так это exe, созданный программированием на ассемблере, и я просто хочу использовать функциональность этого exe, не хочу изучать исходный код этого exe ...   -  person raptor    schedule 11.01.2011
comment
затем используйте функцию WinApi CreateProcess. он возвращает дескрипторы для stdin и stdout порожденного процесса. вы можете просто прочитать все данные из стандартного вывода программы, используя их.   -  person Raiv    schedule 11.01.2011
comment
@Raiv: Нет, он не возвращает дескрипторы на этот счет. Вы должны создать ручки самостоятельно.   -  person Billy ONeal    schedule 11.01.2011
comment
да, но где загрузить или включить нужный exe-файл в проект, на ресурс или куда?   -  person raptor    schedule 11.01.2011
comment
@Raptor: нет необходимости включать его в проект. Просто объедините его с исполняемым файлом компоновщика C++. Если вы хотите иметь возможность развертывания в виде одного файла, просто заархивируйте их в архив.   -  person Billy ONeal    schedule 11.01.2011
comment
да, спасибо, но что, если я хочу сделать портативное приложение, которое делает только один exe-файл, все будет работать нормально?   -  person raptor    schedule 11.01.2011
comment
Вы можете добавить файл в качестве ресурса и извлечь его при выполнении.   -  person Tommy Andersen    schedule 11.01.2011
comment
@Raptor: Я бы сделал это с помощью самораспаковывающегося архива. Если вы упаковываете его как ресурс (как предлагает @TommyA), то в какой-то момент вам придется извлечь его в файловую систему, что часто раздражает пользователей (т. Е. Откуда взялась эта программа). Самораспаковщик сбросит вашу программу и зависимости во временный каталог где-нибудь и автоматически очистит вас, когда вы закончите работу.   -  person Billy ONeal    schedule 11.01.2011
comment
да, но в таком случае у меня будет более одного exe-файла, что, конечно, не проблема, я не понял, как извлечь ресурс при выполнении. Например, предположим, что у меня есть приложение формы vcl с одной кнопкой, и я также включаю vb exe в ресурс (который, скажем, открывает блокнот), так какой код использовать для его самостоятельного извлечения? Какой код добавить в событие нажатия кнопки для выполнения vb exe?   -  person raptor    schedule 11.01.2011
comment
Используйте класс TResourceStream для доступа к сохраненным данным ресурсов, затем используйте класс TFileStream (через его метод CopyFrom()) для сохранения данных ресурсов в файл, а затем, наконец, используйте CreateProcess() для выполнения файла.   -  person Remy Lebeau    schedule 11.01.2011


Ответы (2)


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

Если вы хотите взять данный исполняемый файл и вызвать его так же, как сценарий оболочки, вам нужно будет запустить данную программу с ее стандартным вводом и стандартным выводом, перенаправленным в канал. Пример того, как это сделать, доступен в MSDN. Если вы хотите иметь возможность просто просмотреть классы и методы Visual Basic в целевом EXE-файле, как вы могли бы сделать с Visual Basic .NET, вам не повезло, поскольку произвольный исполняемый файл не понимает концепцию класса или метод.

person Billy ONeal    schedule 11.01.2011

Используйте диалоговое окно Project > Resources, чтобы добавить файл VB .exe в свой проект и присвоить ему идентификатор. Во время выполнения ваш код C++ может затем извлечь данные ресурсов для этого идентификатора во временный файл, например, с помощью TResourceStream и TFileStream, а затем использовать CreateProcess() для его запуска. Не забудьте удалить файл, когда закончите его использовать.

В противном случае вместо этого перепишите код VB в DLL, а затем приложение C++ может просто вызывать экспортированные функции DLL, когда это необходимо. Если вы хотите отправить один автономный .exe (что, как правило, не так, как используются библиотеки DLL), вам придется использовать тот же подход к ресурсам, просто используйте LoadLibrary() и GetProcAddress() вместо CreateProcess() для динамического доступа к функциям DLL. .

person Remy Lebeau    schedule 11.01.2011