3

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

这里的一种解决方法是拥有我的应用程序的两个版本,一个链接到第 3 方组件,另一个不链接,但我宁愿避免维护和分发第二个构建所涉及的额外时间。

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

环境是VS 2003和VS 2008。

4

4 回答 4

6

与dll链接后无法停止绑定。您拥有的唯一方法是在运行时动态加载 dll。

dll 解析在您的 exe 开始运行之前完成。代码可能看起来像那样。如果这对您的第三方 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。

于 2010-03-03T08:12:54.297 回答
5

Visual Studio 支持延迟加载的 DLL。使用此功能,当您第一次调用该库中的函数时,将加载一个 DLL。但是您应该检查组件的许可证,看看是否允许这样做。

于 2010-03-03T08:04:06.953 回答
3

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

于 2010-03-03T08:03:08.707 回答
3

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

于 2010-03-03T08:03:19.060 回答