Takenoff Labs

Lotus Notes/Domino に関する Tips や、クラシックの名曲などを紹介します

[Notes/Domino] 設計解析講座: LMBCS、エラーメッセージの取得

LMBCS は、海外のコードをパクった場合にわりとハマりやすいところです(外人さんはマルチバイトを意識していない人が多いので)。API では必ずと言ってよいほど登場しますので、おさえておいてください。

LMBCS とは

LMBCS とは、Lotus Multi-Byte Character Set の略で、ノーツ内部での文字コード処理・保管形式のことです。ものすごく簡単に言えば、Shift_JIS の文字のうち、ダブルバイト文字の場合は「0x10」を1つ、半角カナの場合は「0x10」を2つ付加したものです。

たとえば、「TESTてすとテスト」という文字が入った CDTEXT 構造体をバイナリダンプすると、以下のようになります。(始めの8バイトは、今は気にしないでください。バイナリダンプするツール(管理人作)については、この連載のどこかで紹介する予定です。)

85 FF 1E 00 01 00 00 0A 54 45 ........TE
53 54 10 82 C4 10 82 B7 10 82 ST........
C6 10 10 C3 10 10 BD 10 10 C4 ..........

赤字の箇所が「TEST」、青字が「てすと」、緑字が「テスト」のデータの16進値です。「TEST」はそのまま、「てすと」は「0x10」が1つずつ付加され、「テスト」は「0x10」が2つずつ付加されているのがわかりますね。

ちなみに、漢字の種類などによっては「0x10」以外の文字コードが付加される場合があります。詳しくは、長島さんの詳細な説明を参照してください。(得意の丸投げ

API 関数と文字列をやり取りする場合、ほとんどの場合 LMBCS とネイティブコードを変換する必要がありますので、注意してください。

LMBCS ⇔ ネイティブコード 変換関数

LMBCS とネイティブコードを相互変換する API 関数は、OSTranslate です。OSTranslate を呼び出す LotusScript コードは、以下のような感じです。

Public Const WORDLEN = 65534

Public Const OS_TRANSLATE_NATIVE_TO_LMBCS = 0
Public Const OS_TRANSLATE_LMBCS_TO_NATIVE = 1

Declare Function OSTranslate Lib "nnotes.dll" (Byval TranslateMode As Integer, _
Byval InData As String, Byval InLength As Long, Byval OutData As String, _
Byval OutLength As Long) As Integer

Public Function APITranslate(Byval intMode As Integer, Byval strBuf As String) As String
    Dim strOut As String

    strOut = Space$(WORDLEN)
    Call OSTranslate(intMode , strBuf, LenBP(strBuf) - 1, strOut, WORDLEN - 1)
    APITranslate = Strleft(strOut & Chr(0), Chr(0))
End Function

ネイティブコードから LMBCS に変換する場合は以下のようにし、

strRet = APITranslate(OS_TRANSLATE_NATIVE_TO_LMBCS, strSrc)

LMBCS からネイティブコードに変換する場合は、以下のようにすればよいです。

strRet = APITranslate(OS_TRANSLATE_LMBCS_TO_NATIVE, strSrc)

エラーメッセージの取得

では、早速変換関数を使ってみましょう。API 関数は STATUS(WORD)型のエラーコードを返すものが多くありますが、このエラーコードからエラーメッセージを返す関数は、以下のとおりです。

'・・・APITranslate関数は略

Declare Function OSLoadString Lib "nnotes.dll" (Byval hModule As Long, Byval StringCode As Long, _
Byval retBuffer As String, Byval BufferLength As Integer) As Integer

Public Function APIGetError(Byval intErrCode As Integer) As String
    Dim strIn   As String
    Dim strOut  As String
    Dim intCode As Integer

    strIn  = Space$(255)
    strOut = Space$(255)

    intCode = intErrCode And &h3FFF
    Call OSLoadString(0, intCode, strIn, LenBP(strIn) - 1)

    strOut = APITranslate(OS_TRANSLATE_LMBCS_TO_NATIVE, strIn)

    APIGetError = Trim(strOut)
End Function

「intErrCode And &h3FFF」のところがよくわからないかもしれませんが、これは上位2ビットを取り除く、という意味です。ERRマクロがやってる処理と同じです。まあ、そういうもんだと思ってください(^^;

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
読み込み中...

Navigation

トラックバック

トラックバックはありません

コメント

この書き込みhは大いに参考になりましたが
>Call OSTranslate(intMode , strBuf, Len(strBuf) – 1, strOut, WORDLEN – 1)

ここは
Call OSTranslate(intMode , strBuf, LenBP(strBuf) – 1, strOut, WORDLEN – 1)

ではありませんか?

あああああああ、すみません間違ってました! 😳
訂正させていただきました。

ご指摘ありがとうございます!m(_ _)mm(_ _)m

※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。





(以下のタグが使えます)
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

For spam filtering purposes, please copy the number 4781 to the field below:

^
×