如何 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.exe
和 DLL1.dll
中并且它链接但是这是否加载 DLL2.dll
及其所有变量两次?
一个DLL只在一个应用程序的地址-space中加载一次。这是 Windows 设计的。 dll 的导入库加载 dll (LoadLibrary()
) 并将本地函数名称分配给 dll 函数。您可以通过调用 LoadLibrary()
和 GetProcAddress()
.
自己做同样的事情
系统在所有加载的模块上维护每个进程的引用计数。调用 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,这很有用)。我没有其他方法知道。
我正在使用 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.exe
和 DLL1.dll
中并且它链接但是这是否加载 DLL2.dll
及其所有变量两次?
一个DLL只在一个应用程序的地址-space中加载一次。这是 Windows 设计的。 dll 的导入库加载 dll (LoadLibrary()
) 并将本地函数名称分配给 dll 函数。您可以通过调用 LoadLibrary()
和 GetProcAddress()
.
系统在所有加载的模块上维护每个进程的引用计数。调用 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,这很有用)。我没有其他方法知道。