如何控制Windows DLL从应用程序导入的符号?
我正在尝试使用MSVC 6(retro!)在Windows上构建一个共享库(DLL),我需要解决一个特殊的链接问题。我的共享库必须访问由加载应用程序控制的某些全局状态 大体上,我所拥有的是: 应用程序c:如何控制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
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函数中传递函数指针可能会更容易。但是,你可以按照你的要求去做。我应该包括这一点;我在共享库中的声明确实有这样的功能。在帖子中更新了。我应该把它包括在内;我在共享库中的声明确实有这样的功能。更新后的帖子。