#delphi #embed #embedded-resource #resource-file
#delphi #Внедрить #встроенный ресурс #ресурс-файл
Вопрос:
Файлы ресурсов (.RES) принимают любые двоичные файлы, но если это exe-файл, как я могу его запустить?
Комментарии:
1. Это делают многие вредоносные программы. По какой причине вы работаете таким образом, вместо того, чтобы использовать вежливый способ установки / удаления? Когда ваше программное обеспечение запускается на чужом компьютере, оно должно вести себя хорошо.
2. Интересное наблюдение… что случилось с OP?
3. Я бы использовал его для извлечения программы обновления приложений для обновления моего приложения с удаленного сервера, тогда новое приложение удалило бы его при следующем выполнении.
Ответ №1:
Вам пришлось бы извлечь его в виде файла на диск и выполнить.
Хотя вам не обязательно извлекать его на диск, как говорит Космин Прунд в комментарии, если вы этого не сделаете, это потребует много тяжелой работы.
Комментарии:
1. 1 По крайней мере, это, безусловно, самое простое и очевидное решение.
2. Однако следует помнить, что не следует извлекать файл в тот же каталог, что и текущее приложение, поскольку последнее, скорее всего, находится в папке Program Files, доступной только для чтения. Вместо этого следует использовать временный каталог текущего пользователя.
3. Вам не нужно извлекать его на диск. Просто для того, чтобы не извлекать его на диск, требуется много тяжелой работы и использование недокументированных функций Windows.
4. Следует помнить, что если вы извлекаете его во временный каталог пользователя, другой сеанс может совместно использовать тот же временный каталог (службы терминалов) — используйте уникальное имя.
Ответ №2:
Взгляните на этот модуль выполнения памяти.Это позволяет вам запускать exe-файл из памяти, не сбрасывая его на диск.
Комментарии:
1. Ссылка — просто отличное решение, и ее можно легко изменить для работы с ресурсами. Взгляните на
TResourceStream
( delphidabbler.com/articles?article=3 ) и вам нужно будет только изменитьFileToBytes
функцию (возможно, переименовать ее тоже, чтобы название подсказывало ее назначение, можетResourceToBytes
?).2. Могу ли я выполнить 32-разрядный exe-файл в памяти с помощью 64-разрядного приложения? Возможно ли это с помощью описанной выше процедуры?
3. Попробовал uExecFromMem и работает отлично ПОСЛЕ отключения предупреждения о вирусе «Virtool: Win32 /DelfInject.gen!BI» для скомпилированной версии этого кода. Боюсь, это невозможно использовать в настоящих программах, это печально 🙁
Ответ №3:
Да, это возможно. Где-то в Интернете есть библиотека Delphi для этого, но я ни за что на свете не могу вспомнить, как она называется. Это позволяет вам выполнить обычный exe-файл независимо от того, где он находится в памяти. Таким образом, вы можете загрузить его в поток или просто встроить в ресурс.
Я понимаю, что мой ответ немного удручает, поскольку я не помню название библиотеки, но, по крайней мере, теперь вы знаете, что это можно сделать. Если вы загуглите «выполнить PE exe из памяти» и «Delphi», то я уверен, что вы найдете это.
Ответ №4:
Возможно, вы захотите взглянуть на XBundler от Orean:http://www.oreans.com/xbundler.php
Я использую их лицензионный продукт (WinLicense) и был очень доволен этим продуктом, их поддержкой, оперативностью реагирования и обновлениями.
На самом деле, я собираюсь купить XBundler, чтобы я мог отправлять dll, надежно встроенную в мой exe.
Том
Комментарии:
1. Всякий раз, когда я публикую ссылку на коммерческий продукт, который я использую и который имеет непосредственное отношение к OP, я получаю отказ без объяснения причин. Возможно, у некоторых читателей SO аллергия на коммерческое программное обеспечение? (Если бы я был королем SO, я бы запретил downvotes без объяснения причин… но это тема для другого дня …)
2. Я определенно согласен с мнением о -1 голосе без объяснения причин; ваш пост (и другие посты) на самом деле не похожи на работу наших обычных спам-исполнителей 🙂 но в этом конкретном посте определенно могли бы использоваться некоторые примеры копирования и вставки о том, как вызвать exe после сборки, или какое-либо другое указание на то, что вы успешно использовали их продукт именно по этой причине. (Или, возможно, какая-то причина, по которой это достаточно сложная проблема, чтобы оправдать коммерческую программу.) Я просто говорю, что планка для ссылок на коммерческое программное обеспечение намного выше, чем в большинстве других сообщений…
3. 1 Хорошее предложение, сарнольд. Я об этом не подумал. Я включу примеры такого рода в будущие публикации. Спасибо.