在应用程序启动时松开DLL依赖项

时间:2012-05-10 07:15:52

标签: c++ dll dependencies

在我的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"}

2 个答案:

答案 0 :(得分:2)

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

  

link.exe ... /DELAYLOAD:cameraA.dll /DAYAYLOAD: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.
}

来自Linker Support for Delay-Loaded DLLs

Beginning with Visual C++ 6.0, when statically linking with a DLL, the
linker provides options to delay load the DLL until the program calls
a function in that DLL.

An application can delay load a DLL using the /DELAYLOAD (Delay Load Import)
linker option with a helper function (default implementation provided by
Visual C++). The helper function will load the DLL at run time by calling
LoadLibrary and GetProcAddress for you.

You should consider delay loading a DLL if: 

- Your program may not call a function in the DLL.
- A function in the DLL may not get called until late in your program's
 execution.

答案 1 :(得分:0)

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

这是一篇关于此问题的MSDN文章:DLLs the Dynamic Way 我只是看了一遍。它已经很老了。

这个显示了LoadLibrary的用法:Using Run-Time Dynamic Linking