成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > golang調(diào)用c實現(xiàn)的dll接口細節(jié)分享

golang調(diào)用c實現(xiàn)的dll接口細節(jié)分享

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

目的

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

一、dll的代碼

c實現(xiàn)的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的動態(tài)庫文件,位于我的路徑:E:\\Code\\vs2015_project\\demo\\x64\\Release\\c2plusdll.dll

二、golang的調(diào)用代碼

編寫調(diào)用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)的結(jié)果為 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)的結(jié)果為 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)的結(jié)果為:", 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
}

三、結(jié)果分析

運行的結(jié)果:

從上圖中可以看到:

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

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

四、結(jié)論

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

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

2、需要修改指針的內(nèi)容時,必須使用指針類型

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

3、golang傳遞指針給c接口函數(shù)時,必須使用[] 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調(diào)用c接口時有三種方式:

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

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)的結(jié)果為:", ret)
 return nil
}

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

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,函數(shù)接口函數(shù).Call(參數(shù)列表)調(diào)用

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的運算結(jié)果為:", ret)
 }
 return nil
}

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

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標題《golang調(diào)用c實現(xiàn)的dll接口細節(jié)分享》,本文關(guān)鍵詞  golang,調(diào)用,實現(xiàn),的,dll,接口,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang調(diào)用c實現(xiàn)的dll接口細節(jié)分享》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang調(diào)用c實現(xiàn)的dll接口細節(jié)分享的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美极品欧美精品欧美图片| 久久久久一区二区三区| 亚洲人成色77777| 亚洲精品成人在线视频| 亚洲人metart人体| 搡老熟女老女人一区二区| 91精品国自产在线偷拍蜜桃| 99热在这里有精品免费| 亚洲 欧美 日韩 综合| 亚洲精品免费一区亚洲精品免费精品一区| 久久久久久高潮国产精品视| 欧美jizz18性欧美| 人猿泰山h版在线观看| 国产欧美亚洲一区| 亚洲午夜国产成人av电影男同| 91在线视频在线| 黄色aaa级片| 26uuu精品一区二区在线观看| 日韩欧美三级电影| 黄色毛片在线看| 色噜噜在线观看| 欧美一级片在线| 99在线视频免费| 免费在线观看国产精品| 天堂精品在线视频| 你懂的国产精品永久在线| 91蜜臀精品国产自偷在线| 亚洲午夜精品一区二区| 蜜桃传媒一区二区| 久久久久国产| 蜜臀aⅴ国产精品久久久国产老师| 国产一区二区高清视频| 中文字幕亚洲综合久久五月天色无吗''| 91精品国产毛片武则天| 免费女人黄页| 黄网av在线| 亚洲精品在线视频免费观看| 国产激情99| 在线观看成人av电影| 一个人看免费www视频有多爽| 国产a亚洲精品| 99re6热在线精品视频播放速度| 青青草免费观看免费视频在线| 成人性生交大片免费观看嘿嘿视频| 污片在线免费观看| 成人h版在线观看| 被陌生人带去卫生间啪到腿软| 亚洲欧美国产三级| av在线免费观看国产| 高清av中文在线字幕观看1| 亚洲成av人影院在线观看| 国产成人短视频在线观看| 国产日韩在线看片| 中文无码日韩欧| 色天天综合狠狠色| 亚洲香蕉在线观看| 国产午夜三级一区二区三| 亚洲男人的天堂成人| 91亚洲国产高清| 黄色一级大片在线免费看国产一| 欧美一区二区高清| 丁香六月久久综合狠狠色| 国产乱淫av片免费| 欧美日韩国产免费一区二区三区| 精品一区二区三区免费观看| 福利视频网址| 亚洲欧美另类在线| 欧美妇性猛交视频| 国产精品主播一区二区| 日韩精品免费视频人成| 日韩精品在线视频观看| 熟妇熟女乱妇乱女网站| 久草中文综合在线| 蜜桃传媒视频第一区入口在线看| 欧美一级欧美三级在线| 艳色歌舞团一区二区三区| 欧美三级午夜理伦三级在线观看| 亚洲国产精品久久人人爱潘金莲| 日韩欧美在线视频| 久久精品人妻一区二区三区| 欧美激情小视频| 男人捅女人免费视频| 白白色亚洲国产精品| sese综合| 蜜臀av免费一区二区三区| 成人精品免费看| 美女航空一级毛片在线播放| 中文字幕+乱码+中文乱码91| 林心如三级全黄裸体| 国产亲伦免费视频播放| 一区二区在线高清视频| 1024国产精品| 亚洲另类中文字| 日本 国产 欧美色综合| 福利网站在线观看| 欧美激情一区二区三区久久久| 免费在线精品视频| 免费看污黄网站| 精品一区二区91| 外卖gayxxxxgay1| eeuss影院www在线| 欧美精品在线第一页| 97精品一区| 国产精品视频观看| 成人自拍视频网站| 精品视频在线播放色网色视频| 麻豆精品国产免费| 喷水一区二区三区| 最近免费中文字幕在线第一页| 国产+成+人+亚洲欧洲在线| 成人精品视频在线观看| 国产va在线播放| 91黄色8090| 色呦呦在线视频| 韩国福利视频一区| 成人福利电影| 成人精品一区二区三区| 国产成人免费在线观看视频| 俺去亚洲欧洲欧美日韩| 日本午夜精品理论片a级app发布| 日韩免费电影一区二区| 精品一区二区三区的国产在线播放| 性一交一黄一片| 中文字幕一区二区人妻视频| 红桃成人av在线播放| 免费av不卡在线| 四虎最新地址发布| 57pao国产成永久免费视频| 国产精品一区二区在线播放| 欧美日韩国产中字| 亚洲综合社区网| 午夜福利三级理论电影| 久久久久国产一区二区三区四区| 欧美在线观看网址综合| 一个人看的www视频免费观看| 国产精品xxx在线观看www| 亚洲精品久久久久久无码色欲四季| 日韩欧美国产一区在线观看| 成人一区而且| 久99久精品视频免费观看| 亚洲一区导航| 中文字幕人妻一区二区在线视频| 免费动漫网站在线观看| 中文字幕在线不卡国产视频| 踪合国产第二页| 国内精品久久久久影院色| 在线观看国产精品视频| 欧美在线不卡视频| 成人精品视频在线观看| 九色视频网址| www.黄在线观看| 亚洲国产小视频| 亚洲图区欧美| 国产精品白丝喷水在线观看| 欧美一区激情| 中文字幕剧情在线观看一区| 国产成人精品亚洲午夜麻豆| a91a精品视频在线观看| 黄色av网站免费在线观看| 超碰超碰97| 日韩免费高清在线观看| 91麻豆精品国产91久久久平台| 这里有精品可以观看| 国产91xxx| 国产三级国产精品国产国在线观看| 国产精品成人va在线观看| 亚洲成在人线免费观看| 久久久精品有限公司| 免费97视频在线精品国自产拍| 日韩精品免费一区二区三区竹菊| 日本韩国一区二区三区视频| 亚洲视频一区二区在线| 日韩精品首页| 免费黄色小视频| 色综合久久av| 亚洲第一天堂| 欧美日韩精品免费| 俺去俺来也在线www色官网| 99porn视频在线| 久久中文字幕在线观看| 久久综合成人| 日韩成人在线免费观看| 久久精品国产一区二区三区不卡| http://嫩草影院| 成人av在线不卡| 欧美亚州在线观看| 国产亚洲美女精品久久久| 亚洲免费在线视频| 成人短视频在线| 亚洲熟女乱综合一区二区三区| 一本色道久久综合亚洲aⅴ蜜桃| 久久久黄色av| 精品国产乱码久久久久久老虎| 色视频在线看| 黄色美女网站在线观看| 制服.丝袜.亚洲.另类.中文| 性刺激的欧美三级视频| 亚洲福利视频导航| 国产女同在线观看| 中文字幕av高清在线观看| 亚洲免费观看高清完整版在线观看| 亚洲精品无码久久久久| 精品国产一区二区三区久久狼5月| 黄色一区二区视频| 日韩高清专区| 亚洲天堂网中文字| 日产国产精品精品a∨| 91精品国产自产拍在线观看蜜| 自拍亚洲图区| 国产精品999久久久| 欧美中文字幕一区二区三区| 久久人人爽人人爽人人| 欧美一级本道电影免费专区| 欧美精品偷拍| 亚洲视频www| 最新日韩欧美| 六月丁香在线视频| 性一交一乱一精一晶| 狠狠色成人综合网图片区| 国产成人精品在线| 天堂在线中文网官网| 欧美在线观看网址综合| 2023国产精品久久久精品双| 操人视频在线观看| 欧美精品18videos性欧| 日本一区二区视频| 新欧美整片sss第一页| 欧美成人女星排行榜| 91在线电影| 女教师高潮黄又色视频| 青青草免费观看视频| 综合国产在线观看| 久久出品必属精品| 亚洲一二在线观看| 三区四区在线视频| 人善交video高清| 人人影院免费大片| 伊人久久大香线蕉综合热线| ijzzijzzij亚洲大全| 91精品久久久久久久久久久久| 羞羞色国产精品| 日韩久久精品一区二区三区| 91视频久久久| jlzzjlzz欧美大全| 最新中文字幕免费| 精品国产一区二区三区忘忧草| 日韩欧亚中文在线| 亚洲麻豆一区二区三区| 天堂а√在线官网| 亚洲天堂2017| 色橹橹欧美在线观看视频高清| 欧美日韩国产高清一区二区三区| 一级aaaa毛片| 日韩精品一区二区三区中文精品| 中文综合在线观看| 国产小视频福利在线| 国产一级生活片| 日韩欧美成人激情| 视频二区欧美毛片免费观看| 乱h高h女3p含苞待放| 国产黄色片免费观看| 中文字幕日韩综合| 亚洲一区二区三区久久| 精品一区二区三区四区在线| 激情乱色小说视频| 国产后入清纯学生妹| 亚洲欧洲精品一区二区| 亚洲国产日韩a在线播放| 欧洲精品毛片网站| 337p亚洲精品色噜噜狠狠p| 在线一区免费| 欧美日韩精品在线一区| 老太脱裤子让老头玩xxxxx| 亚洲欧洲一区二区三区| 免费福利片在线观看| 欧美日韩福利在线观看| 先锋影音在线播放av| 国产精品igao激情视频| 国产黑丝在线一区二区三区| jizzjizz中国精品麻豆| 一级特黄免费视频| 中文字幕一区二区三区在线观看| 国产制服丝袜在线| 亚洲成**性毛茸茸| 美女黄色片视频| 精品999久久久| 你微笑时很美电视剧整集高清不卡| 少妇精品放荡导航| 免费黄色av网址| 欧美lavv| 亚洲午夜精品久久久中文影院av| 欧美色视频一区| av在线电影免费观看| 国精品人伦一区二区三区蜜桃| 国产精品一区二区免费在线观看| 麻豆视频免费在线播放| 欧美91看片特黄aaaa| 色婷婷av一区| 久久久久国产精品www| 无人视频在线观看免费| www视频网站| 在线观看成人网| 忘忧草在线影院两性视频| 国产精品网红直播| 欧美黄网免费在线观看| 青青草视频导航| 亚洲精品v亚洲精品v日韩精品| 日本欧美一区二区三区不卡视频| 国产精品 日产精品 欧美精品| 紧缚奴在线一区二区三区| 国模无码国产精品视频| 国产特黄级aaaaa片免| 97国产成人高清在线观看| 久久久www免费人成黑人精品| 亚洲精品在线a| 精品51国产黑色丝袜高跟鞋| 欧美日韩一区二区国产| 日韩国产精品视频| 狂野欧美激情性xxxx欧美| a级大胆欧美人体大胆666| 欧美激情中文字幕一区二区| 久久免费精品视频在这里| 欧美77777免费视频| 日韩成人av网址| 一级毛片视频在线| 东京一区二区| 欧亚精品一区| 中文字幕日韩专区|