如何控制Windows DLL从应用程序导入哪些符号?
我想在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。如果我省略了一些可以更容易回答问题的内容,请发表评论,我会尽快更新。
我会从一半的答案开始。
在shared_library.c:
__declspec(dllexport) int __stdcall shared_library_method(void)
{
}
的MSDN article有关从DLL导出功能:秒。
这实际上很难找到工作。在Unix/Linux上,您可以共享对象和应用程序相互导入符号,但在Windows上,您不能从加载该符号的应用程序中获得DLL导入符号:Windows PE可执行文件格式不支持该惯用语。
我知道Cygwin项目有一些解决此问题的方法,但我不认为这是微不足道的。除非你想做很多与PE相关的黑客攻击,否则你可能不想去那里。
更简单的解决方案可能是只具有某种从DLL导出初始化方法:
typedef int (*func_ptr)();
void init_library(func_ptr func);
应用程序必须在启动时调用此方法,传递函数的地址,你想分享。不完全优雅,但它应该没问题。
下半年,您需要从您的application.c中导出函数。 您可以用链接器做到这一点:
/export:[email protected]
这应该让你,你建立与您的DLL一个lib文件。
链接lib文件的选项是使用GetProcAddress()。
正如DavidK指出的,如果你只有一些函数,那么在init函数中传递函数指针可能会更容易。然而,可以做你所要求的。
我应该包括那个;我在共享库中的声明都有。在帖子中更新。 – 2008-10-29 17:14:57