Dim address As interger
Dim str As String
・・・・・・・・・・・途中の処理
address 100のバッファが途中の処理で用意されていて、文字列”1234”が入っていいます。この文字列の長さは可変です。
address 100の内容をstrにコピーしたいのですがどのようにすればいいでしょうか?
以前の質問から創造するとAPIから戻り値の文字列を取得したいということでしょうか?
であれば、
http://www.atmarkit.co.jp/fdotnet/dotnettips/025w32string/w32str...
の「DLL関数に文字列バッファを渡す場合」が参考になるはずです。
VB.netでは、直接アドレスを操作することができないため、
ポインタを数値として持っていても無意味で、
そのポインタが指し示すものを対応するオブジェクトにキャストし、
その参照を変数として保持する形になります。
(↑大雑把な理解なので違うかも)
そのあたりの対応は下記ページを見るといいと思います。
http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.ht...
うーん。正直言うと私もそのあたり未経験なんですが、
http://ameblo.jp/willcom-phs/entry-10094664374.html
あたりを見ると、そのあたりの変換はMarshalクラスを利用するみたいですね。
Marshal クラス (System.Runtime.InteropServices)
で、たとえば文字列がANSI文字列ならMapViewOfFileの戻りをIntPtr型で受けて、それを文字列に変換するためにPtrToStringAnsi メソッドを用いると。
(これがSJisとかなら一度バイト配列に突っ込んでMemoryStream経由でエンコード指定の読み込みをすればいいのかな?)
参考: 共用体を含んだ構造体を引数にとるDLL関数の処理方法について
で、そのあたりの処理をいろいろ考えるのなら
ひょっとするとこのクラスを解析したほうがいいのかも。
試してみます。ありがとうございます。人の書いたコードを見るとmovememoryを行っています。でもこれは既存のファイルを開いて、mapしているのでコピーするバイト数を知っています。今回は可変なのでここをどうにかすればいいかなと思っています。
Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Dest As String, ByRef Source As String, ByVal length As Integer)
Call MoveMemory(DataGridView1(i, j).Value, shmem(i, j), バイト数)
おっしゃとおりapiの戻りポインタを利用しようとかんがています。
hShare(i, j) = CreateFileMappingX(-1, 0, &H4, 0, 1024, "NO00" & i.ToString(i) & i.ToString(j))
shmem(i, j) = MapViewOfFile(hShare(i, j), &H2&, 0, 0, 512)
DataGridView1(i, j).Value=shmem(i, j)
マップドファイルの内容を読み書きしてgridのセルに代入する。上記ではセルにアドレスをいれていることに気づき、お聞きしました。
教えていただいた例は引数にポインタですが、お聞きしているのは戻りでポインタとなっているためよくわかりませんでした。