gpt4 book ai didi

delphi - 可以在Delphi应用程序中优雅地处理丢失的dll文件吗?

转载 作者:行者123 更新时间:2023-12-03 14:56:38 25 4
gpt4 key购买 nike

有人知道是否可以在 Delphi 应用程序中优雅地测试和处理丢失的 .dll 文件吗?例如,我的代码有这样的函数声明:

function KFUNC(Arg1, Arg2, Arg3, Arg4: DWord): longint stdcall; external 'KL2DLL32.DLL' name '_KFUNC@16';

...这当然需要在系统上找到 dll 文件 KL2DLL32.DLL,否则我的应用程序将无法启动。我想知道是否有一些不同的方法来编码这个,所以我的应用程序可以测试 dll 文件的存在,然后进行相应的处理。显然,目标是即使 dll 文件不存在,我的应用程序仍然正常启动。谢谢。

最佳答案

您的导入会导致函数使用所谓的加载时或隐式链接进行链接。也就是说,可执行文件包含元数据,告诉操作系统加载器加载 DLL,然后绑定(bind)到您命名的函数。如果此加载时链接过程失败,则无法加载可执行文件。

您有几个选项可以避免加载时链接,从而使您的程序能够灵活应对链接失败。

延迟加载 DLL

添加delayed指向您的函数导入的指令。文档说:

To postpone the loading of the library that contains the function to the moment the function is actually needed, append the delayed directive to the imported function:

function ExternalMethod(const SomeString: PChar): Integer; stdcall; 
external 'cstyle.dll' delayed;

delayed ensures that the library that contains the imported function is not loaded at application startup, but rather when the first call to the function is made.

该文档包含其他更详细的有用主题,并涵盖如何处理错误:

显式加载并绑定(bind)到 DLL

delayed 指令只是一种让编译器安排显式加载 DLL 的简洁方法。您可以使用LoadLibrary手动执行相同的操作和GetProcAddress .

  1. 调用LoadLibrary加载DLL。提供 DLL 的完整路径,或仅提供其名称。在后一种情况下,您依靠 DLL 搜索顺序来定位 DLL。对 LoadLibrary 的调用会生成一个模块句柄。
  2. 调用GetProcAddress来获取命名函数指针的地址。您必须提供第 1 步中的模块句柄。
  3. 调用第 2 步返回的函数指针。
  4. 当不再需要调用该函数时,使用FreeLibrary卸载DLL。

在每一步中,您都必须检查函数返回值,以防出现错误。 MSDN 文档中记录了每个 Win32 API 函数如何处理错误(如上面的链接)。例如,如果找不到 DLL,则 LoadLibrary 返回 0。您必须检测到这一点并相应地处理后果。

讨论

尽管delayed指令非常方便,但我个人从未使用过它。根据我的经验,每当我需要显式链接时,我总是发现我需要一些额外的灵 active ,而延迟是无法提供的。也许我的需求很特殊,但如果您发现自己倾向于显式调用 LoadLibraryGetProcAddress,请不要感到惊讶。

举个例子,就在今天我发现自己使用 LoadLibraryEx因为我想传递 LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR 标志。当您使用延迟时,这种细粒度的控制不可用。

关于delphi - 可以在Delphi应用程序中优雅地处理丢失的dll文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32827728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com