はじめまして。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)))
まず
ReDim byteArea(Len(param))
のparamが何が入ってるのかわかりませんね。
あと
out_paramは
サイズが確定できていないのに
そのままコピーしているのでメモリフォルトを
起こしてるんだと思います。
T_BUF型は、この定義によると、
1,大きさは8bytesである。
2,文字列をあらわす領域へのポインタを2個含んでいる。
ということになりますよね。そのままCopyMemoryでコピーしたら、
得られるのはそのポインタであって、文字列のないようそのもの
ではありませんが、それでいいのでしょうか?
あんさま、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))
とすることで、無事サーバ側の構造体に値を取得することが出来ました。
ツイート | ![]() |