OSLoadString を使ってみよう

2010年03月21日 23:05

今日はC APIのサンプルとして、OSLoadString を使用したサンプルを呼んでみましょう。
過去の記事が参照したい方は以下のバックナンバーを見てみて下さい。


- バックナンバー -
1. OSLoadProgramを呼んでみるサンプル
2. OSLoadProgramのサンプルを理解する
3. C API はnnotes.dllから呼ばれている
4. 参照渡しか値渡しか
5. 型を変換する
6. 構造体を定義する
7. OSLoadString を使ってみよう

 以前にこのブログでも、Notesのエラーコードからエラーメッセージを得る方法として、Show Messageコマンドを使用して確認する方法を、この記事で紹介しましたが、このようにエラーメッセージからエラーコードを取得する場合、内部的にはOSLoadStringを呼び出します。

宣言などの詳細は今までと同じ考え方なので、C API のリファレンスを見て頂ければ分かると思いますが、今回は固定長のStringを扱うために、「String*256」のように宣言しています。エラーメッセージが必ずしも256文字で収まるとは限らないのですが、このようにして文字列の大きさがあいまいになるのを防いでいます。APIを呼び出す場合はこのような点は過剰なくらいに対応しておかないとすぐに不安定になってしまうので十分に気をつけてください。

次にエラーコードは、余計な値が含まれている場合があるので値をマスクする必要があるのですが、これはC APIでは、ERR() と言うマクロが用意されています。

#define ERR(x) ((STATUS) (x & ERR_MASK))

この処理をエミュレートするために、GetAPIError では以下の処理が加わっています。

MaskedErrCode = errCode And ERR_MASK


単体関数を呼び出す、と言う意味ではあまり進歩の無い例に見えるかも知れないですが,OSLoadString はAPIのエラーをハンドルする場合には必ず必要があるので、使用頻度は意外と高いのではないかと思います。


Declare Function OSLoadString Lib "nnotes.dll" (Byval hModule As Long, Byval StringCode As Long, Byval retBuffer As String, Byval BufferLength As Integer) As Integer
Const ERR_MASK = &H3fff

Sub Click(Source As Button)
HexErr = Inputbox("エラーコードを16進数で入力してください 例: 1A5")
errCode = Val("&H" & HexErr)
Msgbox GetAPIError(Str(errCode))
End Sub

Function GetAPIError(errCode As String) As String
Dim retBuffer As String*256
Dim Buflen As Integer
Dim ErrMsgLen As Integer
Dim StringLen As Long
Dim MaskedErrCode As Long
Dim resultStringLength As Integer

ErrMsgLen = OSLoadString(0, StringCode , retBuffer, Len(retBuffer)-1)
MaskedErrCode = errCode And ERR_MASK
resultStringLength = OSLoadString(0, MaskedErrCode, retBuffer, Len(retBuffer) - 1)
GetAPIError = retBuffer
End Function


以下の記事も参考にしてみてください。

OSLoadString を LotusScript から Call してみよう (Lunatic Sol)
Translating Notes API Errors (nsftools)


コメント

  1. やの | URL | -

    Re: OSLoadString を使ってみよう

    最近、やむなくC API (正確に言うとC++ API)を使っています。WINDOWS7で.NETからNOTESのCOM APIを呼ぶと初期化が必ずエラーになる現象を避けるためです。しかし、パスワードをセッションに渡すAPIがなくて、NOTESを起動してから使ってくださいというわけにもいかず、NOTES.INIに拡張DLLを登録するしか方法がなさそうなので、インストーラーがちと面倒になりそうです。

  2. 長島 広隆 | URL | -

    ありがとうございます

    やのさん

    訪問ありがとうございます。何だか難しそうですね。。。

  3. やの | URL | mQop/nM.

    Re: OSLoadString を使ってみよう

    パスワードを取り扱う拡張モジュールのサンプルがC++のツールキットにあるので、それをもとにしてやれば、方法自体は見えています。レジストリに暗号化してあらかじめ保存しておいたパスワードを、その拡張モジュールが呼ばれた時に渡せばよいと。外部プログラムが起動中かどうかもレジストリ経由で拡張モジュールに渡しておいて、外部プログラムが動いていないことをレジストリの値が示していれば、呼ばれた拡張モジュールは何もしないようにしておけば、通常のログイン処理が動くので、パスワードなしでNotesが起動することもないと。

コメントの投稿

(コメント編集・削除に必要)
(管理者にだけ表示を許可する)

トラックバック

この記事のトラックバックURL
http://hnagasim.blog8.fc2.com/tb.php/317-d7d12ede
この記事へのトラックバック


最新記事