• ベストアンサー

構造体→文字列→構造体 をする方法

VB6.0の話です。  不特定の構造体を文字列(String)に格納し、これを最初の構造体に戻す事はできませんか?  具体的には「共有メモリを使い構造体を文字列にして格納>別ウインドウで文字列を取得して構造体に戻す」と言う事をやりたいんです。  共有メモリに不特定の構造体をいれる方法でもいいんですが…VALIANTだとサイズが大きすぎて実用性がありませんし、違う主旨の質問をするのも良くないので回答はあくまで「構造体→文字列→構造体 をする方法」と言う事でお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • takasebou
  • ベストアンサー率42% (61/144)
回答No.2

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 などの固定長である必要があります。 以上です。

Chirs_Elfird
質問者

お礼

 CopyMemoryですか。ありがとうございます。まさにこれがほしかったんです。

Chirs_Elfird
質問者

補足

 …やってみたのですが、デバックするとCopyMemoryの時にVBごと落ちてしまいます。構造体のサイズの問題なんでしょうか?

その他の回答 (4)

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.5

こんな感じです。 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

Chirs_Elfird
質問者

お礼

 原理としてはCopyMemoryと同じですよね?なんとなくこっちの方がすっきりしている気はしますけど。  実は、扱う構造体の中はLong型とString型なので、Longが使えるかどうか多少不安だったんですが、これで大丈夫と分かりました。  ありがとうございました。

  • takasebou
  • ベストアンサー率42% (61/144)
回答No.4

#2です。 #3の方が「化けるのでは」? と言われていますので、いちおう補足しておきますね。 これによって化ける事はありません。その為に値渡ししていますので(値渡しする事によって、暗黙の変換を回避しています)。 実際に開発したシステムで、長らく使っていますので問題はないはずです。 ただメモリ操作をするのであれば、バイナリで扱った方が無難なのは確かです。

Chirs_Elfird
質問者

お礼

 やはりバイナリになりますか。ポインタの事は分かっているのでCでなら作れるのですが、VBのポインタがどういう物になるのかが良くわからなくて…まあ、いい訳じみてますが。  やはり、暇を見てバイナリの事は勉強しておきたいです。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.3

回答2と同じく RtlMoveMemory を使うけど、文字列で渡すと 暗黙にUnicode/SJIS変換がされるので、化けるでのでは? やはり、バイナリで渡すべきと思います。

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=250487
Chirs_Elfird
質問者

お礼

 参照まで用意していただいて本当にありがとうございます。  実は、最初の方のレスが来た時にこのスレットは見つけていたんですが…構造体→バイナリ→共有→バイナリ…までは行くんですが、バイナリ→構造体がどうしても出来なくて…

Chirs_Elfird
質問者

補足

 ちなみに、仕様の関係で直接RtlMoveMemoryを使って構造体をファイルマップ上に移すことは出来ないんです。  なので、バイナリなり文字列なりに一度格納する必要が出るのですが…格納できても取り出せないという訳なんです。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

何でバイナリ(byte配列)ではなく文字列? 「構造体→バイナリ→共有メモリ→バイナリ→構造体をする方法」過去ログにあるはずです

Chirs_Elfird
質問者

お礼

 バイナリは正直良く分からないので使いたくなかったのですが…そうした方が効率はいいですよね、やっぱり。  一応過去ログ漁ってみたのですが…具体的にどこの過去ログの事でしょうか?

関連するQ&A