[英]Can I catch an exception relating to a .DLL file not been found
我有一个包含.LIB和.DLL文件的第三方组件。 为了使用组件,我将.LIB链接到我的C ++程序中,并使用应用程序分发.DLL。 提供的功能非常具体,只与我的用户的一小部分相关,但分发.DLL会产生许可费。
这里的一个工作是有两个版本的我的应用程序,一个链接在第三方组件,另一个没有,但我宁愿避免维护和分发第二个构建所涉及的额外时间。
理想情况下,我想简单地从发行版中排除.DLL,但如果我这样做,我会收到错误'此应用程序无法启动,因为找不到XXXXX.DLL。 重新安装应用程序可能会解决此问题 。 这是我可以在我的代码中捕获和处理的异常吗? 或者,我是否可以延迟加载.DLL,直到尝试调用所提供的特定功能,然后处理它,或者只是检查.DLL是否存在并采取相应的行动?
环境是VS 2003和VS 2008。
Visual Studio支持延迟加载的DLL 。 使用此功能时,首次从该库调用函数时会加载DLL。 但是,您应该检查组件的许可证,看看是否允许这样做。
与dll链接后无法停止绑定。 您拥有的唯一方法是在运行时动态加载dll。
在exe开始运行之前完成DLL解析。 代码可能看起来像那样。 如果这对你的第三方dll不起作用,你可以编写一个自己的dll来包装第三方dll,并且可以在运行时动态加载。
HINSTANCE lib = LoadLibraryEx("C:\dlls\thirdparty.dll", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
if(0 != lib) {
// Dll is present so use it
typedef CObj ( __cdecl *tFunction ) (const wchar_t*, const int&);
tFunction functionEntry = (tFunction)(GetProcAddress( lib,"EntryFunction"));
assert(0 != functionEntry);
// call the function
CObj obj = functionEntry(L"Hello", 1);
}
else {
// dll not present
}
更新:请确保您使用完整路径到您的DLL,以确保没有任何具有此名称的dll被拉出。
您可以使用LoadLibrary() API函数动态加载DLL但是您必须对应用程序需要调用的DLL导出的每个函数使用GetProcAddress() 。
您可以使用LoadLibrary
函数显式加载DLL并检查结果。 如果成功,则使用GetProcAddress
查找CreateMyInterfaceImpl
函数。 否则使用您的界面的假实现或根本不使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.