【问题标题】:Is there a way to obtain, by name, a function at current process in Windows?有没有办法通过名称获取 Windows 中当前进程的函数?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我想知道msvc是否有这样一个选项很艰难。
  • @chico 然后将其添加到问题中并重新标记。
  • @chico 请参阅stackoverflow.com/questions/225432/… 了解两阶段解决方案(涉及自动生成的 .def 文件)
  • @AntonKovalenko 看着msdn.microsoft.com/en-us/library/28d6s79h.aspx 我明白了,对于 msvc,它归结为使用模块定义文件来定义 .exe 的导出。
  • @chico 如果您不介意手动编写 .def 文件,列出所有导出的函数,那也没问题。上面的链接用于自动生成 .def 文件以导出所有内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2011-08-02
相关资源
最近更新 更多