如何检测已安装的库中是否实现了功能?

ott*_*ger 0 c++ windows dll linker

我有一个 Windows 程序,它使用 Windows 系统库(让我们命名它"sysLib"),并且它实现了 function "libFun1"。我的程序可以是这样的:

#include <sysLib.h>

void myFunction() {
    //some magic here
}

int main() {
    myFunction();
    libFun1();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

后来,库得到更新,其中"libFun2"添加了新功能,它完美地完成了我"myFunction"所做的事情,甚至做得更好。所以我更新我的程序,如下所示:

#include <sysLib.h>

int main() {
    libFun2();
    libFun1();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我编译它并将更新推送给客户端。

但是有一些客户没有最新版本的Windows,并且他们的旧版本"sysLib"没有实现"libFun2",因此他们的程序无法工作(甚至无法启动)。

我发现,如果我用 编译我的程序"delayimp.lib /DELAYLOAD:sysLib.dll",程序现在可以启动,但在"libFun2"调用时会崩溃。

我现在想更新我的代码以查找如下内容:

#include <sysLib.h>

void myFunction() {
    //some magic here
}

int main() {
    if(/*libFun2 exists*/) {
         libFun2();
    } else {
         myFunction();
    }
    libFun1();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我如何检测"libFun2"函数是否存在于库中并围绕它制定逻辑?

我知道在linux下是可以的if(libFun2),但是在windows下不行

更新:

我发现,它可以通过 __try __ except 组合来捕获,但它对我不起作用......

https://learn.microsoft.com/en-us/cpp/build/reference/error-handling-and-notification?view=msvc-170

And*_*ers 5

bool hasExport(LPCSTR mod, LPCSTR func)
{
  HMODULE handle = LoadLibraryA(mod);
  return handle && GetProcAddress(handle, func);
}

...

if (hasExport("syslib", "libfun2"))
  libfun2(); // must be delay loaded
else
  ...
Run Code Online (Sandbox Code Playgroud)

此代码假设您不需要再次卸载该库。它也不关心库是否已经加载。如果您需要不同的行为,请使用GetModuleHandle或。FreeLibrary

在这种特定情况下,由于您有一个替换函数,您可以dliFailGetProc通过返回后备函数来使用延迟加载挂钩和句柄。