婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > golang調用c實現的dll接口細節分享

golang調用c實現的dll接口細節分享

熱門標簽:excel地圖標注分布數據 涿州代理外呼系統 外呼系統用什么卡 電話機器人軟件免費 阿克蘇地圖標注 百度地圖標注后傳給手機 評價高的400電話辦理 外呼系統顯本地手機號 壽光微信地圖標注

目的

本篇文章主要介紹golang在調用c實現的dll時,具體的一些方式。比如值傳遞、參數傳遞、指針等等的一些使用。

一、dll的代碼

c實現的dll代碼:

hello.h

#ifndef _HELLO_H_
#define _HELLO_H_
#include stdio.h>
#define HELLO_EXPORTS
#ifdef HELLO_EXPORTS
#define EXPORTS_API extern "C" __declspec(dllexport)
#else
#define EXPORTS_API extern "C" __declspec(dllimport)
#endif // HELLO_EXPORTS
EXPORTS_API int add(int left, int right);
EXPORTS_API void show(char* ptr, int nLen);
EXPORTS_API char* change(char* ptr, int nLen);
EXPORTS_API void callByReference(int nLen);
EXPORTS_API void callByPtr(int* nLen);
#endif //_HELLO_H_

hello.cpp

#include "hello.h"
int add(int left, int right)
{
 return left + right;
}
void show(char* ptr,int nLen)
{
 printf("> -------------------\n> Pass `pointer` and `int` data:\n");
 printf(">> %s, %d\n", ptr,nLen);
}
char* change(char* ptr, int nLen)
{
 if (!ptr || 0 > nLen)
  return nullptr;
 printf("> -------------------\n> Pass `pointer` and `int` data:\n");
 printf("> src strings: %s\n",ptr);
 ptr[1] = 'a';
 printf("> modify strings: %s\n", ptr);
 return ptr;
}
void callByReference(int nLen)
{
 nLen = 100;
}
void callByPtr(int* nLen)
{
 *nLen = 1000;
}

生成一個名為c2plusdll.dll的動態庫文件,位于我的路徑:E:\\Code\\vs2015_project\\demo\\x64\\Release\\c2plusdll.dll

二、golang的調用代碼

編寫調用dll的代碼:

package main
import (
 "fmt"
 "strconv"
 "syscall"
 "unsafe"
)
func main() {
 call()
}
func IntPtr(n int) uintptr {
 return uintptr(n)
}
func Int2IntPtr(n int) uintptr {
 return uintptr(unsafe.Pointer(n))
}
func IntPtr2Ptr(n *int) uintptr {
 return uintptr(unsafe.Pointer(n))
}
func BytePtr(s []byte) uintptr {
 return uintptr(unsafe.Pointer(s[0]))
}
func call() error {
 left := 4
 right := 5
 err := Add(left, right)
 if err != nil {
  fmt.Println("Error:", err)
  return err
 }
 str := []byte("this is a test msg!")
 err = Show(str, len(str))
 if err != nil {
  fmt.Println("Error:", err)
  return err
 }
 err = Change_bytes(str, len(str))
 if err != nil {
  fmt.Println("Error:", err)
  return err
 }
 n := 0
 err = Call_PassByValue(n)
 if err != nil {
  fmt.Println("Error:", err)
  return err
 }
 fmt.Println("> Call_PassByValue(n)的結果為 n=" + strconv.Itoa(n) + ",期待輸出 100")
 n = 0
 err = Call_PassByPtr(n)
 if err != nil {
  fmt.Println("Error:", err)
  return err
 }
 fmt.Println("> Call_PassByPtr(n)的結果為 n=" + strconv.Itoa(n) + ",期待輸出 1000")
 return nil
}
func Add(left, right int) error {
 dllPath := "E:\\Code\\vs2015_project\\demo\\x64\\Release\\c2plusdll.dll"
 handle, err := syscall.LoadLibrary(dllPath)
 if err != nil {
  fmt.Printf("Error: %s\n", err)
  return err
 }
 defer syscall.FreeLibrary(handle)
 add, err := syscall.GetProcAddress(handle, "add")
 if err != nil {
  fmt.Printf("Error: %s\n", err)
  return err
 }
 ret, _, _ := syscall.Syscall(add, 2, IntPtr(left), IntPtr(right), 0)
 if err != nil {
  fmt.Printf("Error: %s\n", err)
 }
 fmt.Println("> Add(4,5)的結果為:", ret)
 return nil
}
func Show(str []byte, l int) error {
 dllPath := "E:\\Code\\vs2015_project\\demo\\x64\\Release\\c2plusdll.dll"
 handle := syscall.NewLazyDLL(dllPath)
 show := handle.NewProc("show")
 show.Call(BytePtr(str), IntPtr(l))
 return nil
}
func Change_bytes(str []byte, l int) error {
 dllPath := "E:\\Code\\vs2015_project\\demo\\x64\\Release\\c2plusdll.dll"
 handle := syscall.NewLazyDLL(dllPath)
 change := handle.NewProc("change")
 change.Call(BytePtr(str), IntPtr(l))
 return nil
}
func Call_PassByValue(n int) error {
 dllPath := "E:\\Code\\vs2015_project\\demo\\x64\\Release\\c2plusdll.dll"
 handle := syscall.NewLazyDLL(dllPath)
 test := handle.NewProc("callByReference")
 test.Call(Int2IntPtr(n))
 return nil
}
func Call_PassByPtr(n *int) error {
 dllPath := "E:\\Code\\vs2015_project\\demo\\x64\\Release\\c2plusdll.dll"
 handle := syscall.NewLazyDLL(dllPath)
 test := handle.NewProc("callByPtr")
 test.Call(IntPtr2Ptr(n))
 return nil
}

