go 調用windows dll 的方法

来源:https://www.cnblogs.com/echojson/archive/2019/04/21/10743636.html
-Advertisement-
Play Games

go 調用windows dll 的方法 ,代碼如下: ...


go 調用windows dll 的方法 ,代碼如下:

 

package main
import (
	"fmt"
	"syscall"
	"time"
	"unsafe"
)

const (
	MB_OK                = 0x00000000
	MB_OKCANCEL          = 0x00000001
	MB_ABORTRETRYIGNORE  = 0x00000002
	MB_YESNOCANCEL       = 0x00000003
	MB_YESNO             = 0x00000004
	MB_RETRYCANCEL       = 0x00000005
	MB_CANCELTRYCONTINUE = 0x00000006
	MB_ICONHAND          = 0x00000010
	MB_ICONQUESTION      = 0x00000020
	MB_ICONEXCLAMATION   = 0x00000030
	MB_ICONASTERISK      = 0x00000040
	MB_USERICON          = 0x00000080
	MB_ICONWARNING       = MB_ICONEXCLAMATION
	MB_ICONERROR         = MB_ICONHAND
	MB_ICONINFORMATION   = MB_ICONASTERISK
	MB_ICONSTOP          = MB_ICONHAND

	MB_DEFBUTTON1 = 0x00000000
	MB_DEFBUTTON2 = 0x00000100
	MB_DEFBUTTON3 = 0x00000200
	MB_DEFBUTTON4 = 0x00000300
)

func abort(funcname string, err syscall.Errno) {
	panic(funcname + " failed: " + err.Error())
}

var (
	//    kernel32, _        = syscall.LoadLibrary("kernel32.dll")
	//    getModuleHandle, _ = syscall.GetProcAddress(kernel32, "GetModuleHandleW")

	user32, _     = syscall.LoadLibrary("user32.dll")
	messageBox, _ = syscall.GetProcAddress(user32, "MessageBoxW")
)

func IntPtr(n int) uintptr {
	return uintptr(n)
}

func StrPtr(s string) uintptr {
	return uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(s)))
}

func MessageBox(caption, text string, style uintptr) (result int) {
	ret, _, callErr := syscall.Syscall9(messageBox,
		4,
		0,
		StrPtr(text),
		StrPtr(caption),
		style,
		0, 0, 0, 0, 0)
	if callErr != 0 {
		abort("Call MessageBox", callErr)
	}
	result = int(ret)
	return
}

//func GetModuleHandle() (handle uintptr) {
//    if ret, _, callErr := syscall.Syscall(getModuleHandle, 0, 0, 0, 0); callErr != 0 {
//        abort("Call GetModuleHandle", callErr)
//    } else {
//        handle = ret
//    }
//    return
//}

// windows下的另一種DLL方法調用
func ShowMessage2(title, text string) {
	user32 := syscall.NewLazyDLL("user32.dll")
	MessageBoxW := user32.NewProc("MessageBoxW")
	MessageBoxW.Call(IntPtr(0), StrPtr(text), StrPtr(title), IntPtr(0))
}

// windows下的第三種DLL方法調用
func ShowMessage3(title, text string) {
	user32,_ := syscall.LoadDLL("user32.dll")
	MessageBoxW,_ := user32.FindProc("MessageBoxW")
	MessageBoxW.Call(IntPtr(0), StrPtr(text), StrPtr(title), IntPtr(0))
}

func main() {
	//    defer syscall.FreeLibrary(kernel32)
	defer syscall.FreeLibrary(user32) //釋放指定的動態鏈接庫

	ShowMessage2("windows下的另一種DLL方法調用", "HELLO !")

	ShowMessage3("windows下的第三種DLL方法調用", "HELLO3 !")

	//fmt.Printf("Retern: %d\n", MessageBox("Done Title", "This test is Done.", MB_YESNOCANCEL))
	num := MessageBox("Done Title", "This test is Done.", MB_YESNOCANCEL)
	fmt.Printf("Get Retrun Value Before MessageBox Invoked: %d\n", num)

	time.Sleep(3 * time.Second)
}

func init() {
	fmt.Print("Starting Up\n")
}

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Spring Boot 2.0 升級指南 前言 Spring Boot已經發佈2.0有5個月多,多了很多新特性,一些坑也慢慢被填上,最近有空,就把項目中Spring Boot 版本做了升級,順便整理下升級的時候遇到的一些坑,做個記錄。後續的教程就以最新的2.03版本為主。參考官方文檔翻譯 在你開始之 ...
  • 本文將從簡單的場景引入, 逐步優化, 最後給出具體的責任鏈設計模式實現. 場景引入 首先我們考慮這樣一個場景: 論壇上用戶要發帖子, 但是用戶的想法是豐富多變的, 他們可能正常地發帖, 可能會在網頁中淺入html代碼, 可能會使用錯誤的表情格式, 也可能發送一些敏感信息. 作為論壇的管理員必須對用戶 ...
  • SSO 單點登錄:一次登錄,處處登錄。 只需在一個登錄認證服務下進行登錄後,就可訪問所有相互信任的應用 同域 SSO 1. session-cookie機制:服務端通過cookie認證客戶端。 用戶第一次登錄後,服務端將返回一個cookie給客戶端(這個cookie包含session id),用戶下 ...
  • 之前已經帶大家稍微入門了工廠模式(即簡單工廠模式)的方法,沒看過的朋友可以移步去查看一番。 "設計模式之工廠模式(一)" 。今天我們繼續吃著披薩,學習著工廠模式的接下來部分吧。 加盟披薩店 我們先前的披薩店已經經營有成,擊敗了部分競爭者,接下來的計劃就是開加盟店。作為經營者,你肯定希望確保加盟店運營 ...
  • 依賴倒置原則DIP(Dependence Inversion Principle) 依賴倒置原則的含義 高層模塊不能依賴低層模塊,二者都應該依賴其抽象。 抽象不應該依賴於細節。 細節應該依賴抽象。 什麼是 高層模塊?低層模塊 ? 每一個原子邏輯就是低層模塊,原子邏輯再組就是高層模塊。 什麼是 抽象和 ...
  • //javascript代碼 $$(".bb").addEvent('change',function(e){ var order_item_id = this.get('order_item_id'); var product_name= this.value; new Request.JSON(... ...
  • AQS 概述 AQS(隊列同步器,AbstractQueuedSynchronizer),是用來構建鎖或其他同步組件的核心基礎框架(比如 ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch) AQS的底層結構是:一個整型變數st ...
  • 你是否想過生成一份屬於你的微信個人數據報告,瞭解你的微信社交歷史。現在,我們基於python對微信好友進行全方位數據分析,包括:昵稱、性別、年齡、地區、備註名、個性簽名、頭像、群聊、公眾號等。 其中,在分析好友類型方面,主要統計出你的陌生人、星標好友、不讓他看我的朋友圈的好友、不看他的朋友圈的好友... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...