如何控制Windows DLL从应用程序导入哪些符号?

我试图在Windows上使用MSVC 6(retro!)构build一个共享库(DLL),我有一个特殊的链接问题,我需要解决。 我的共享库必须访问一些全局状态,由加载应用程序控制。

大体上,我拥有的是这样的:

application.c:

static int g_private_value; int use_private_value() { /* do something with g_private_value */ } int main (...) { return shared_library_method (); } 

shared_library.c:

 __declspec(dllexport) int __stdcall shared_library_method() { use_private_value(); } 

更新 – 我忘记了__declspec(dllexport) int __stdcall部分,但它在真正的代码中)

如何设置shared_library.dll,以便导出shared_library_method并导入use_private_value

请记住,A)我是一个unix程序员,一般来说,B),我没有Visual Studio做这个; 我们的自动构build基础设施使用makefiles驱动MSVC。 如果我省略了一些可以更容易回答的问题,请发表评论,我会尽快更新。

实际上这将是相当困难的工作。 在Unix / Linux上,您可以共享对象和应用程序相互导入符号,但在Windows上,您不能从加载它的应用程序中获得DLL导入符号:Windows PE可执行文件格式不支持该方法。

我知道Cygwin项目有一些解决这个问题的方法,但我不相信这是微不足道的。 除非你想做很多与PE有关的黑客攻击,否则你可能不想去那里。

一个简单的解决方案可能只是从DLL中导出某种初始化方法:

 typedef int (*func_ptr)(); void init_library(func_ptr func); 

应用程序必须在启动时调用此函数,并传入要共享的函数的地址。 不完全优雅,但它应该工作正常。

我将从一半的答案开始。

在shared_library.c中:

 __declspec(dllexport) int __stdcall shared_library_method(void) { } 

有关从DLL导出函数的MSDN文章 :s。

下半年,您需要从您的application.c中导出函数。 你可以在链接器中做到这一点:

 /export:use_private_value@0 

这应该得到一个你用你的DLL构建的lib文件。

链接lib文件的选项是使用GetProcAddress()。

正如DavidK指出,如果你只有一些函数,那么在init函数中传递函数指针可能会更容易一些。 然而,有可能做你所要求的。