[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マクロがやってる処理と同じです。まあ、そういうもんだと思ってください(^^;
コメント
この書き込みhは大いに参考になりましたが
>Call OSTranslate(intMode , strBuf, Len(strBuf) – 1, strOut, WORDLEN – 1)
ここは
Call OSTranslate(intMode , strBuf, LenBP(strBuf) – 1, strOut, WORDLEN – 1)
ではありませんか?
Posted at 2010/11/10 11:59 PM by 通りすがり
あああああああ、すみません間違ってました! 😳
訂正させていただきました。
ご指摘ありがとうございます!m(_ _)mm(_ _)m
Posted at 2010/11/11 1:14 AM by takenoff
※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。