我怎样才能得到一个指向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?
我认为您要做的是获取非托管函数的地址。GetFunctionPointerForDelegate
所做的是返回一个指向托管地址的指针,供非托管代码调用,这不是你想要的。
如果你需要从模块中获取本地函数的地址,你应该使用本地Win32来做到这一点,就像在你的库中使用GetProcAddress
一样。因此,您要做的是使用LoadLibrary
(或其变体之一)来获取模块的句柄,将其传递给GetProcAddress
以及您正在寻找的导出名称,"B"在您的示例中,然后使用FreeLibrary
来减少您对模块的引用计数。GetProcAddress的返回值给你你正在寻找的指针。