初めて質問させていただきます。
winsock コントロールを使用して、TCP/IPでデータの送受信をしたいのですが、
送信したいデータは以下のように文字列と数値の混合した型になっています。
Private Type S_SENDMSG '標準モジュールに定義
MojiA As String * 4
Num As Long
MojiB As String * 8
End Type
文字は文字列として、数値はバイナリデータとして送信したいのですが、
Dim sendmsg As S_SENDMSG
Winsock1.SendData sendmsg
とすると、
「パブリック オブジェクト モジュールで定義されたパブリック ユーザー定義型に
限り、クラス モジュール内のパブリック プロシージャの引数または戻り値、
またはパブリック ユーザー定義型の要素として使用することができます。」
というエラーが発生します。
Winsock1.SendData sendmsg.MojiA
とするとうまくいきますが、sendmsg に格納したデータ全部をまるごと送信する
ことはできないのでしょうか?
ヘルプ等を調べてみたのですが載っていませんでした。
超初心者です。申し訳ありませんが教えてください。
よろしくお願いします。
エラーメッセージを見る限り,PrivateをPublicにすればよさそうな気が……。
リプライ遅れてすいません。
Public Type S_SENDMSG
としてやってみましたが、同じエラーが出力されます。
標準モジュール(*.bas)に定義していますが、定義場所が違う、又は
他に何か記述しなくてはならないのでしょうか?
winsock.sendata にはユーザ定義型は使用できないってことはありますか?
申し訳ありません。教えてください。
いったんバイト配列にコピーしてみてはどうでしょう。
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Dim bt(0 To 15) As Byte
Dim sendmsg As S_SENDMSG
CopyMemory bt(0), sendmsg , 15
Winsock1.SendData bt
ただしバイトアライメントの問題もあるようなので注意が必要です。
http://www.pervasive.co.jp/support/Ref/sup_0015.html
この辺が絡んでくるので使えないとか。。。予想です。
上記アドレスはwinsockとは直接関係ありません。
参考ということで。
提示していただいた参考ページを読んで、
私のやろうとしたことはバイトアライメントの関係でできないことが
わかりました。バイト配列にコピーして行います。
ありがとうございました。
大変参考になりました。
ツイート | ![]() |