人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

vs 2005 vbで以下のことを教えてください。

Dim address As interger
Dim str As String

・・・・・・・・・・・途中の処理

address 100のバッファが途中の処理で用意されていて、文字列”1234”が入っていいます。この文字列の長さは可変です。

address 100の内容をstrにコピーしたいのですがどのようにすればいいでしょうか?


●質問者: mai_mai_mail
●カテゴリ:コンピュータ インターネット
✍キーワード:as STR String VB コピー
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● khazad-Lefty
●35ポイント

以前の質問から創造するとAPIから戻り値の文字列を取得したいということでしょうか?

であれば、

http://www.atmarkit.co.jp/fdotnet/dotnettips/025w32string/w32str...

の「DLL関数に文字列バッファを渡す場合」が参考になるはずです。

VB.netでは、直接アドレスを操作することができないため、

ポインタを数値として持っていても無意味で、

そのポインタが指し示すものを対応するオブジェクトにキャストし、

その参照を変数として保持する形になります。

(↑大雑把な理解なので違うかも)

そのあたりの対応は下記ページを見るといいと思います。

http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.ht...

◎質問者からの返答

おっしゃとおり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のセルに代入する。上記ではセルにアドレスをいれていることに気づき、お聞きしました。

教えていただいた例は引数にポインタですが、お聞きしているのは戻りでポインタとなっているためよくわかりませんでした。


2 ● khazad-Lefty
●35ポイント

うーん。正直言うと私もそのあたり未経験なんですが、

http://ameblo.jp/willcom-phs/entry-10094664374.html

あたりを見ると、そのあたりの変換はMarshalクラスを利用するみたいですね。

Marshal クラス (System.Runtime.InteropServices)

で、たとえば文字列がANSI文字列ならMapViewOfFileの戻りをIntPtr型で受けて、それを文字列に変換するためにPtrToStringAnsi メソッドを用いると。

(これがSJisとかなら一度バイト配列に突っ込んでMemoryStream経由でエンコード指定の読み込みをすればいいのかな?)

参考: 共用体を含んだ構造体を引数にとるDLL関数の処理方法について

で、そのあたりの処理をいろいろ考えるのなら

ひょっとするとこのクラスを解析したほうがいいのかも。

http://hongliang.seesaa.net/article/9121793.html

◎質問者からの返答

試してみます。ありがとうございます。人の書いたコードを見ると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), バイト数)

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