繁体   English   中英

我是否可以捕获与未找到.DLL文件相关的异常

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM