- ベストアンサー
構造体→文字列→構造体 をする方法
VB6.0の話です。 不特定の構造体を文字列(String)に格納し、これを最初の構造体に戻す事はできませんか? 具体的には「共有メモリを使い構造体を文字列にして格納>別ウインドウで文字列を取得して構造体に戻す」と言う事をやりたいんです。 共有メモリに不特定の構造体をいれる方法でもいいんですが…VALIANTだとサイズが大きすぎて実用性がありませんし、違う主旨の質問をするのも良くないので回答はあくまで「構造体→文字列→構造体 をする方法」と言う事でお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
APIを使えば出来ます。 Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (cStr1 As Any, cStr2 As Any, ByVal iLen As Long) 構造体→文字列 Call CopyMemory(strB, ByVal typeA, Len(typeA)) 文字列→構造体 Call CopyMemory(typeA, ByVal strB, Len(typeA)) ただし構造体のメンバに配列があると使えません(VBの配列はメモリを連続してとらない為、メモリーリークします)。 また構造体の中身は string *5 などの固定長である必要があります。 以上です。
その他の回答 (4)
- ARC
- ベストアンサー率46% (643/1383)
こんな感じです。 Private Type typBuff sBuff As String * 6 '12Byte End Type Private mBuff As typBuff Private Type typData a As Long '4Byte b As Long c As Long End Type Private Sub Command1_Click() Dim Dat As typData With Dat .a = 2 .b = 4 .c = 6 End With LSet mBuff = Dat End Sub Private Sub Command2_Click() Dim Dat As typData LSet Dat = mBuff MsgBox Dat.a & "," & Dat.b & "," & Dat.c End Sub Sub
お礼
原理としてはCopyMemoryと同じですよね?なんとなくこっちの方がすっきりしている気はしますけど。 実は、扱う構造体の中はLong型とString型なので、Longが使えるかどうか多少不安だったんですが、これで大丈夫と分かりました。 ありがとうございました。
- takasebou
- ベストアンサー率42% (61/144)
#2です。 #3の方が「化けるのでは」? と言われていますので、いちおう補足しておきますね。 これによって化ける事はありません。その為に値渡ししていますので(値渡しする事によって、暗黙の変換を回避しています)。 実際に開発したシステムで、長らく使っていますので問題はないはずです。 ただメモリ操作をするのであれば、バイナリで扱った方が無難なのは確かです。
お礼
やはりバイナリになりますか。ポインタの事は分かっているのでCでなら作れるのですが、VBのポインタがどういう物になるのかが良くわからなくて…まあ、いい訳じみてますが。 やはり、暇を見てバイナリの事は勉強しておきたいです。
- todo36
- ベストアンサー率58% (728/1234)
回答2と同じく RtlMoveMemory を使うけど、文字列で渡すと 暗黙にUnicode/SJIS変換がされるので、化けるでのでは? やはり、バイナリで渡すべきと思います。
お礼
参照まで用意していただいて本当にありがとうございます。 実は、最初の方のレスが来た時にこのスレットは見つけていたんですが…構造体→バイナリ→共有→バイナリ…までは行くんですが、バイナリ→構造体がどうしても出来なくて…
補足
ちなみに、仕様の関係で直接RtlMoveMemoryを使って構造体をファイルマップ上に移すことは出来ないんです。 なので、バイナリなり文字列なりに一度格納する必要が出るのですが…格納できても取り出せないという訳なんです。
- todo36
- ベストアンサー率58% (728/1234)
何でバイナリ(byte配列)ではなく文字列? 「構造体→バイナリ→共有メモリ→バイナリ→構造体をする方法」過去ログにあるはずです
お礼
バイナリは正直良く分からないので使いたくなかったのですが…そうした方が効率はいいですよね、やっぱり。 一応過去ログ漁ってみたのですが…具体的にどこの過去ログの事でしょうか?
お礼
CopyMemoryですか。ありがとうございます。まさにこれがほしかったんです。
補足
…やってみたのですが、デバックするとCopyMemoryの時にVBごと落ちてしまいます。構造体のサイズの問題なんでしょうか?