Итак, вопрос в том, как добавить в C++ Builder 2010 какой-то внешний файл .exe? Допустим, я сделал какую-то программу в Visual Basic и имею исполняемый файл, поэтому мне не нужно делать тот же код на С++. Я хочу просто включить этот исполняемый файл в свой проект? Можно ли сделать переносимое приложение одним исполняемым файлом, внутри которого находится другой исполняемый файл (возможно, в пути к ресурсам)? Как это вызвать в коде, если это один exe в другом? Я знаю, как вызвать его системной функцией или другим способом, указав направление на исполняемый файл, но как это сделать, если он находится по тому же адресу, что и основной исполняемый файл?
Как добавить внешний исполняемый файл в проект Borland C++ Builder 2010?
Ответы (2)
Я не совсем понимаю, чего вы пытаетесь добиться. Если вы хотите использовать функциональные возможности данной программы, вам необходимо знать некоторые сведения о том, как эта программа работает.
Если вы хотите взять данный исполняемый файл и вызвать его так же, как сценарий оболочки, вам нужно будет запустить данную программу с ее стандартным вводом и стандартным выводом, перенаправленным в канал. Пример того, как это сделать, доступен в MSDN. Если вы хотите иметь возможность просто просмотреть классы и методы Visual Basic в целевом EXE-файле, как вы могли бы сделать с Visual Basic .NET, вам не повезло, поскольку произвольный исполняемый файл не понимает концепцию класса или метод.
Используйте диалоговое окно Project > Resources
, чтобы добавить файл VB .exe в свой проект и присвоить ему идентификатор. Во время выполнения ваш код C++ может затем извлечь данные ресурсов для этого идентификатора во временный файл, например, с помощью TResourceStream
и TFileStream
, а затем использовать CreateProcess()
для его запуска. Не забудьте удалить файл, когда закончите его использовать.
В противном случае вместо этого перепишите код VB в DLL, а затем приложение C++ может просто вызывать экспортированные функции DLL, когда это необходимо. Если вы хотите отправить один автономный .exe (что, как правило, не так, как используются библиотеки DLL), вам придется использовать тот же подход к ресурсам, просто используйте LoadLibrary()
и GetProcAddress()
вместо CreateProcess()
для динамического доступа к функциям DLL. .
TResourceStream
для доступа к сохраненным данным ресурсов, затем используйте классTFileStream
(через его методCopyFrom()
) для сохранения данных ресурсов в файл, а затем, наконец, используйтеCreateProcess()
для выполнения файла. - person Remy Lebeau   schedule 11.01.2011