VB6で構造体の中身をByte変数にコピーおよびその逆を行う方法について

解決


かつお33  2006-01-04 09:59:42  No: 93459

はじめまして。VB初心者です。
VB6で構造体の中身をByte変数にコピーおよびその逆を行う方法についてご教授頂きたくお願いいたします。WindowsAPIのCopyMemoryを使用すれば可能と
いうところまではたどりついたのですが。

例を以下に示します。コピー元および復元用に構造体を定義し、バイト型の変数を一つ定義します。
動作させますと、変数の内容を構造体にコピーするところで、実行時エラー'458'が出てしまいます。

よろしくお願いいたします。

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (destination As Any, source As Any, ByVal length As Long)

Type T_BUF
    ID     As String
    NAME   As String
End Type

Dim inn_param as T_BUF
Dim out_param as T_BUF
Dim byteArea() As Byte

inn_param.ID="1"
inn_param.NAME="TARO"

'構造体の内容を変数にコピーします。
ReDim byteArea(Len(param))
Call CopyMemory(byteArea(0), inn_param, LenB(inn_param))

'変数の内容を構造体にコピーします。
Call CopyMemory(out_param, byteArea(0), LenB(ByteArea(0)))


あん  2006-01-04 19:59:38  No: 93460

まず
ReDim byteArea(Len(param))
のparamが何が入ってるのかわかりませんね。
あと
out_paramは
サイズが確定できていないのに
そのままコピーしているのでメモリフォルトを
起こしてるんだと思います。


K.J.K.  2006-01-04 21:30:01  No: 93461

T_BUF型は、この定義によると、
1,大きさは8bytesである。
2,文字列をあらわす領域へのポインタを2個含んでいる。
ということになりますよね。そのままCopyMemoryでコピーしたら、
得られるのはそのポインタであって、文字列のないようそのもの
ではありませんが、それでいいのでしょうか?


かつお33  2006-01-06 21:19:05  No: 93462

あんさま、K.J.Kさま

ご教授いただき誠に有難うございます。お蔭様で、皆様のご指導のもと、何とか解決いたしました。
もう少し詳細を記載させて頂きたく思い思います。やりたいことは、HTTPのクライアント、サーバ間の通信で
クライアントから送付したいデータをバイナリとしてHTTPのコンテンツとして
送信し、サーバ側でバイナリとして受信したいということです。
どこかのページで、構造体中の文字列を固定長として定義する必要があると
いう記載を見つけましたので、以下のように先般のコードを変更をしています。

VBのクライアント側のコードを以下のしめさせて頂きます。

Private Const HeadStr As String = "Content-Type: application/x-www-form-urlencoded"

Type T_BUF
    ID     As String * 16
    NAME   As String * 16
End Type

Dim inn_param as T_BUF
Dim byteArea() As Byte

inn_param.ID="1"
inn_param.NAME="TARO"

'構造体の内容を変数にコピーします。
'送信するデータをバイト列にコピーする
ReDim byteArea(Len(inn_param) - 1)
Call CopyMemory(byteArea(0), inn_param, Len(inn_param))
    
'APIの実行/リクエストを送信
Call HttpSendRequest(lngReqHnd _
                       , HeadStr _
                       , Len(HeadStr) _
                       , byteArea(0) _
                       , Len(inn_param))

このクライアントプログラムからは、正常に送信させているようです。

サーバ側ですが、
Dim I_Param as T_BUF
Dim InputHandle As Long
Dim PostBuf() As Byte
Dim ReadingByte As Long
Dim ContentLength As Long

ReDim PostBuf(ContentLength - 1)
ReCode = ReadFile(InputHandle, PostBuf(0), ContentLength, ReadingByte, ByVal 0&)

Call CopyMemory(I_Param, PostBuf(0), Len(I_Param))

とすることで、無事サーバ側の構造体に値を取得することが出来ました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加