如何在纯Go中调用DLL返回的WINAPI类型函数指针回调?
纯Go调用WINAPI风格的DLL回调函数指针
你已经从DLL中拿到了一个WINAPI调用约定的回调函数指针,对应的C语言类型定义如下:
typedef int32_t (WINAPI *fn) ();
之前用cgo的实现方式你已经掌握,下面是纯Go的实现方案:
在Windows平台的纯Go代码中,我们可以借助syscall包直接调用这个函数指针——因为WINAPI本质上就是stdcall调用约定,而syscall.Syscall正好支持调用这类函数指针。
实现代码
package main import ( "syscall" ) func main() { var callBackPtr uintptr // 假设该值已从DLL函数中获取 // 调用stdcall约定的回调函数:无参数,返回int32 // Syscall参数说明: // 第一个参数:函数指针 // 第二个参数:参数数量(这里是0) // 后三个参数:占位的参数值(无参数则填0) ret, _, _ := syscall.Syscall(callBackPtr, 0, 0, 0, 0) // 将返回值转为int32,对应C中的int32_t println("回调函数返回值:", int32(ret)) }
关键说明
- 调用约定匹配:WINAPI对应的是
stdcall调用约定,syscall.Syscall在Windows平台会自动按照这个约定处理函数调用,避免因调用不兼容导致的程序崩溃。 - 参数与返回值处理:由于这个回调没有参数,所以
Syscall的参数数量填0,后续三个参数用0占位;返回值ret是uintptr类型,直接转为int32即可对应C中的int32_t。 - 类型安全:必须确保函数指针的签名完全匹配(参数、返回值类型一致),否则会触发未定义行为。
内容的提问来源于stack exchange,提问作者lysS
相关产品推荐
相关产品推荐

