2008-10-29 16 views
1

我想在Windows上使用MSVC 6(retro!)构建一个共享库(DLL),并且我需要解决一个特殊的链接问题。我的共享库必须访问一些全局状态,由加载应用程序控制。如何控制Windows 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做这个;我们的自动构建基础设施使用makefile来驱动MSVC。如果我省略了一些可以更容易回答问题的内容,请发表评论,我会尽快更新。

回答

1

我会从一半的答案开始。

在shared_library.c:

__declspec(dllexport) int __stdcall shared_library_method(void) 
{ 


} 

MSDN article有关从DLL导出功能:秒。

+0

我应该包括那个;我在共享库中的声明都有。在帖子中更新。 – 2008-10-29 17:14:57

2

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

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

更简单的解决方案可能是只具有某种从DLL导出初始化方法:

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

应用程序必须在启动时调用此方法,传递函数的地址,你想分享。不完全优雅,但它应该没问题。

1

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

/export:[email protected] 

这应该让你,你建立与您的DLL一个lib文件。

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

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

相关问题