3

是否可以模仿该loadlibrary功能?我想从 BLOB 字段加载一个库而不先将其写入临时文件,并且我需要一个不依赖于特定版本的 delphi 编译器或 windows 的解决方案,并且不会触发防病毒软件。

4

3 回答 3

7

是的,您可以,并且您不需要loadlibrary从内存中执行代码 - 您需要使用设置了PAGE_EXECUTE标志的VirtualAlloc函数来分配内存


更新:这里是从内存中为 32 位 Delphi 执行的代码的快速而肮脏的演示 - 我只测试了它的工作原理:

type
  TIncMe = procedure(var I: Integer);

var
  IncMeProc: TIncMe;

procedure IncMe(var I: Integer);
begin
  Inc(I);
end;

procedure CopyIncMe;
var
  Size: LongWord;
  Tmp: Pointer;

begin
  Size:= LongWord(@CopyIncMe) - LongWord(@IncMe);
  Tmp:= VirtualAlloc(nil, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  Move(Pointer(@IncMe)^, Tmp^, Size);
  IncMeProc:= Tmp;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  J: Integer;

begin
  J:= 0;
  CopyIncMe;
  while J < 10 do begin
    IncMeProc(J);
    ShowMessage(IntToStr(J));
  end;
  VirtualFree(@IncMeProc, 0, MEM_RELEASE);
end;
于 2012-08-29T06:21:21.847 回答
5

dzlib 包含一个现成的对象,用于将 dll 从资源读取到内存并使用它,而无需将其保存到磁盘:

这是主文件...

http://sourceforge.net/p/dzlib/code/147/tree/dzlib/trunk/src/u_dzResourceDllLoader.pas

..但它需要来自同一存储库的其他文件。

于 2012-08-29T15:26:54.380 回答
4

delphi.about.com上有一篇文章,展示了如何从资源中加载 dll。

它首先将资源加载到内存中,然后使用Memory Module从资源中加载 dll

您可以使用数据库或要从中加载 dll 的任何源来代替资源。一旦它在内存流中,您可以使用以下代码加载和执行 dll 函数,这看起来非常像调用 dll 的“普通”代码:

var
  btMM: PBTMemoryModule;
begin
  btMM := BTMemoryLoadLibary(mp_DllData, m_DllDataSize);
  try
    if btMM = nil then Abort;
    @m_TestCallstd := BTMemoryGetProcAddress(btMM, 'TestCallstd');
    if @m_TestCallstd = nil then Abort;
    m_TestCallstd('This is a Dll Memory call!');
  except
    Showmessage('An error occoured while loading the dll: ' + BTMemoryGetLastError);
  end;
  if Assigned(btMM) then BTMemoryFreeLibrary(btMM);
end;
于 2012-08-29T08:25:38.447 回答