もくてき
Golangで時刻同期に関連するプログラムを作成している時に、コンピュータの時刻を変更したかったんですが、windows環境のsyscallにはどうやらSettimeofday()が無いようなんですね。
WindowsのAPI的にはSetLocalTime()とSetSystemTime()なのですが、そのどちらも実装されてなさげでした。
そもそもGettimeofday()の方はともかく、Settimeofday()をWindowsで使うなんて需要はあんまりないのかなぁ?と思いつつ、DLLから関数呼ぶ練習ということで、SetLocalTime()を実装してみました。
作ってみたもの
やったこと
"golang.org/x/sys/windows"をimportして、↓のように書いてあげるとAPIの情報を得られます。
modkernel32 = windows.NewLazySystemDLL("kernel32.dll")
procSetLocalTime = modkernel32.NewProc("SetLocalTime")
syscall.Syscall()にprocSetLocalTime.Addr()と、適切な引数を渡してあげると、APIを使えました。
この時の適切な引数は、MSDN等で調べて合わせてあげる必要があります。
r0, _, e1 := syscall.Syscall(procSetLocalTime.Addr(), 1, uintptr(unsafe.Pointer(st)), 0, 0)
今回はSetLocalTime()なので、SetLocalTime function (MSDN)に書いてある通りの形で、引数はSYSTEMTIME structure (MSDN)と同じ形にしたものを渡してます。
参考にしたページ
今回は、syscallのsourceを参考にしました。
作り終えた後に気がついたのですが、Code generated by 'go generate'; DO NOT EDIT.って書いてあるんですよね(;´∀`)
なので、私がやってみた方法は邪道もいいとこかもしれません。