nlinkを使ってみた.
確かに便利だなぁ.
でも,ハマりどころもある.
世の中で「nlinkスゲー」と絶賛しているブログをいくつか見たけれども,MessageBoxが開けたくらいで絶賛するのは薄っぺらい.LPTSTRで文字列を貰ってくるのはWin32 APIでは定石だけれども,そのやり方を取り上げている例が無い.
nlinkの公式サイトを見ると,StringBuffer/StringBuilder が LPWSTR にコンバートされるとあるのだけれど,これは正しく無い.古い記述なのだろうか.
正しい記述は,ByteBuffer.allocateDirect で領域を確保し,APIによっては,buffer.capacity()をHolder
具体例は,seaserのコードにある.
public static String getComputerName() { ByteBuffer buffer = ByteBuffer .allocateDirect(MAX_COMPUTERNAME_LENGTH + 1); Holder<Integer> holder = new Holder<Integer>(buffer.capacity()); try { kernel32.GetComputerName(buffer, holder); return convertToJavaString(buffer); } catch (Exception ex) { throw new Win32ApiException(ex.getLocalizedMessage()); } }
convertToJavaString() もまた面倒ではあるけれど,それでもなお,敢えて言う.nlinkスゲー.
Eclipseプラグインの形式に包み込んで使ってみたが,特に大きな問題は無いようだ.
PizzaFactoryには,Win32 APIを呼び出す為にJNIを使っている箇所がいくつかあるのだけれど,全廃できそうな気がする.