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を使っている箇所がいくつかあるのだけれど,全廃できそうな気がする.