Contactお問い合わせ
お気軽にお問い合わせください。
32 ビット版 Visual Basic (Ver4.0, Ver5.0, Ver6.0) から Btrive API を扱う際の注意事項を説明します。
はじめに、ポジションブロックとは何か、を理解する必要があります。
ポジションブロックとは、マニュアルにこう記載されています。
「ポジションブロックパラメータは、128 バイト配列のアドレスで、ファイル I/O 構造体や、Open (0) オペレーションに関連するポジショニング情報を格納するために使用されます。アプリケーションでファイルをオープンするたびに、それぞれの Open オペレーションに対して重複のないポジションブロックを割当てる必要があります。
アプリケーションが Open オペレーションを実行するとき、ポジションブロックが初期化されます。さらにファイルオペレーションの実行に伴い、Btrieve はこのポジションブロックを参照して更新します。このためアプリケーションでは、ファイルに対する一連の Btrieve オペレーションに対して同じポジションブロックを指定する必要があります。
【注意】ポジションブロックへの書き込みは行わないでください。書き込みを行ってしまうと、ポジション喪失エラー、その他のエラー、あるいはファイルの損傷などの原因になります。
ポジションブロックは Btrieve が内部的に使用するもので、アプリケーションプログラマは、128 バイトの連続したメモリ領域を確保(変数として宣言)して Btrieve に渡した後は、書き込みを行ってはいけない、ということです。
またポジションブロックの内容は、文字列ではなくバイナリのデータです。
一方マイクロソフトの技術文書には次の記述があります。
「Visual Basic (32ビット) 内部では文字コードとして Unicode が使用されています。Unicode では半角、全角のどちらの文字であっても 1 文字あたり 2 バイト使用します。(中略)ファイル入出力や DLL への引数の受け渡しの際に、文字列変数の内容は Unicode と ANSI コード及び Shift JIS コード間での変換が行われます。バイナリデータを文字列変数に格納すると変換により日本語文字列として認識できないコードは削除され、正しく動作しなくなりますので、バイト型(Byte) 変数及びバイト型配列を使用してください。」
以上ふたつのことから、32 ビット版 Visual Basic で Btrive API を使う場合は、ポジションブロックを文字列型の変数ではなく、バイト型配列で宣言しなければいけない、ということをご理解いただけると思います。
具体的には、
Dim Posblock As Stringまたは、
Dim Posblock As String * 128 ではなく、
Dim Posblock(0 To 127) As Byte としなければなりません。
もちろん外部プロシージャへの参照宣言部分や、その呼び出し個所もあわせて修正する必要があります。
Declare Function BTRCALL Lib “w3btrv7.dll” ( _
ByVal Operation As Integer, _
Posblock As Byte, _
Databuffer As Any, _
Databuflen As Long, _
Keybuffer As Any, _
ByVal Keybuflen As Integer, _
ByVal Keynum As Integer _
) As Integer
Status = BTRCALL(Operation:=BOPEN, _
Posblock:=SamplePosBlk.buffer(0), _
Databuffer:=SampleRecordBTR, _
Databuflen:=LenB(SampleRecordBTR), _
Keybuffer:=ByVal SampleKeyBuf, _
Keybuflen:=SampleKeyBufLen, _
Keynum:=SampleKeyNum)