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


Dim address As interger
Dim str As String

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

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

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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2009/11/14 13:10:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:khazad-Lefty No.1

回答回数181ベストアンサー獲得回数27

ポイント35pt

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

であれば、

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

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

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

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

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

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

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

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

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

id:mai_mai_mail

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

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

2009/11/07 15:15:21
id:khazad-Lefty No.2

回答回数181ベストアンサー獲得回数27

ポイント35pt

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

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

id:mai_mai_mail

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

2009/11/07 16:25:26
  • id:khazad-Lefty
    あと、検索するとき、VBだとVB6が混在してしまうんで、VB.netの場合でもあえてC#で検索かけた方が(特に今回のような低レベル処理の場合)情報が引っかかるイメージがあります。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません