1

在我的 Windows C++ 程序中,我对 DLL 有一些依赖(附带输入设备的驱动程序)。我自己实际上并没有加载 DLL,但驱动程序提供了我静态链接的(小).lib 库(我假设是那些确保 DLL 存在于系统中并加载它们的库)。我正在编写一个可以从一系列摄像机中获取输入的应用程序。在运行时,用户选择使用哪一个。目前我的问题是,我查询是否连接了摄像头的例程已经需要系统上存在摄像头的功能。即假设有相机型号 A 和 B,用户必须安装 A 和 B 的驱动程序,即使他知道他只是拥有型号 B。用户必须这样做,否则我的程序将不会

我想知道在运行时是否有可能确定哪些 DLL 存在,对于那些不存在的,以某种方式禁用加载,甚至静态(因此,动态)组件。

所以基本上我的问题是你不能做if(DLL was found){ #include "source that includes header using functions defined in lib which loads DLL"}

4

2 回答 2

2

我认为使用DELAYLOAD链接器标志可以提供所需的功能。它将允许与.lib文件链接,但仅在使用 DLL 时才尝试加载:

link.exe ... /DELAYLOAD:cameraA.dll /DELAYLOAD:cameraB.dll Delayimp.lib

代码的结构类似于:

if (/* user selected A */)
{
    // Use camera A functions, resulting in load of cameraA's DLL.
}
else
{
    // Use camera B functions, resulting in load of cameraB's DLL.
}

来自延迟加载 DLL 的链接器支持

从 Visual C++ 6.0 开始,当与 DLL 进行静态链接时,
链接器提供延迟加载 DLL 直到程序调用的选项
该DLL中的一个函数。

应用程序可以使用 /DELAYLOAD(延迟加载导入)延迟加载 DLL
带有辅助函数的链接器选项(默认实现由
视觉 C++)。帮助函数将通过调用在运行时加载 DLL
LoadLibrary 和 GetProcAddress 为您服务。

如果出现以下情况,您应该考虑延迟加载 DLL:

- 您的程序可能不会调用 DLL 中的函数。
- DLL 中的函数可能要到程序的后期才会被调用
 执行。
于 2012-05-10T07:23:59.787 回答
0

您需要在运行时加载库。看一看LoadLibary

这是一篇关于此的 MSDN 文章:DLLs the Dynamic Way我刚刚浏览了这个。它很老了。

这一篇展示了LoadLibrary的用法:Using Run-Time Dynamic Linking

于 2012-05-10T07:19:18.997 回答