You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在纯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))
}

关键说明

  1. 调用约定匹配:WINAPI对应的是stdcall调用约定,syscall.Syscall在Windows平台会自动按照这个约定处理函数调用,避免因调用不兼容导致的程序崩溃。
  2. 参数与返回值处理:由于这个回调没有参数,所以Syscall的参数数量填0,后续三个参数用0占位;返回值ret是uintptr类型,直接转为int32即可对应C中的int32_t。
  3. 类型安全:必须确保函数指针的签名完全匹配(参数、返回值类型一致),否则会触发未定义行为。

内容的提问来源于stack exchange,提问作者lysS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:05:37