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

时间:2008-10-29 16:27:24

标签: windows linker shared-libraries

我正在尝试使用MSVC 6(复古!)在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。如果我省略了一些可以更容易回答问题的内容,请发表评论,我会尽快更新。

3 个答案:

答案 0 :(得分:2)

这实际上很难开始工作。在Unix / Linux上,您可以让共享对象和应用程序相互导入符号,但在Windows上,您不能从加载它的应用程序中获取DLL导入符号:Windows PE可执行格式不支持该习惯用法。 / p>

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

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

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

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

答案 1 :(得分:1)

我将从答案的一半开始。

在shared_library.c中:

__declspec(dllexport) int __stdcall shared_library_method(void)
{


}

关于从DLL导出函数的MSDN article:s。

答案 2 :(得分:1)

对于下半部分,您需要从application.c导出函数。 您可以在链接器中执行以下操作:

/export:use_private_value@0

这应该会为您提供一个使用DLL构建的lib文件。

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

正如DavidK所说,如果你只有一些函数,那么在init函数中传递函数指针可能更容易。但是,你可以做你想要的。