見出し画像

Notes C API探訪: 初期化時のエラーメッセージについて

Notes C APIをスタンドアロンプログラムで動作させるには、他の関数に先んじてNotesInitExtended関数を実行させる必要があります。そのNotesInitExtended関数は、実行に失敗するとSTATUS値を返します。そのSTATUS値を人間が読めるメッセージに変換できれば伝わりやすいですよね。

ところが、肝心の変換関数OSLoadStringで実行に失敗し、先に進めなくなります。

この原因は、OSLoadStringを実行する前にNotesInitExtended関数を実行しなければいけないものだと思っていました。でもNotesInitExtended関数が返すSTATUSをOSLoadStringで文字列化できないのは、なんだか矛盾しているなあとぼんやり思っていました。

実は最近、「OS」が頭に付く関数は、APIを初期化していなくても使えることがあることに気付きました。例えば、OSGetEnvironmentStringやOSGetDataDirectoryのような、環境変数や実行環境に関する情報は、API初期化前に使えます。まあ、本来使えて当然なんですが。また、文字セット変換用のOSTranslate関数も使えます。

この論理で行くと、OSLoadStringも使えるはずです。では、なぜAPI初期化前に使うと実行に失敗するのか。OSLoadStringは何か特別なのか?
これには一つの推測が立てられます。OSLoadStringでNotes/Domino由来のエラー文字列をロードするには、モジュールハンドル引数をNULLHANDLEにします。これでNotes/Domino由来のエラー文字列を検索するわけですが、API初期化前で、各種モジュールがロードされる前にそもそもできないのではないか、「OSLoadStringは使えるが、引数NULLHANDLEがダメ」ということではないかと思っています。

まとめ

NULLHANDLEがダメなら、エラー文字列が格納されているDLLを探して、OSLoadLibrary関数でモジュールハンドルを取得して、それでOSLoadStringを使うこともできそうですが、そこまでするなら単に、NotesInitExtended関数の戻り値がNOERRORでないことを確認して、「初期化に失敗したよ」と伝えて終わればいい・・・というお話でした。

加えて、NotesInitExtended関数実行前でも、OSが頭に付く関数は、すべてを確認したわけではないですが、使える確率が高いことだけでも知っておいて損はないでしょう。

この記事が気に入ったらサポートをしてみませんか?