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
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通过返回后备函数来使用延迟加载挂钩和句柄。
| 归档时间: |
|
| 查看次数: |
301 次 |
| 最近记录: |