我如何直接从内存中执行代码在Delphi中?

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

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

这是主要文件…

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

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

是的你可以,而且你不需要loadlibrary来执行内存中的代码 – 你需要使用VirtualAlloc函数分配一个内存并设置PAGE_EXECUTE标志


更新:这里是一个从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; 

有一篇关于delphi.about.com的文章,展示了如何从一个资源加载一个dll。

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

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

 var btMM: PBTMemorymodulee; 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;