三、結果分析

運行的結果:

從上圖中可以看到:

1、當值傳遞時并沒有修改傳入的值;只有指針傳遞時修改了傳入的值。

2、指針傳遞時golang側使用的是byte切片

四、結論

1、需要修改參數的值時,必須使用指針類型

func Call_PassByPtr(n *int) error{
return nil
}

2、需要修改指針的內容時,必須使用指針類型

func Change_bytes(str []byte, l int) error {
 return nil
}

3、golang傳遞指針給c接口函數時,必須使用[] byte的類型,不能使用string類型

func Show(str []byte, l int) error {
 dllPath := "E:\\Code\\vs2015_project\\demo\\x64\\Release\\c2plusdll.dll"
 handle := syscall.NewLazyDLL(dllPath)
 show := handle.NewProc("show")
 show.Call(BytePtr(str), IntPtr(l))
 return nil
}

4、golang調用c接口時有三種方式:

(1)使用syscall.LoadLibrary(dllPath)函數加載dll,syscall.Syscall(...)函數調用具體的函數接口,如下:

func Add(left, right int) error {
 dllPath := "E:\\Code\\vs2015_project\\demo\\x64\\Release\\c2plusdll.dll"
 handle, err := syscall.LoadLibrary(dllPath)
 if err != nil {
  fmt.Printf("Error: %s\n", err)
  return err
 }
 defer syscall.FreeLibrary(handle)
 add, err := syscall.GetProcAddress(handle, "add")
 if err != nil {
  fmt.Printf("Error: %s\n", err)
  return err
 }
 ret, _, _ := syscall.Syscall(add, 2, IntPtr(left), IntPtr(right), 0)
 if err != nil {
  fmt.Printf("Error: %s\n", err)
 }
 fmt.Println("> Add(4,5)的結果為:", ret)
 return nil
}

(2)使用syscall.NewLazyDLL()加載dll,使用接口函數.Call(uintptr類型的參數)來調用函數

func Call_PassByPtr(n *int) error {
 dllPath := "E:\\Code\\vs2015_project\\demo\\x64\\Release\\c2plusdll.dll"
 handle := syscall.NewLazyDLL(dllPath)
 test := handle.NewProc("callByPtr")
 test.Call(IntPtr2Ptr(n))
 return nil
}

(3)使用syscall.MustLoadDLL(dllPath)加載dll,函數接口函數.Call(參數列表)調用

