謹賀新年

遅くなりましたがあけましておめでとうございます。
お正月はゲームをしてました。ずいぶん前に買って放置していた「東方緋想天」と「東方地霊殿」をやってたんですけど、どっちもすごく難しいですね。PlayStation2のコントローラを使っているのですが、左手の親指が痛くなるまでやってました。それでも地霊殿はグッドエンディングすら見ていません;)

さて、エラーが発生した時にWindowsではエラーダイアログを出した方が親切と言うことがあります。ところがSDLにはダイアログのようなリッチなコンポーネントは用意されていません。そこで強引にWindows APIのMessageBoxを呼んでやることにしました。
SDLは結構前にも使ったことがあったのですが、Windows APIって使ったことなかったので間違ったこと書いてたらごめんなさい。

import tango.sys.win32.UserGdi;
import tango.sys.win32.CodePage;

void main() {
  try {
    
    // ここでなんかいろんな処理
    
  } catch (Exception e) {
    char[] message = e.toString();

    char[] convertedMessage;
    // 変換済みの文字列の長さは変換前の文字列の長さの倍くらいあれば(ほとんどの場合)大丈夫
    convertedMessage.length = message.length * 2;
    CodePage.into(message, convertedMessage);
    MessageBoxA(null, cast(char*)convertedMessage, "Error", MB_OK | MB_ICONEXCLAMATION);
    
    throw e;
  }
}

ユニコードは全然詳しくないのでMessageBoxWを使った方がいいのかもしれないんですけど、それ以上にWindowsに詳しくないので「大体どれでも動く」MessageBoxAの方がいいのかなと思ったんですがどうなんでしょうね。