環境:VB6 SP5
数日間にかけて過去ログを参照し寄せ集めのコードで試行錯誤しましたが、
PG歴も浅く解決には至らず・・・。ご教授いただきたいです。
やりたいことは、
テープ(CMT)に書かれているEBCDICコードのデータを読み出し、
バイナリレベルで同じ状態でファイルへ出力したいのです。
テープ装置からデータを抜き出す術はハードに添付のdllを使用しており、
String型で得ることができます。
取得した文字列をそのままBinaryモードでファイル出力をすると
そのままではなくなり、バイト型?を頼りにいろいろ試しましたが、
お手上げ状態です。
以下ソースの抜粋です。
'DLL宣言部
'パラメータ:
'unsigned char mtid; … 装置番号
'const char *buff; … メモリアドレス
'unsigned short *count; … リードバイト数
'unsigned long bufflen; … データバッファサイズ
Public Declare Function mtrblock Lib "HOGE.DLL" _
(ByVal MtId As Integer, ByVal buff As String, count As Integer, ByVal bufflen As Long) As Long
'-----------------------------------------------------------
'変数宣言部
Public mt_buffer As string * 32000
Public mt_count As Integer
Public mt_bufflen As Long
Public mt_rtn As Long
'
'前半はテープ装置を使う前処理など
mt_rtn = mtrblock(1 , mt_buffer , mt_count , mt_bufflen)
'上記でmt_bufferにEBCDICコードのまま取得
'以降の処理で試行錯誤するも解決せず
Dim バイト配列 As Byte
'バイト配列 = mt_buffer ←変換なしだと全く違う結果になる
バイト配列 = StrConv(mt_buffer , vbFromUnicode)
Open outFileName For Binary As #1
Put #1, , バイト配列
Close #1
結果はまったく違うわけではありませんが、
例えば以下のような差異が
B5 5C E5 0C 48 00(テープ内の元ファイル)
B5 5C 81 45 48 00(出力ファイル)
dllのDecrare宣言は既存のアプリで使用しているためなるべく変更せず、
取得した文字列からそのまま出力する方法はないでしょうか。
Public Declare Function mtrblockB Lib "HOGE.DLL" Alias "mtrblock" _
(ByVal MtId As Integer, ByVal buff As Long, count As Integer, ByVal bufflen As Long) As Long
mt_bufferB() As Byte
ReDim mt_bufferB(mt_bufflen - 1)
mt_rtn = mtrblockB(1, VarPtr(mt_bufferB(0)), mt_count, mt_bufflen)
Open outFileName For Binary As #1
Put #1, , mt_bufferB
Close #1
とかでどう?
GODさんありがとうございます。
恥ずかしながら型違いの宣言方法、VarPtr?など
知らないことだらけで勉強になります。
現地でしか動作確認できないため、明日試してみることにし、
結果を掲示します。
GODさんのソースで、無事動作しました。
大変感謝です。
ただちゃんと理解はできていないので、
勉強に励みます。