- PR -

メモリマップトファイルに書き込み(MoveMemory関数)

1
投稿者投稿内容
未記入
会議室デビュー日: 2005/09/26
投稿数: 1
投稿日時: 2005-09-26 14:36
現在、『Visual Studio 2005 Beta 2』のVBでPG作成を行っています。

メモリマップトファイルを作成し、
『MoveMemory』というAPIでバイト配列の値を書き込むのですが、
「保護されているメモリに読み取りまたは書込み操作を行おうとしました。」
というメッセージが表示され書き込みできません。

メモリマップトファイルの作成は、読み取り・書込み両方出来るように
作成しているのですが…。

ちなみに読み取りは可能でした。
MoveMemory関数の引数であるコピー元・コピー先を入れ替えて
書き込みを行おうとすると上記のメッセージが表示されます。

MoveMemory関数は以下のように使用しています。
何かお分かりの事がありましたら、ご教授下さい。

≪関数使用部≫
Call MoveMemory(Address, Buffer, FileLength)
・Address:コピー先のアドレス(MapViewOfFile関数の戻り値)
・Buffer:書き込む値を格納したバイト配列
・FileLength:マップしたファイルのサイズを指定

≪関数宣言部≫
'メモリマップトファイルに書込み
Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
(ByVal Dest As Long, _
ByVal Source As Byte, _
ByVal Length As Long)


Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-09-26 15:07
引用:
コード:
Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _ 
    (ByVal Dest As Long, _ 
     ByVal Source As Byte, _ 
     ByVal Length As Long)



えーと、VB6のサンプルコードを参考にした宣言でしょうかこれは?
Longは64bitですしByteは8bitで、MoveMemoryの定義とは全く違うものに仕上がっていますが。

まず、ポインタ型を扱う場合System.IntPtrを使ってください。
DestもSourceもポインタ型を指定するパラメータです。
SIZE_T型もプラットフォーム依存のサイズですからIntPtrを使う必要がありますね。

そもそもByte配列とポインタを相互にコピーするには、System.Runtime.InteropServices名前空間MarshalクラスのCopyメソッドを使いましょう。
わざわざMoveCopy関数を使う必要はありません。

このぶんだとCreateFileMapping関数やMapViewOfFile関数の定義も疑う必要がありそうですが。
1

スキルアップ/キャリアアップ(JOB@IT)