winsockを使用して、文字列と数値を送受信するには?

解決


ぼぼ  2002-06-13 14:59:51  No: 104370  IP: [192.*.*.*]

初めて質問させていただきます。

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 に格納したデータ全部をまるごと送信する
ことはできないのでしょうか?

ヘルプ等を調べてみたのですが載っていませんでした。
超初心者です。申し訳ありませんが教えてください。
よろしくお願いします。

編集 削除
YuO  2002-06-13 22:16:54  No: 104371  IP: [192.*.*.*]

エラーメッセージを見る限り,PrivateをPublicにすればよさそうな気が……。

編集 削除
ぼぼ  2002-06-17 09:21:47  No: 104372  IP: [192.*.*.*]

リプライ遅れてすいません。

Public Type S_SENDMSG
としてやってみましたが、同じエラーが出力されます。
標準モジュール(*.bas)に定義していますが、定義場所が違う、又は
他に何か記述しなくてはならないのでしょうか?
winsock.sendata にはユーザ定義型は使用できないってことはありますか?
申し訳ありません。教えてください。

編集 削除
けみ  2002-06-17 10:50:08  No: 104373  IP: [192.*.*.*]

いったんバイト配列にコピーしてみてはどうでしょう。

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

この辺が絡んでくるので使えないとか。。。予想です。

編集 削除
けみ  2002-06-17 11:19:18  No: 104374  IP: [192.*.*.*]

上記アドレスはwinsockとは直接関係ありません。
参考ということで。

編集 削除
ぼぼ  2002-06-17 13:07:55  No: 104375  IP: [192.*.*.*]

提示していただいた参考ページを読んで、
私のやろうとしたことはバイトアライメントの関係でできないことが
わかりました。バイト配列にコピーして行います。
ありがとうございました。
大変参考になりました。

編集 削除