教えて!gooグレードポイントがdポイントに!

VB6.0の話です。

 不特定の構造体を文字列(String)に格納し、これを最初の構造体に戻す事はできませんか?

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

教えて!goo グレード

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

以上です。

この回答への補足

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

補足日時:2004/11/17 10:15
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/11/16 19:47

こんな感じです。



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
    • good
    • 2
この回答へのお礼

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

お礼日時:2004/11/17 09:08

#2です。



#3の方が「化けるのでは」? と言われていますので、いちおう補足しておきますね。

これによって化ける事はありません。その為に値渡ししていますので(値渡しする事によって、暗黙の変換を回避しています)。

実際に開発したシステムで、長らく使っていますので問題はないはずです。

ただメモリ操作をするのであれば、バイナリで扱った方が無難なのは確かです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/11/17 09:03

回答2と同じく RtlMoveMemory を使うけど、文字列で渡すと


暗黙にUnicode/SJIS変換がされるので、化けるでのでは?
やはり、バイナリで渡すべきと思います。

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

この回答への補足

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

補足日時:2004/11/17 10:11
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/11/17 09:01

何でバイナリ(byte配列)ではなく文字列?


「構造体→バイナリ→共有メモリ→バイナリ→構造体をする方法」過去ログにあるはずです
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/11/16 19:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

人気Q&Aランキング