LoginSignup
0
1

More than 5 years have passed since last update.

Go言語でSetLocalTime

Posted at

もくてき

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.って書いてあるんですよね(;´∀`)

なので、私がやってみた方法は邪道もいいとこかもしれません。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1