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

如何控制Windows DLL从应用程序导入的符号?,windows,linker,shared-libraries,Windows,Linker,Shared Libraries,我正在尝试使用MSVC 6(retro!)在Windows上构建一个共享库(DLL),我需要解决一个特殊的链接问题。我的共享库必须访问由加载应用程序控制的某些全局状态 大体上,我所拥有的是: 应用程序c: static int g_private_value; int use_private_value() { /* do something with g_private_value */ } int main (...) { return shared_library_me

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

大体上,我所拥有的是:

应用程序c:

static int g_private_value;

int use_private_value() {
    /* do something with g_private_value */
}

int main (...) {
    return shared_library_method ();
}
共享_library.c:

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


}
更新了-我忘记了
\u declspec(dllexport)int\u stdcall
部分,但它在真正的代码中)

如何设置shared_library.dll,使其导出
shared_library_方法
并导入
use_private_值


请记住,A)我通常是一名unix程序员,B)我在没有Visual Studio的情况下完成这项工作;我们的自动化构建基础设施使用makefiles驱动MSVC。如果我遗漏了一些可以使回答问题更容易的内容,请发表评论,我会尽快更新。

我将从一半答案开始

在shared_library.c中:

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


}

关于从DLL:s导出函数。

我将从一半答案开始

在shared_library.c中:

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


}

关于从DLL:s导出函数的说明。

这实际上很难实现。在Unix/Linux上,您可以让共享对象和应用程序相互导入符号,但在Windows上,您不能让DLL从加载它的应用程序导入符号:Windows PE可执行文件格式不支持这种习惯用法

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

更简单的解决方案可能是从DLL中导出某种初始值设定项方法:

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

应用程序必须在启动时调用此函数,并传入要共享的函数的地址。不太优雅,但应该可以使用。

这实际上很难使用。在Unix/Linux上,您可以让共享对象和应用程序相互导入符号,但在Windows上,您不能让DLL从加载它的应用程序导入符号:Windows PE可执行文件格式不支持这种习惯用法

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

更简单的解决方案可能是从DLL中导出某种初始值设定项方法:

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

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

在下半年,您需要从应用程序中导出函数。c。 您可以在链接器中通过以下方式执行此操作:

/export:use_private_value@0
这将获得一个用DLL构建的lib文件

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


正如DavidK所指出的,如果只有几个函数,那么在init函数中传递函数指针可能会更容易。但是,您可以按要求执行操作。

在下半年,您需要从应用程序中导出函数。c。 您可以在链接器中通过以下方式执行此操作:

/export:use_private_value@0
这将获得一个用DLL构建的lib文件

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


正如DavidK所指出的,如果只有几个函数,那么在init函数中传递函数指针可能会更容易。但是,你可以按照你的要求去做。

我应该包括这一点;我在共享库中的声明确实有这样的功能。在帖子中更新了。我应该把它包括在内;我在共享库中的声明确实有这样的功能。更新后的帖子。