有没有办法通过名称获取Windows中当前进程的函数?

时间:2013-01-26 14:50:20

标签: c windows winapi dll posix

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;
}

这是一个简短的片段,真正的目的是从动态加载库中的函数(main_greeting)内部调用一个知道存在于主进程(lib_func)的函数。主进程不可修改,因此无法重写以传递回调。

1 个答案:

答案 0 :(得分:3)

在Windows上,可执行文件和DLL的格式相同(现在为PE),因此可执行文件也可以导出函数。如果从可执行文件导出函数,GetProcAddress(GetModuleHandle(NULL),TEXT("main_greeting"))将执行您想要的操作。这是由-Wl,-export-all-symbols为mingw GCC完成的。

我相信微软的链接器没有相同的选项,所以如果你使用他们的工具链,你必须: