Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有没有办法在Windows中按名称获取当前进程中的函数?_C_Windows_Winapi_Dll_Posix - Fatal编程技术网

C 有没有办法在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

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;
}
#包括
#包括
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文件来导出所有内容。