我怎样才能得到一个指向C函数的指针

本文关键字:一个 指针 函数 | 更新日期: 2023-09-27 18:15:10

某个C函数(A)接受函数指针作为参数。它检查这个指针是否指向某个C函数(B)。因此,我需要将指向B的指针传递给a。我假设我可以通过以下方式完成:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MyDelegate();
[DllImport("somelibrary", CallingConvention = CallingConvention.Cdecl)]
private static extern void B();

,然后得到函数的地址:

var pointer = Marshal.GetFunctionPointerForDelegate(new MyDelegate(B));

但显然,我得到的指针不指向B(因为,通过用两个不同的委托来调用GetFunctionPointerForDelegate,我得到了不同的结果)。有没有一种方法能让指针直接指向B?

我怎样才能得到一个指向C函数的指针

认为您要做的是获取非托管函数的地址。GetFunctionPointerForDelegate所做的是返回一个指向托管地址的指针,供非托管代码调用,这不是你想要的。

如果你需要从模块中获取本地函数的地址,你应该使用本地Win32来做到这一点,就像在你的库中使用GetProcAddress一样。因此,您要做的是使用LoadLibrary(或其变体之一)来获取模块的句柄,将其传递给GetProcAddress以及您正在寻找的导出名称,"B"在您的示例中,然后使用FreeLibrary来减少您对模块的引用计数。GetProcAddress的返回值给你你正在寻找的指针。