AG-TECH CORPAG-TECH CORP

ENGLISH

32 ビット版Visual Basic
使用時におけるポジションブロックの扱い

32 ビット版Visual Basic (Ver4.0, Ver5.0, Ver6.0) からBtriveAPI
はじめに、ポジションブロックとは何か、を理解する必要があります。
ポジションブロックとは、マニュアルにこう記載されています。

 「ポジションブロックパラメータは、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でBtriveAPIを使う場合は、ポジションブロックを文字列型の変数ではなく、バイト型配列で宣言しなければいけない、ということをご理解いただけると思います。

具体的には、

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)

Contactお問い合わせ

お気軽にお問い合わせください。

お問い合わせ
必須会社名

個人のお客様は「個人」と入力してください。

必須お名前
必須メールアドレス
必須メールアドレス(確認)
必須ライセンス ありなし
ダウンロード目的