Загрузить DLL из блока памяти - как использовать? - PullRequest
3 голосов
/ 30 марта 2012

Я нашел модуль с функциями, позволяющими загружать DLL напрямую из памяти, но я не знаю, как я могу его использовать ..

Это единица измерения: http://www.delphibasics.info/home/delphibasicssnippets/udllfrommem-loadadllfrommemory

Я знаю, что функция:

function memLoadLibrary(FileBase : Pointer) : Pointer;

Но я не знаю, как мне его использовать, что такое FileBase, который мне нужно определить, и т. Д.

Кто-нибудь может мне помочь?

Ответы [ 2 ]

4 голосов
/ 30 марта 2012

Вам просто нужно поместить DLL в память и передать memLoadLibrary указатель на местоположение DLL в памяти.

Например, из ресурса:

hRes := LoadResource(HInstance, 'MYRESNAME');
if hres=0 then
  RaiseLastOSError;
BaseAddress := LockResource(hRes);
if BaseAddress=nil then
  RaiseLastOSError;
lib := memLoadLibrary(BaseAddress);
.....
2 голосов
/ 30 марта 2012

Допустим, у вас есть и процедура, и функция в вашей DLL, которую вы хотите загрузить из памяти, чтобы использовать их:

    ** GLOBAL ** (both, exe -> dll)
    type
      TTest1Proc = record
        Proc: procedure; StdCall;
        hLib: THandle;
      end;

      TTest2Func = record
        Func: function: Boolean; StdCall;
        hLib: THandle;
      end;

    ** DLL **

    procedure Test1; StdCall;
    begin
      ShowMessage('Test proc');
    end;

    function Test2: Boolean; StdCall;
    begin
      Result := True;
    end;

    exports
      Test1.
      Test2;

Вот как вы можете загрузить dll и использовать оба метода (процедуру и функцию) вВаш .EXE проект:

    procedure Test1;
    var
      Test1Proc: TTest1Proc;
    begin
      with Test1Proc do
      begin
        hLib := LoadLibrary(PChar('DLL_PATH.dll'));
        if hLib <> 0 then
        begin
          @Proc := GetProcAddress(hLib, 'Test1');
          if Assigned(Proc) then
          try
            Proc; //will execute dll procedure Test1
          finally
            FreeLibrary(hLib);
          end
          else
          ShowMessage('Procedure not found on DLL');
        end
        else
        ShowMessage('DLL not found.');
      end;
    end;

И как функция:

    function Test2: Boolean;
    var
      Test2Func: TTest2Func;
    begin
      Result := False;
      with Test2Func do
      begin
        hLib := LoadLibrary(PChar('DLL_PATH.dll'));
        if hLib <> 0 then
        begin
          @Func := GetProcAddress(hLib, 'Test2');
          if Assigned(Func) then
          try
            Result := Func; //will execute the function Test2
          finally
            FreeLibrary(hLib);
          end
          else
          ShowMessage('Function not found on DLL.');
        end
        else
        ShowMessage('DLL not found.');
      end;
    end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...