func Call_PassByValue(n int) error {
 dllPath := "E:\\Code\\vs2015_project\\demo\\x64\\Release\\c2plusdll.dll"
 handle := syscall.MustLoadDLL(dllPath)
 callByReference := handle.MustFindProc("callByReference")
 ret, _, err := callByReference.Call(IntPtr(n))
 if err != nil {
  fmt.Println("DllTestDef的運算結果為:", ret)
 }
 return nil
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Golang中switch語句和select語句的用法教程
  • Golang 編譯成DLL文件的操作
  • Golang如何調用windows下的dll動態庫中的函數
  • golang實踐-第三方包為私有庫的配置方案
  • 完美解決golang go get私有倉庫的問題
  • golang gopm get -g -v 無法獲取第三方庫的解決方案
  • Golang: 內建容器的用法
  • golang switch語句的靈活寫法介紹

標簽:欽州 吐魯番 雞西 梅河口 汕頭 蘭州 重慶 銅川

巨人網絡通訊聲明:本文標題《golang調用c實現的dll接口細節分享》,本文關鍵詞  golang,調用,實現,的,dll,接口,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang調用c實現的dll接口細節分享》相關的同類信息!
  • 本頁收集關于golang調用c實現的dll接口細節分享的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    高清国产一区二区| 日本三级韩国三级欧美三级| 中文字幕在线观看不卡| 国产精品一卡二| 国产午夜亚洲精品羞羞网站| 国产乱子伦视频一区二区三区| 欧美大片国产精品| 久久99久久99精品免视看婷婷| 精品国产第一区二区三区观看体验| 精品一区二区三区欧美| 国产视频亚洲色图| 91免费视频大全| 亚洲高清在线精品| 精品久久久久久久人人人人传媒| 国产一区二区免费在线| 亚洲美女屁股眼交| 69成人精品免费视频| 国产老肥熟一区二区三区| 亚洲视频一区二区在线| 91精品国产欧美一区二区 | 欧美一级一级性生活免费录像| 日本中文字幕一区二区视频| 久久精品一区二区三区不卡| 欧美影院一区二区| 国产精品99久久不卡二区| 亚洲精品第1页| 精品国产乱码久久| 在线观看免费亚洲| 国产毛片精品视频| 亚洲高清不卡在线| 国产清纯在线一区二区www| 色播五月激情综合网| 国产在线日韩欧美| 亚洲成av人片在线观看| 国产精品视频一区二区三区不卡| 欧美精品777| 色综合久久六月婷婷中文字幕| 久久不见久久见免费视频7| 亚洲精品视频自拍| 欧美国产精品劲爆| 日韩欧美一区二区不卡| 91成人免费在线| 波多野结衣91| 久久69国产一区二区蜜臀| 亚洲一区二区三区在线播放| 国产欧美一区二区精品忘忧草| 3d成人h动漫网站入口| 色婷婷精品大视频在线蜜桃视频| 国产精品一二三在| 午夜激情一区二区| 亚洲一二三四区| 国产精品久久一级| 欧美久久婷婷综合色| 91亚洲精品乱码久久久久久蜜桃| 国产一区二区不卡| 免费精品视频最新在线| 亚洲一区在线看| 1000部国产精品成人观看| 精品电影一区二区三区| 日韩亚洲欧美中文三级| 色老汉一区二区三区| 99vv1com这只有精品| 国产精品一级在线| 久久成人综合网| 久久精品国产亚洲高清剧情介绍 | 在线亚洲高清视频| 99在线视频精品| 成人激情电影免费在线观看| 国产真实乱对白精彩久久| 日本成人超碰在线观看| 麻豆久久久久久| 蜜臀av一区二区三区| 狠狠色丁香婷婷综合| 国产精品一区二区三区四区| 激情深爱一区二区| 国产精品一区二区在线观看不卡| 国产一区二区三区日韩| 懂色av一区二区在线播放| 99久久99久久综合| 欧美亚洲高清一区二区三区不卡| 欧美日韩一卡二卡| 精品国一区二区三区| 精品国产乱码久久久久久久| 国产精品每日更新在线播放网址| 一区二区三区在线看| 一区二区三区不卡视频| 亚洲综合色丁香婷婷六月图片| 亚洲综合色自拍一区| 天堂影院一区二区| 美女视频一区在线观看| 麻豆91在线播放免费| 床上的激情91.| 99久久婷婷国产| 精品区一区二区| 精品国产乱码久久久久久图片 | 久久蜜臀中文字幕| 中文子幕无线码一区tr| 一二三区精品视频| 韩国欧美国产一区| 99久久99久久久精品齐齐| 制服丝袜一区二区三区| 久久亚洲一区二区三区四区| 亚洲少妇30p| 精品在线亚洲视频| 91在线精品一区二区三区| 日韩欧美国产精品一区| 国产精品国产三级国产| 男人操女人的视频在线观看欧美| 9久草视频在线视频精品| 555www色欧美视频| 中文字幕一区二区在线播放| 久久aⅴ国产欧美74aaa| 欧美午夜宅男影院| 国产精品日日摸夜夜摸av| 图片区日韩欧美亚洲| 99久久免费精品高清特色大片| 精品国产91久久久久久久妲己| 国产精品视频一二三区| 国内精品国产成人| 欧美日本一区二区| 国产精品久久99| 国产激情91久久精品导航| 免费久久99精品国产| 99久久精品免费看国产| 精品女同一区二区| 亚洲亚洲精品在线观看| 99国产精品国产精品久久| 精品福利av导航| 看片网站欧美日韩| 欧美视频你懂的| 亚洲国产视频一区二区| 欧美高清www午色夜在线视频| 中文幕一区二区三区久久蜜桃| 精品一区二区影视| 99久久伊人久久99| 国产精品天天摸av网| 国产激情精品久久久第一区二区| 欧美xxxxxxxx| 国产一区二区三区久久久| 欧美电视剧在线观看完整版| 精品一区二区三区免费视频| 精品国产一区二区三区忘忧草| 麻豆91在线观看| 久久精品亚洲一区二区三区浴池| 欧美韩国日本综合| 久久99精品久久久久久| 日韩你懂的在线观看| 蜜桃在线一区二区三区| 2017欧美狠狠色| 国模娜娜一区二区三区| 久久久精品综合| 粉嫩aⅴ一区二区三区四区| 精品免费视频一区二区| 偷拍日韩校园综合在线| 在线影院国内精品| 蜜桃在线一区二区三区| 中文字幕精品一区二区精品绿巨人| 成人视屏免费看| 亚洲电影一区二区| 精品sm在线观看| 成人的网站免费观看| √…a在线天堂一区| 欧美一级欧美一级在线播放| 国产在线国偷精品免费看| 国产精品久久久久久久久免费樱桃| 色狠狠色狠狠综合| 亚洲一区二区三区在线看| 日韩一级免费观看| 国产成人亚洲综合色影视| 国产午夜亚洲精品午夜鲁丝片| 99国产精品久久| 精品一区二区精品| 亚洲香蕉伊在人在线观| 久久免费视频色| 色天天综合久久久久综合片| 免费观看久久久4p| 中文字幕日韩一区二区| 日韩精品中午字幕| 91日韩一区二区三区| 免费一区二区视频| 亚洲免费观看在线视频| 2017欧美狠狠色| 3d动漫精品啪啪一区二区竹菊 | 国产成人精品亚洲日本在线桃色 | 天天做天天摸天天爽国产一区 | 大桥未久av一区二区三区中文| 亚洲国产精品一区二区www| 国产喂奶挤奶一区二区三区| eeuss鲁片一区二区三区在线看| 香蕉乱码成人久久天堂爱免费| 国产精品久久久久一区| 精品对白一区国产伦| 日韩欧美电影一区| 色综合婷婷久久| caoporn国产一区二区| 国产麻豆成人传媒免费观看| 久久机这里只有精品| 日产国产高清一区二区三区| 亚洲成人在线网站| 亚洲成人在线免费|