文字列型変数から無変換でバイナリファイルへ出力するには

解決


ちゃま  2010-02-04 00:51:57  No: 143200  IP: [192.*.*.*]

環境: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宣言は既存のアプリで使用しているためなるべく変更せず、
取得した文字列からそのまま出力する方法はないでしょうか。

編集    削除
GOD  2010-02-04 03:41:04  No: 143201  IP: [192.*.*.*]

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
とかでどう?

編集    削除
ちゃま  2010-02-04 09:41:15  No: 143202  IP: [192.*.*.*]

GODさんありがとうございます。

恥ずかしながら型違いの宣言方法、VarPtr?など
知らないことだらけで勉強になります。
現地でしか動作確認できないため、明日試してみることにし、
結果を掲示します。

編集    削除
ちゃま  2010-02-05 04:33:37  No: 143203  IP: [192.*.*.*]

GODさんのソースで、無事動作しました。

大変感謝です。

ただちゃんと理解はできていないので、
勉強に励みます。

編集    削除