【发布时间】:2013-01-26 14:50:20
【问题描述】:
在 Windows 上是否有以下等效项?
#include <dlfcn.h>
#include <stdio.h>
void main_greeting(void)
{
printf("%s\n", "hello world");
}
void lib_func(void)
{
void (*greeting)(void) = dlsym(RTLD_MAIN_ONLY, "main_greeting");
greeting ? greeting() : printf("%s\n", dlerror());
}
int main(void)
{
lib_func();
return 0;
}
这是一个简短的 sn-p,真正的目的是从动态加载的库中的函数 (lib_func) 内部调用已知存在于主进程 (main_greeting) 的函数。主进程不可修改,因此无法重写以传递回调。
【问题讨论】:
-
我不明白,Windows 有很多 C 编译器。
-
@Hogan,这与编译器无关,更多的是关于平台进程/库工具。
-
我对此表示怀疑。如果可执行文件本身或符号文件(例如 .pdb)中没有调试信息,则无法通过 .exe 中的名称找到函数,因为它们不应该导出函数。您很可能需要找到相对于 .exe 基数的函数,在运行时找到基数,添加偏移量,然后才调用。
-
“从函数内部调用一个已知存在于主进程的函数”很难理解,请澄清
-
@chico - 请参阅下面的 Anton Kovalenko 的回答 - 显然这通过 gcc 很简单(例如)。因此,真正的问题并不像 Alexy Frunze 所指出的那样。真正的问题是“我无法让它与 MS 的编译器一起工作。(也许我的评论措辞未能传达:)
标签: c windows winapi dll posix