C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: C#でのCopyMemory


(過去ログ 89 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■53281 / inTopicNo.1)  C#でのCopyMemory
  
□投稿者/ 麻呂 (1回)-(2010/09/09(Thu) 13:29:09)

分類:[.NET 全般] 

VS2008 64ビットOSにてKernel32.dllのCopyMemoryを使用する際に
IntPtrからIntPtrの場合、うまく動作するのですが
構造体配列やByte配列からIntPtrの場合、コピーされません。
例外は発生していないのですがメモリでアドレスの中を見ると不定なデータがコピーされています。
64ビットでは特殊な記載が必要なのでしょうか?

[DllImport("Kernel32.dll", EntryPoint = "RtlMoveMemory")]
internal static extern void CopyMemory(IntPtr Destination, IntPtr Source, [MarshalAs(UnmanagedType.U4)] int Length);
[DllImport("Kernel32.dll", EntryPoint = "RtlMoveMemory")]
internal static extern void CopyMemory(IntPtr Destination, ref byte Source, [MarshalAs(UnmanagedType.U4)] int Length);

IntPtr pDst = HeapAlloc(GetProcessHeap(),0x8, 256);
byte[] rSrc = new byte[256];
CopyMemory(pDst,ref rSrc[0],rSrc.Length);
引用返信 編集キー/
■53282 / inTopicNo.2)  Re[1]: C#でのCopyMemory
□投稿者/ Hongliang (705回)-(2010/09/09(Thu) 13:41:23)
> [DllImport("Kernel32.dll", EntryPoint = "RtlMoveMemory")]
> internal static extern void CopyMemory(IntPtr Destination, IntPtr Source, [MarshalAs(UnmanagedType.U4)] int Length);
> [DllImport("Kernel32.dll", EntryPoint = "RtlMoveMemory")]
> internal static extern void CopyMemory(IntPtr Destination, ref byte Source, [MarshalAs(UnmanagedType.U4)] int Length);

第三引数は size_t ですから、int じゃなくて IntPtr にすべきですよ。
配列をコピーするなら、ref じゃなくてそのまま配列で宣言してください。
配列の時は入力か出力かで In 属性または Out 属性も付けておきましょう。

static extern void CopyMemory(IntPtr Destination, [In] byte[] Source, IntPtr Length);

なお、byte[] と IntPtr 間は Marshal.Copy というメソッドもあります。

引用返信 編集キー/
■53283 / inTopicNo.3)  Re[1]: C#でのCopyMemory
□投稿者/ shu (23回)-(2010/09/09(Thu) 13:48:25)
No53281 (麻呂 さん) に返信
> 64ビットでは特殊な記載が必要なのでしょうか?
32ビットでは動きましたか?
引用返信 編集キー/
■53284 / inTopicNo.4)  Re[2]: C#でのCopyMemory
□投稿者/ 麻呂 (2回)-(2010/09/09(Thu) 14:07:50)

No53283 (shu さん) に返信
> 32ビットでは動きましたか?
32ビットでは動作しました。

No53282 (Hongliangさん) に返信
ご回答ありがとうございます。

第2引数を配列に変更し動作しました。
Marshal.Copyで回避していたのですが
CopyMemoryが使用できないのが解らなかったので質問しました。

32ビットの場合、refで記述しても動作するのはなぜなのでしょうか?
引用返信 編集キー/
■53286 / inTopicNo.5)  Re[3]: C#でのCopyMemory
□投稿者/ Hongliang (706回)-(2010/09/09(Thu) 16:37:34)
> 32ビットの場合、refで記述しても動作するのはなぜなのでしょうか?
たまたまじゃないですか?
引用返信 編集キー/
■53291 / inTopicNo.6)  Re[4]: C#でのCopyMemory
□投稿者/ 麻呂 (3回)-(2010/09/09(Thu) 17:49:11)
No53286 (Hongliang さん) に返信
>>32ビットの場合、refで記述しても動作するのはなぜなのでしょうか?
> たまたまじゃないですか?

もう少し調べてみます。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -