C 有没有办法在Windows中按名称获取当前进程中的函数?
Windows上是否有与以下内容等效的功能C 有没有办法在Windows中按名称获取当前进程中的函数?,c,windows,winapi,dll,posix,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 ? greet
#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;
}
#包括
#包括
void main_问候语(void)
{
printf(“%s\n”、“你好世界”);
}
void lib_func(void)
{
无效(*问候语)(无效)=dlsym(仅限RTLD_MAIN_,“MAIN_问候语”);
问候语?问候语():printf(“%s\n”,dlerror());
}
内部主(空)
{
lib_func();
返回0;
}
这是一个简短的代码片段,真正的目的是从动态加载库中的函数(
lib\u func
)内部调用已知存在于主进程(main\u greeting
)中的函数。主进程不可修改,因此无法重写以传递回调。在Windows上,可执行文件和DLL的格式相同(PE
),因此可执行文件也可以导出函数GetProcAddress(GetModuleHandle(NULL),TEXT(“main_greeting”)
将执行从可执行文件导出函数所需的操作。它由-Wl,-导出mingw GCC的所有符号来完成
我相信微软的链接器没有同等的选项,所以如果你使用他们的工具链,你必须:
- 使用源文件中的
\u declspec(dllexport)
导出每个函数
- 或者编写每个导出函数的列表,并将其传递给链接器
- 或者
我不明白,Windows有很多C编译器。@Hogan,这与编译器无关,更多的是关于平台进程/库工具。我对此表示怀疑。如果可执行文件本身或符号文件(例如.pdb)中没有调试信息,则无法在.exe中通过函数名找到函数,因为它们不应导出函数。您很可能需要找到相对于.exe基的函数,在运行时找到基,添加偏移量,然后才调用。“从函数内部调用已知存在于主进程中的函数”很难理解clarify@chico-见下文安东·科瓦连科的答案——显然,通过gcc这很简单(例如). 因此,真正的问题并不像亚历克西·弗伦泽所指出的那样。真正的问题是“我不能让它与MS的编译器一起工作。(可能我的评论中的措辞没有让人理解:)谢谢,我想知道msvc是否有这样一个选项。@chico然后将其添加到问题中并重新标记。@chico查看两个阶段的解决方案(涉及自动生成的.def文件)@AntonKovalenko我明白了,对于msvc来说,它归结为使用模块定义文件来定义.exe的导出。@chico如果您不介意手动编写.def文件,列出所有导出的函数,那么就没有问题了。上面的链接用于自动生成一个.def文件来导出所有内容。