如何 Link 从一个 DLL 加载的 DLL 到一个函数?

How to Link to a function from a DLL loaded by a DLL?

我正在使用 VS2010,我有一个如下所示的分层应用程序:

app.exe
DLL1.dll
DLL2.dll

其中 app.exe 加载 DLL1,然后加载 DLL2。我希望我的应用程序像这样 DLL2::setvariable( value ) 调用 DLL2 中的函数。

我已经在我的 vc6 工作区中正确设置了它,而无需为 DLL2.dll 指定 lib 文件。如何在我的 VS2010 环境中进行设置?对于 DLL2.dll.

的所有调用,我不断收到未解决的符号链接器错误

我试过包括 #pragma comment(lib ,"DLL2.lib")app.exeDLL1.dll 中并且它链接但是这是否加载 DLL2.dll 及其所有变量两次?

一个DLL只在一个应用程序的地址-space中加载一次。这是 Windows 设计的。 dll 的导入库加载 dll (LoadLibrary()) 并将本地函数名称分配给 dll 函数。您可以通过调用 LoadLibrary()GetProcAddress().

自己做同样的事情

根据Documentation:

系统在所有加载的模块上维护每个进程的引用计数。调用 LoadLibrary 会增加引用计数。调用 FreeLibrary 或 FreeLibraryAndExitThread 函数会减少引用计数。当引用计数达到零或进程终止时(无论引用计数如何),系统都会卸载模块。

所以不,一个DLL只加载一次,只是它的"UseCount"设置为2.

I've set this up properly in my vc6 workspace without having to specify the lib file for DLL2.dll

我猜你不是从 app.exe 调用 DLL2::setvariable( value ),否则你是怎么做到的?

Is this the right way to do it?

这是一种方法(虽然您可以简单地将 lib 包含到项目中 - 正如大多数开发人员所做的那样 - 而不是使用 #pragma,但结果是相同的) .另一种方法是自己调用 LoadLibrary()/GetProcAddress()(如果你想有条件地加载 dll,这很有用)。我没有其他方法知道。