タグ別アーカイブ: WindowsAPI

ipconfigを呼ばないでMACアドレスのリストを取得する

TclからNICのMACアドレスのリストを取得する場合、ipconfig/allの出力から取り出してたけど、Windowsのバージョンやロケールによって出力が変わるものを使うのはどうも気に食わんかったので、ちゃんとそれ用のWindows APIを使いたいと思っていた。
今回twapiを使えばできることが分かったので、メモしておく。

package require twapi
proc getPhysicalAddresses {} {
	set macs {}
	foreach i [twapi::get_netif_indices] {
		set type [twapi::get_netif_info $i -type]
		array set netif [twapi::get_netif_info $i -type -physicaladdress]
		if {$netif(-type) eq "ethernet"} {
			lappend macs [string toupper $netif(-physicaladdress)]
		}
	}
	return $macs
}
puts [getPhysicalAddresses]

ちなみにコマンドプロンプト上ではchcpで932以外のコードページを指定してからipconfigすれば英語の出力になる。
これをTclからもできればよかったんだけど、複数のコマンドをパイプ経由で渡すことはできないようだ。

cmd /c "chcp 437 & ipconfig/all"

というのをexecしたりしても、標準出力を受け取ることができなかった。
一時的にバッチファイルを作り、これを実行してもよいが、美しくない。

そういうわけで、上記のテクニックが今のところ一番いいと思う。

AssocQueryString

AssocQueryStringを使って拡張子に関連付けられた実行ファイルパスを取得するサンプル。
本当はTclで使うからFfidlとかでやりたかったけど、難しかったのでCのコンソールアプリケーションにしました。
勉強のため無駄にUNICODE対応にしています。

使い方は、
assoc_query_string.exe [.extension|extension|file_name.extension|file_path.extension]

拡張子を渡すか、ファイルパスを渡すと、「開く」アクションに関連付けられたEXEのフルパスを標準出力に出力します。

AssocQueryString screenshot
ソースコード: assoc_query_string.zip