Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mengimport Fungsi C DLL ke dalam Go?

Bagaimanakah Saya Boleh Mengimport Fungsi C DLL ke dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-12-10 18:06:11709semak imbas

How Can I Import C DLL Functions into Go?

Mengimport Fungsi DLL ke dalam Go menggunakan DllImport Equivalent

Pernyataan Masalah

Dalam C#, DllImport digunakan untuk mengimport fungsi daripada DLL yang ditulis dalam C. Adakah terdapat mekanisme yang serupa dalam Go yang membenarkan untuk mengimport fungsi DLL yang dicipta dalam C?

Penyelesaian Menggunakan CGO dan Syscall

Terdapat pelbagai pendekatan untuk mengimport fungsi DLL ke dalam Go. Satu kaedah melibatkan penggunaan pakej cgo, yang memudahkan penciptaan Go bindings untuk kod C. Dengan cgo, anda boleh memanggil terus fungsi DLL seolah-olah ia adalah fungsi Go.

Kaedah lain memanfaatkan pakej syscall. Ini membolehkan anda berinteraksi dengan API peringkat rendah sistem, termasuk pemuatan DLL dan panggilan fungsi. Dengan menguruskan memori secara eksplisit dan memanggil fungsi sistem yang diperlukan, anda boleh mengimport fungsi DLL menggunakan syscall.

Kod Contoh untuk CGO

import "C"

func main() {
    C.SomeDllFunc(...)
}

Kod Contoh untuk Syscall

import (
    "fmt"
    "syscall"
    "unsafe"
)

func main() {
    kernel32, _ := syscall.LoadLibrary("kernel32.dll")
    getModuleHandle, _ := syscall.GetProcAddress(kernel32, "GetModuleHandleW")

    handle := GetModuleHandle()
    fmt.Println(handle)
}

func GetModuleHandle() uintptr {
    var nargs uintptr = 0
    ret, _, _ := syscall.Syscall(uintptr(getModuleHandle), nargs, 0, 0, 0)
    return ret
}

Tambahan Sumber

Untuk butiran lanjut, rujuk sumber berikut:

  • [Menggunakan DLL pada Windows](https://github.com/golang/go/wiki/ WindowsDLLs)

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengimport Fungsi C DLL ke dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn