我能捕获与未找到.DLL文件有关的异常吗?

3
我有一个第三方组件,其中包括.LIB和.DLL文件。为了使用该组件,我将.LIB链接到我的C ++程序中,并将.DLL与应用程序一起分发。提供的功能非常特定,只与我的用户的小子集相关,但分发.DLL会产生许可证费用。
这里的一个解决方法是拥有两个版本的应用程序,一个链接第三方组件,另一个不链接,但我宁愿避免维护和分发第二个版本所需的额外时间。
理想情况下,我想简单地从分发中排除.DLL,但如果我这样做,就会出现错误“'This application has failed to start because XXXXX.DLL was not found. Re-Installing the application may fix this problem'”。 这是我能在我的代码中捕获和处理的异常吗?或者,我是否可以延迟加载.DLL,直到尝试调用提供的特定功能,然后在那时处理它,或者仅检查.DLL的存在并相应地处理?
环境是VS 2003和VS 2008。
4个回答

6

链接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。

1
请注意,相对路径("thirdparty.dll")与LOAD_WITH_ALTERED_SEARCH_PATH标志的组合会导致未定义的行为。(来源:MSDN) - Sofahamster

5
Visual Studio支持延迟加载DLL。使用此功能,当您第一次调用来自该库的函数时,会加载DLL。但是,您应该检查组件的许可证以确定是否允许这样做。

1
该dll必须支持延迟加载。据我所知,一些组件(例如xerces)必须进行修改才能正确地与延迟加载配合使用。 - Totonga
@Totonga:我不认为这是真的。http://msdn.microsoft.com/zh-cn/library/hf3f62bz.aspx - Pedro d'Aquino
@Totonga 这取决于 dll http://msdn.microsoft.com/en-us/library/yx1x886y 。大多数的 dll 应该可以在不修改的情况下正常工作。 - KindDragon

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

3

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接