c++隐式链接如何校验dll

在exe文件中使用了隐式链接,调用了外部dll文件中的 a 函数,但是假如外部的dll文件是老版的dll,当中没有 a 函数,如何在exe文件中捕捉这个异常,并抛出异常,我尝试用了try catch,但是隐式链接时,exe在调用dll文件中不存在的函数的时候就会报出 无法定位程序输入点balabla,然后系统自动中止程序,抛出不了异常,这个问题应该如何解决呢?或者说在exe文件中如何校验隐式链接的dll文件。


FARPROC pFunc = GetProcAddress(hDll, "MyFunction");  
    if (pFunc == NULL) {  
        //报错、释放dll。
        return;
    }  

使用之前校验DLL中的函数是否存在。
如果解决您的问题,请点赞采纳,谢谢。

简而言之就是,如何在程序运行时检测静态加载的dll中有没有某个函数?

【以下回答由 GPT 生成】

在C++中可以使用GetProcAddress函数来校验隐式链接的DLL文件中是否存在所需的函数。下面是解决该问题的步骤和代码示例:

  1. 使用LoadLibrary函数加载要使用的DLL文件。如果DLL文件不存在,LoadLibrary函数将返回NULL
HMODULE dllHandle = LoadLibrary("path_to_your_dll.dll");
if (dllHandle == NULL) {
    // DLL文件不存在,处理错误
    // 抛出异常或者输出错误信息
}
  1. 使用GetProcAddress函数获取所需函数的地址。如果函数不存在,GetProcAddress函数将返回NULL
FARPROC function = GetProcAddress(dllHandle, "function_name");
if (function == NULL) {
    // 函数不存在,处理错误
    // 抛出异常或者输出错误信息
}
  1. 验证函数地址是否为NULL,如果是则表示函数不存在。
if (function == NULL) {
    // 函数不存在,处理错误
    // 抛出异常或者输出错误信息
}

完整的示例代码如下:

#include <Windows.h>

int main() {
    HMODULE dllHandle = LoadLibrary("path_to_your_dll.dll");
    if (dllHandle == NULL) {
        // DLL文件不存在,处理错误
        // 抛出异常或者输出错误信息
        return 1;
    }

    FARPROC function = GetProcAddress(dllHandle, "function_name");
    if (function == NULL) {
        // 函数不存在,处理错误
        // 抛出异常或者输出错误信息
        return 1;
    }

    // DLL文件和函数均存在,可以继续调用函数
    // ...

    return 0;
}

注意事项: - 在使用GetProcAddress函数之前,需要先加载DLL文件,否则将无法找到对应的函数。 - 请替换示例代码中的"path_to_your_dll.dll""function_name"为实际的DLL文件路径和函数名。 - 校验函数是否存在并不能保证函数的正确性,仅用于判断函数是否存在。一些错误可能只有在实际调用函数时才会暴露出来。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^