OSLoadString を使ってみよう
今日は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のエラーをハンドルする場合には必ず必要があるので、使用頻度は意外と高いのではないかと思います。
以下の記事も参考にしてみてください。
OSLoadString を LotusScript から Call してみよう (Lunatic Sol)
Translating Notes API Errors (nsftools)
過去の記事が参照したい方は以下のバックナンバーを見てみて下さい。
- バックナンバー -
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)
コメント
Re: OSLoadString を使ってみよう
2010-03-23 09:19 やの URL 編集
ありがとうございます
訪問ありがとうございます。何だか難しそうですね。。。
2010-03-28 22:29 長島 広隆 URL 編集
Re: OSLoadString を使ってみよう
2010-03-29 10:11 やの URL 編集