缺少 dll 功能检测

Posted

技术标签:

【中文标题】缺少 dll 功能检测【英文标题】:Missing dll function detection 【发布时间】:2014-10-10 18:35:38 【问题描述】:

我想问是否有某种方法可以在应用程序运行时检测包含在我的应用程序中的 DLL 中缺少的函数。我知道使用 HMODULE 手动导入函数并在调用此函数时检查它的可能性,但我不想以这种方式解决每个函数调用。想法是用一些 try-catch 块或类似的东西来覆盖函数调用,这不会导致应用程序崩溃。有什么解决办法吗?谢谢。

【问题讨论】:

这通常很容易诊断,您的程序不会启动。因此,没有必要在 运行时进行测试,您 正在运行 的事实足以证明您没有问题 :) 我忘了写我正在使用延迟加载只是由于未启动的原因,所以我的程序启动了一个 if 函数被调用,而不是崩溃。 在没有 /delayload 的情况下不先测试你的程序有什么意义吗???如何捕获运行时错误在 MSDN 中有详细记录。 是的,这是需要延迟负载使用的学校项目。任务是:如何在应用程序运行时检测该函数是否包含在 dll 中。 【参考方案1】:

根据 MSDN (https://msdn.microsoft.com/en-us/library/1c9e046h.aspx),在带有 MSVC 编译器的 C/C++ 中,您可以执行以下操作:

#include <windows.h>
#define FACILITY_VISUALCPP  ((LONG)0x6d)
#define VcppException(sev,err)  ((sev) | (FACILITY_VISUALCPP<<16) | err)
const DWORD LIB_NOT_FOUND = VcppException(ERROR_SEVERITY_ERROR, ERROR_MOD_NOT_FOUND);
const DWORD FUNC_NOT_FOUND = VcppException(ERROR_SEVERITY_ERROR, ERROR_PROC_NOT_FOUND);

__try

    MyDLLFunction();

__except(GetExceptionCode() == LIB_NOT_FOUND || GetExceptionCode() == FUNC_NOT_FOUND
         ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)

    printf("library or function not found\n");

【讨论】:

【参考方案2】:

您可以尝试调用该函数,如果该函数不存在,它将生成一个 EntryPointNotFoundException。例如(VB.NET):

Dim MissingFunction as Boolean = False
Try
    TheFunction()
Catch ex As System.EntryPointNotFoundException
    MissingFunction = True
End Try

【讨论】:

以上是关于缺少 dll 功能检测的主要内容,如果未能解决你的问题,请参考以下文章

程序无法启动,因为缺少 cygwin1.dll...在 Eclipse CDT 中

Winform部署时dll缺少依赖项问题总结

电脑缺少msvcp140,dll解决办法

Google Cloud Vision API 的 Web 检测功能中缺少描述?

您的计算机错误中缺少 DLL

缺少libpng12.dll怎么办