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

时间:2010-03-03 07:56:06

标签: c++ dll dynamic-linking

我有一个包含.LIB和.DLL文件的第三方组件。为了使用组件,我将.LIB链接到我的C ++程序中,并使用应用程序分发.DLL。提供的功能非常具体,只与我的用户的一小部分相关,但分发.DLL会产生许可费。

这里的一个工作是拥有我的应用程序的两个版本,一个链接在第三方组件中,另一个没有,但我宁愿避免维护和分发第二个构建所需的额外时间。

理想情况下,我想简单地从发行版中排除.DLL,但如果我这样做,我会收到错误'此应用程序无法启动,因为找不到XXXXX.DLL。重新安装应用程序可能会解决此问题'。这是我可以在我的代码中捕获和处理的异常吗?或者,我是否可以延迟加载.DLL,直到尝试调用所提供的特定功能,然后处理它,或者只是检查.DLL是否存在并采取相应的行动?

环境是VS 2003和VS 2008。

4 个答案:

答案 0 :(得分:5)

Visual Studio支持delay-loaded DLLs。使用此功能时,首次从该库调用函数时会加载DLL。但是,您应该检查组件的许可证,看看是否允许这样做。

答案 1 :(得分:5)

与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被拉出。

答案 2 :(得分:3)

您可以使用 LoadLibrary() API函数动态加载DLL 但是,您必须对应用程序需要调用的DLL导出的每个函数使用 GetProcAddress()

答案 3 :(得分:3)

您可以使用LoadLibrary函数显式加载DLL并检查结果。如果成功,请使用GetProcAddress查找您的CreateMyInterfaceImpl功能。否则使用您的界面的假实现或根本不使用它。