C :即使缺少第三方DLL,也允许程序运行
C++: allow program to run even if 3rd party DLL is missing?
我有一个C 应用程序,该应用程序与某些第三方动态库链接。我的某些主要类从这些库中继承,并向这些库进行函数调用。我的应用程序在理论上不包含这些库的情况下工作(即,如果我手动删除与这些库有关的所有代码和参考文献,它将仍然有效),这只是功能上的限制。如果我能够制作一个类比,请想象我已经创建了一个Windows Notepad克隆,并包括一个允许用户在文档中嵌入图片和视频的第三方库。
当我分发我的应用程序时,我的客户可能没有安装这些库。有没有办法让我的程序检测是否存在所需的DLL库,如果未安装所有相关代码,则可以忽略所有相关代码?
当前,如果我在未安装第三方库的情况下运行我的应用程序,则会显示与丢失的DLL和崩溃有关的错误。一个明显的解决方案是简单地发布我的应用程序的两个版本...一个没有外部依赖关系,但我想避免独立管理两个产品。
有这样的选项"延迟加载dll"
- 对于dll xxx.dll,您将链接器配置为使用" delayload"
- 直到您从DLL调用任何功能,它将不会加载,即使不存在DLL,您的应用程序也将成功启动
- 您使用loadLibrary检查xxx.dll是否可用。
- 如果负载失败 - 您使用xxx.dll禁用模块
- 如果LoadLibrary成功了 - 您将其卸载(您不需要动态加载 - 仅用于测试DLL的存在)并将库使用库(就像定期链接一样 - 无需使用任何XXX修改代码。DLL相关功能
在此处查看此答案:动态加载DLL
的函数您基本上使用LoadLibrary加载DLL,结果将为是否已加载。
然后,您使用getProcaddress获取功能。
如果要分发应用程序的二进制文件,则可以使用动态加载(在此处查看)
但是,如果您可以选择在客户端系统上构建应用程序,则可以使用cmake并设置编译标志,如果找不到所需的库。然后,您的代码可以按照此标志的值行为(即,这样的方式,您就有有关该库存在的天气信息是否存在于您的代码中)
加载动态lib或注入过程,或者...可以使用此后使用:
: if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
inj_hModule = hModule;
DisableThreadLibraryCalls(hModule); // Disable DllMain calls for DLL_THREAD_*
HANDLE hThreadProc = CreateThread(nullptr, NULL, LPTHREAD_START_ROUTINE(ThreadProc), hModule, NULL, nullptr);
CloseHandle(hThreadProc);
Beep(2000, 500);
}
if (ul_reason_for_call == DLL_PROCESS_DETACH)
{
Beep(2000, 500);
FreeLibraryAndExitThread(hModule, 0);
// exit this thread
ExitThread(0);
}
好吧,您应该修改软件体系结构,并遵循Martin Fowler介绍的插件设计模式。
尽管它非常相似,但您不希望这种情况的动态链接。
涉及C 中的实现,这基本上意味着您引入抽象接口首先
struct Foo {
virtual void Bar() = 0;
virtual ~Foo() {}
};
和查找合适的实现,并在运行时与共享库一起 1 。
共享库实现的导出接口需要匹配您的抽象接口声明。
您可以使用工厂进行查找,加载共享库并创建实现的实例。
这是一些更多信息,其中OS功能在动态加载和绑定插件中涉及。
1)请注意,如果您正在积极加载它们,则共享库不需要具有扩展名.dll
或.so
。
我的建议是仔细划分取决于该dll的代码。在项目的那部分中设计一个干净的接口,可以轻松地加载(负载Library),并且在程序的主要部分中与您与您互动的任何类中的任何类都具有纯虚拟接口(无DLL导出)。理想情况下,它具有纯函数接口,因为它们是最稳定的。
现在, dll可以取决于第三方dll。您的主代码通过手动加载并优雅地处理负载故障来调用您的"包装" DLL。
这比使用未为此设计的DLL更容易,您可以在不安装/卸载第三方DLL的情况下进行实验。
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 提高驱动程序程序的时间效率
- 有没有办法测量应用程序/程序占用多少系统资源(例如 RAM)
- 程序c++程序的文件结构
- 用于创建菜单栏的c++ win32程序(程序编译并运行,也显示窗口但不显示菜单栏)
- 用于应用程序/程序设置的visual C++类