Delphi-从我的应用程序中提取嵌入式dll,并在应用程序结束时将其删除

Delphi-从我的应用程序中提取嵌入式dll,并在应用程序结束时将其删除,delphi,dll,delphi-7,Delphi,Dll,Delphi 7,我已经在我的应用程序中嵌入了我的dll文件。我需要在应用程序启动时将其解压缩到应用程序的文件夹中,并在关闭应用程序时将其删除。我应该使用什么代码 从资源中提取文件,如下所示: var Stream: TResourceStream; .... Stream := TResourceStream.Create(HInstance, ResourceName, RT_RCDATA); try Stream.SaveToFile(DllFileName); finally Stream.F

我已经在我的应用程序中嵌入了我的dll文件。我需要在应用程序启动时将其解压缩到应用程序的文件夹中,并在关闭应用程序时将其删除。我应该使用什么代码

从资源中提取文件,如下所示:

var
  Stream: TResourceStream;
....
Stream := TResourceStream.Create(HInstance, ResourceName, RT_RCDATA);
try
  Stream.SaveToFile(DllFileName);
finally
  Stream.Free;
end;
var 
  lib: HMODULE;
....
lib := LoadLibrary(DllFileName);
Win32Check(lib<>0);
按如下方式加载DLL:

var
  Stream: TResourceStream;
....
Stream := TResourceStream.Create(HInstance, ResourceName, RT_RCDATA);
try
  Stream.SaveToFile(DllFileName);
finally
  Stream.Free;
end;
var 
  lib: HMODULE;
....
lib := LoadLibrary(DllFileName);
Win32Check(lib<>0);

请注意,这确实意味着您必须使用显式运行时链接(
LoadLibrary
GetProcAddress
)而不是隐式加载时间链接(
external
)。如果只有一个可执行文件,就没有办法解决这个问题。这是因为提取DLL的代码必须在操作系统加载程序解决所有加载时间依赖关系后运行。

您可以使用delphi而不是c++创建一个文件,该文件带有
file\u FLAG\u DELETE\u ON\u CLOSE
im,但您的应用程序正在windows操作系统上运行,您可以访问windows api,请参阅@SirRufo文件的最后一个句柄关闭后,该文件将立即被删除。但是您将无法使该文件保持足够长的活动时间以调用
LoadLibrary
。如果文件有任何打开的句柄,则加载库将失败。因此,您必须关闭所有打开的句柄才能使所有
LoadLibrary
成功,但随后该文件将被删除。首先调用
LoadLibrary()
如何,然后调用
CreateFile()
SetFileInformationByHandle()如何
要在关闭时应用
文件\u标志\u删除\u
吗?如果您也使用
外部
,则操作系统不会在应用程序启动时尝试自动加载DLL。第一次调用DLL时,RTL将加载DLL。这给了你时间来提取它。哦,等等,OP使用的是Delphi7,所以
delayed
不是一个选项。它是在Delphi 2010中引入的。除了这个@remy,很难找到其他答案