カテゴリーアーカイブ Go

著者:杉浦

【Go】DLLを読み書きする

 DLL(Dynamic Link Library)はWindowsのOSに近い階層で動作するバイナリアプリです。Libraryとある様に他のプログラムに使われることが意識されています。この他のプログラムの範囲にDLL外のプログラムも含まれている点で独特です。
ダイナミックリンクライブラリ – Wikipedia
DLL とは
 DLLを読むことは多くの言語でできるようです。少なくともJavaScript、PHP、Python、Go言語で可能です。作る方はどうにも少ないようです。この記事ではGo言語でDLLを作成する方法も紹介します。
 読み込みはsyscallパッケージを用います。言語開発者がさじを投げて仕切り直そうとしている部分ですが、とりあえず今動かしてHello Worldするぐらいならできます。
 syscall – The Go Programming Language
 src/syscall/dll_windows.go – The Go Programming Language
 読み込みは次の様にできます。ただ実行するだけでちょっと面倒なのでラッピングした方が便利そうです。


package main

import (
	"fmt"
	"syscall"
)

func main() {
	// 好きなdllを指定
	dll := syscall.MustLoadDLL("Hoge.dll")
	// この関数が終わった時にDLLをメモリから解放
	defer dll.Release()
	// dll中の関数を呼び出し
	proc := dll.MustFindProc("FugaFuga")
	// 引数はuintptr型に変換
	buffer := []byte("Hello World\x00")
	arg := uintptr(unsafe.Pointer(&buffer[0]))
	// 結果を取得. 返り値は(r1, r2 uintptr, lastErr error)
	r, _, _ := proc.Call(arg)
	// 結果を表示
	fmt.Println(r)
}

 書き込みは色々と方法があるようです。一つのやりかたはC言語になりきることです。C言語のコンパイラを利用してGo言語をDLLを作ることができます。


package main

import "C"

// ↓のコメントはDLLのためのデコレータ

//export GetRouteFilename
func GetRouteFilename() int {
	// DLL内で実行される関数の中身
	msg := []byte("Hello World")
	println(msg)
	return 0
}

func main() {
	// main()がないとバグる
}

 これを次のコマンドでコンパイルするとDLLが作られます。

go build -buildmode=c-shared  -o godll.dll godll.go
  • この記事いいね! (0)
著者:杉浦

【Go】Go言語ことはじめ

Goは、シンプルで信頼性の高い効率的なソフトウェアを簡単に構築できるオープンソースのプログラミング言語です。
The Go Programming Language

 Go言語はC言語の様なコンパイルの必要な静的言語でとても高速で軽量な動作ができます。Go言語は記述の簡易さとパフォーマンスの両面を上げることを目的の一つとして作成されました。
 とりあえずコーディングを試すなら公式にオンラインエディタとそれ用の実行環境が置いてあります。
 
 ローカルにおけるGoの実行環境の作成は公式サイトに行って実行ファイルをダウンロードするだけです。windowsならインストーラを起動すればPATHも通してくれます。

 手軽に手元で試すエディタにはVSCodeがおすすめです。無料ですしGoでググって上位に出てくるプラグインを入れればそれなりに機能がそろいます。
 ソースコードの置き場にいきなり気にするようなルールはありませんでした。コンパイル後の実行ファイルがソースコードの配置場所でなくgoコマンドを実行したカレントディレクトリ直下にできることには注意です。
 コードは*.goであれば動作します。例えば次です。

package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello, World")
}

 とりあえずすぐに使うコマンドはgo run [ファイル名], go buildの二つでOKです。go runは指定したファイルを元にファイルをコンパイル、実行します。go buildは自動で対象を探してコンパイルをします。go buildはpackage名と同名の関数がないと動きません。go runはファイルの中にmain関数がないと動きません。package mainのmain関数を用意するのがよいです。go runするかコンパイルされた実行ファイルを実行するとHello, Worldが表示されます。

 Goの公式は何かと充実しています。Pythonを思い出す豊富な組み込みパッケージについても次のリンクに実例付きで網羅されています。
Packages – The Go Programming Language
 他にもGoコマンドに始まり、エディタ、ソースコードの書き方にまで言及してきます。公式の各ページにはサムネにあるGo言語マスコットであるgopherくんが至る所に変わった形でいて飽きさせません。

  • この記事いいね! (0)