3

在 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主进程不可修改,因此无法重写以传递回调。

4

1 回答 1

5

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

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

于 2013-01-26T14:55:41.597 回答