2017-01-25 7 views
2

Я положил файл DLL в файл ресурсов (* .res)Загрузка DLL из ресурса непосредственно из памяти в Delphi 7

ProjectTestLibrary.dll

library ProjectTestLibrary; 

uses SysUtils, Classes, Dialogs; 

{$R *.res} 

procedure DllMessage; export; 
begin 
    ShowMessage('Hello world from a Delphi DLL'); 
end; 

exports DllMessage; 

begin 
end. 

MyTestDLL.rc

TestDLL RCDATA ProjectTestLibrary.dll 

Produce MyTestDLL.res по этой командной строке

BRCC32 ProjectTestLibrary.rc 

В основной форме

implementation 
{$R *.dfm} 
{$R MyTestDLL.RES} 

procedure DllMessage; stdcall; external 'ProjectTestLibrary.dll'; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    DllMessage; 
end; 

Тогда ошибка выходит
Это приложение не удалось запустить из-за ProjectTestLibrary.dll не был найден.

Я понимаю, что проблема в том, что файл dll еще не существует.
Так что я удаляю 'DLLMessage;' код в onButton1Click.
Тогда onFormCreate, я добавил:

procedure TForm1.FormCreate(Sender: TObject); 
var ms : TMemoryStream; 
    rs : TResourceStream; 
begin 
    if 0 <> FindResource(hInstance, 'TestDLL', RT_RCDATA) then 
    begin 
    rs := TResourceStream.Create(hInstance, 'TestDLL', RT_RCDATA); 
    ms := TMemoryStream.Create; 
    ShowMessage('Found'); 
    end else 
    begin 
    ShowMessage('Not Found'); 
    end; 
end; 

я запустить его снова, то всплывающее сообщение сказал: «Найдено»

Мой вопрос тогда:
1. Как сохранить его в памяти (не в ПК жесткий диск), и, наконец,
2. использовать свои процедуры/функции (процедура DLLMessage)

+1

Это не поддерживается операционной системой. Для этого требуется что-то вроде BTMemoryModule, которое может выйти из строя при будущих выпусках Windows. Он опирается на детали реализации. Антивирусное ПО, скорее всего, будет считать эту деятельность сомнительной. Всегда лучше отправлять DLL вместе с exe. –

ответ

0

там нет никакого официального способа сделать это, хотя существуют методы, которые имитируют загрузчик Windows PE, и позволяют загружать DLL непосредственно из память b uffer, без необходимости хранить его на диске.

Вот реализация Delphi, например, грузчик DLL памяти: https://github.com/DSPlayer/memorymodule

Смежные вопросы