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

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

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

Re[6]: byte[]にintptrをいれたい


(過去ログ 127 を表示中)

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

■75405 / inTopicNo.1)  byte[]にintptrをいれたい
  
□投稿者/ SenichiFSeiei (1回)-(2015/03/22(Sun) 01:34:24)

分類:[C#] 

C#でbyte配列(byte[])にintptrをいれたいのですが
いい変換をご存知の方、よろしくお願いします。
引用返信 編集キー/
■75406 / inTopicNo.2)  Re[1]: byte[]にintptrをいれたい
□投稿者/ 魔界の仮面弁士 (255回)-(2015/03/22(Sun) 02:03:59)
No75405 (SenichiFSeiei さん) に返信
> C#でbyte配列(byte[])にintptrをいれたいのですが

IntPtr のポインタが指し示す先にあるデータを byte[] に格納したいという意味でしょうか。
それとも、IntPtr が示すアドレス値を byte[] に格納したいという意味でしょうか。

前者であれば、System.Runtime.InteropServices.Marshal.Copy メソッドを使うことができます。
後者であれば、IntPtr.ToInt64/ToInt32 で得た値を System.BitConverter.GetBytes メソッドに渡しましょう。
引用返信 編集キー/
■75407 / inTopicNo.3)  Re[2]: byte[]にintptrをいれたい
□投稿者/ SenichiFSeiei (2回)-(2015/03/22(Sun) 07:54:00)
No75406 (魔界の仮面弁士 さん) に返信
> ■No75405 (SenichiFSeiei さん) に返信
>>C#でbyte配列(byte[])にintptrをいれたいのですが
>
> IntPtr のポインタが指し示す先にあるデータを byte[] に格納したいという意味でしょうか。
> それとも、IntPtr が示すアドレス値を byte[] に格納したいという意味でしょうか。
>
> 前者であれば、System.Runtime.InteropServices.Marshal.Copy メソッドを使うことができます。
> 後者であれば、IntPtr.ToInt64/ToInt32 で得た値を System.BitConverter.GetBytes メソッドに渡しましょう。

用途としては
@C#側のウィンドウハンドルをc++に送る側におくるためにpipe通信を使用
 そこでbyte[]にデータを詰めて送る
AC#側
  IntPtr hWnd = new WindowInteropHelper(this).Handle;
  byte[] IntPtrtoByte = new byte[IntPtr.Size];
Marshal.Copy(IntPtrtoByte, 0, hWnd, IntPtr.Size);
IntPtrToByteの中はsize4で中身がすべて0でした。。。。。

  
引用返信 編集キー/
■75408 / inTopicNo.4)  Re[3]: byte[]にintptrをいれたい
□投稿者/ Azulean (455回)-(2015/03/22(Sun) 08:41:38)
逆の方を使っているからでは。
Marshal.Copy には多数のオーバーロード(引数が違うバージョン)があります。
きちんと読んで使いましょう。

https://msdn.microsoft.com/ja-jp/library/ms146625
https://msdn.microsoft.com/ja-jp/library/ms146631

引用返信 編集キー/
■75409 / inTopicNo.5)  Re[4]: byte[]にintptrをいれたい
□投稿者/ SenichiFSeiei (3回)-(2015/03/22(Sun) 09:25:22)
No75408 (Azulean さん) に返信
> 逆の方を使っているからでは。
> Marshal.Copy には多数のオーバーロード(引数が違うバージョン)があります。
> きちんと読んで使いましょう。
>
> https://msdn.microsoft.com/ja-jp/library/ms146625
> https://msdn.microsoft.com/ja-jp/library/ms146631
>

ご指摘ありがとうございました
Marshal.Copy(IntPtrtoByte, 0, WndHandle, IntPtr.Size);

Marshal.Copy(WndHandle, IntPtrtoByte,0 ,IntPtr.Size);
にすれば、こぴーできました。

ご対応ありがとうございました。
解決済み
引用返信 編集キー/
■75412 / inTopicNo.6)  Re[5]: byte[]にintptrをいれたい
□投稿者/ Hongliang (297回)-(2015/03/22(Sun) 20:34:38)
2015/03/22(Sun) 20:36:10 編集(投稿者)

うん?

> Marshal.Copy(WndHandle, IntPtrtoByte,0 ,IntPtr.Size);
> にすれば、こぴーできました。

これって、ハンドルをポインタとして扱って、そのポインタが指すアドレスの値をコピーしてるんですけど……。
ハンドルの値そのものを書き込むなら、
IntPtr::ToInt32()→BitConverter.GetBytes(Int32)→Marshal.CopyTo(Byte[], Int32, IntPtr, Int32)
とか。
// ウィンドウハンドルは64bitプロセスでも下位32bitのみ使用しているんだそうで。

// 改めて見返したら魔界の仮面弁士さんがすでに方法を提示されていた。
引用返信 編集キー/
■75413 / inTopicNo.7)  Re[6]: byte[]にintptrをいれたい
□投稿者/ Azulean (457回)-(2015/03/22(Sun) 21:12:06)
No75412 (Hongliang さん) に返信
> これって、ハンドルをポインタとして扱って、そのポインタが指すアドレスの値をコピーしてるんですけど……。

見落としてた。orz
そうですね、Marshal.Copy じゃだめですね、次のスレッドも含めて考えると。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -