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

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

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

Re[4]: LPARAM型のキャスト


(過去ログ 133 を表示中)

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

■78746 / inTopicNo.1)  LPARAM型のキャスト
  
□投稿者/ damedamekun (4回)-(2016/02/14(Sun) 23:55:09)

分類:[.NET 全般] 

「System.Collections.Generic.List<T>型」を「LPARAM型」に変換する方法、
またその逆の変換をする方法、を教えて下さい。

List<T>型をLPARAM型に変換する必要があり、
その後で、List<T>型をLPARAM型から再取得する必要があるのです。
引用返信 編集キー/
■78747 / inTopicNo.2)  Re[1]: LPARAM型のキャスト
□投稿者/ WebSurfer (820回)-(2016/02/15(Mon) 00:58:52)
No78746 (damedamekun さん) に返信

マルチポストは止めましょう。
引用返信 編集キー/
■78755 / inTopicNo.3)  Re[1]: LPARAM型のキャスト
□投稿者/ 魔界の仮面弁士 (640回)-(2016/02/15(Mon) 14:31:31)
2016/02/15(Mon) 14:39:49 編集(投稿者)

No78746 (damedamekun さん) に返信
> 「System.Collections.Generic.List<T>型」を「LPARAM型」に変換する方法、
> またその逆の変換をする方法、を教えて下さい。

情報共有として、自分の見つけた範囲のマルチポスト先を貼っておきます。

[2016/02/14 23:54] mixC++【LPARAM型のキャスト】
http://dixq.net/forum/viewtopic.php?f=3&t=17715

[2016/2/14 23:51] 知恵袋【「System.Collections.Generic.List<T>型」に変換する方法】
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11155907811


アンマネージの LPARAM はそもそも、ポインタ(LONG_PTR)であり、
マネージ型としては IntPtr が相当します(32bit or 64bit)。

しかし、それをどのように変換するべきは、それを中継する相手が
LPARAM をどのように扱うかによって異なります。

その変換を必要としている背景について、もう少し詳しく書くことはできますか?



> List<T>型をLPARAM型に変換する必要があり、
> その後で、List<T>型をLPARAM型から再取得する必要があるのです。

時系列的に、下記に対する追加質問だと思いますが、
開発言語は C# で良いのですね? (C++/CLI ではなく)

[2016/02/14 21:59:18] 知恵袋【ウィンドウハンドルに対する操作関連をまとめた、自作クラスを作成しています】
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11155902366

[2016/02/14 22:07] mixC++【クラス内のCALLBACK関数の呼び出し処理について】
http://dixq.net/forum/viewtopic.php?f=3&t=17714

[2016/02/14 22:08] この掲示板【クラス内のCALLBACK関数の呼び出し処理について】
http://bbs.wankuma.com/index.cgi?mode=al2&namber=78742



[2016/02/13 08:04] 知恵袋【【SendMessage】関数【PostMessage】関数についてご教授下さい。】
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12155830942

[2016/02/13 08:17] mixC++【【SendMessage】関数【PostMessage】関数についてご教授下さい。】
http://dixq.net/forum/viewtopic.php?f=3&t=17706

[2016/02/13 08:20] この掲示板【【SendMessage】関数【PostMessage】関数】
http://bbs.wankuma.com/index.cgi?mode=al2&namber=78726



以下蛇足:
http://bbs.wankuma.com/index.cgi?mode=one&namber=51403&KLOG=86
http://bbs.wankuma.com/index.cgi?mode=one&namber=13935&KLOG=29
引用返信 編集キー/
■78756 / inTopicNo.4)  Re[2]: LPARAM型のキャスト
□投稿者/ 魔界の仮面弁士 (641回)-(2016/02/15(Mon) 15:29:05)
No78755 (魔界の仮面弁士) に追記
>> List<T>型をLPARAM型に変換する必要があり、
> しかし、それをどのように変換するべきは、それを中継する相手が
> LPARAM をどのように扱うかによって異なります。
>
> その変換を必要としている背景について、もう少し詳しく書くことはできますか?

単純コピーなコードを書いてみました。T は構造体限定です。
型によっては変換結果を保証できない場合もあります。

static IntPtr ToLPARAM<T>(List<T> list) where T : struct
{
  int typeSize = Marshal.SizeOf<T>();
  int intSize = Marshal.SizeOf<int>();
  int size = intSize + typeSize * list.Count;

  IntPtr ptr = Marshal.AllocCoTaskMem(size);
  Marshal.WriteInt32(ptr, list.Count);
  for (int i = 0; i < list.Count; i++)
  {
    int offset = intSize + typeSize * i;
    IntPtr p = IntPtr.Add(ptr, offset);
    Marshal.StructureToPtr(list[i], p, false);
  }
  return ptr;
}

static List<T> FromLPARAM<T>(IntPtr ptr, bool withRelease) where T : struct
{
  int typeSize = Marshal.SizeOf<T>();
  int intSize = Marshal.SizeOf<int>();
  int count = Marshal.ReadInt32(ptr);

  List<T> list = new List<T>();
  for (int i = 0; i < count; i++)
  {
    int offset = intSize + typeSize * i;
    IntPtr p = IntPtr.Add(ptr, offset);
    list.Add(Marshal.PtrToStructure<T>(p));
  }
  if(withRelease)
  {
    Marshal.FreeCoTaskMem(ptr);
  }
  return list;
}
引用返信 編集キー/
■78775 / inTopicNo.5)  Re[3]: LPARAM型のキャスト
□投稿者/ damedamekun (5回)-(2016/02/16(Tue) 07:50:29)
>>その変換を必要としている背景について、もう少し詳しく書くことはできますか?
→以下の通りです。

ウィンドウハンドルに対する操作関連をまとめた、
自作クラスを作成しています。

以下コードの★★の箇所で以下のコンパイルエラーとなります。
-------------------
error C3867: 'AutoOperation::EnumChildProc': 関数呼び出しには引数リストがありません。
メンバーへのポインターを作成するために '&AutoOperation::EnumChildProc' を使用してください
-------------------

public ref class AutoOperation{

strc_window^ main_window;//strc_windowは自作の構造体です
List<strc_window^>^ child_window_list;

AutoOperation(){
**this->main_windowに親ウィンド情報を代入する処理**
child_window_get();

}

BOOL CALLBACK EnumChildProc(HWND hw, LPARAM lParam ){
return true;
}

void child_window_get(){
this->child_window_list = gcnew List<strc_window^>;
long ans = EnumChildWindows( this->main_window->hw, EnumChildProc, NULL );//★★
}

};


エラー表記通り「&AutoOperation::EnumChildProc」に変えると、
今度は以下のコンパイルエラーとなります。
-------------------
error C3374: delegate インスタンスを作成する場合以外に、'AutoOperation::EnumChildProc' のアドレスを指定できません
-------------------


やりたい事はクラス内でCALLBACK関数の呼び出し処理EnumChildWindowsを完結させたいのです。

解決策をご教授下さい。
引用返信 編集キー/
■78785 / inTopicNo.6)  Re[4]: LPARAM型のキャスト
□投稿者/ Jitta (175回)-(2016/02/16(Tue) 20:55:11)
No78775 (damedamekun さん) に返信
> 以下コードの★★の箇所で以下のコンパイルエラーとなります。
 このコンパイルエラーと、LPRAMのキャストは、関係ないなぁ。
→long ans = EnumChildWindows( this->main_window->hw, &AutoOperation::EnumChildProc, NULL );

エラーの理由は、「EnumChildProc」が何を指しているのかわからない、ってことです。
なので、キチンと「AutoOperationクラスに定義されているEnumChildProcのアドレス」って指定してね。

引用返信 編集キー/
■78786 / inTopicNo.7)  Re[4]: LPARAM型のキャスト
□投稿者/ Azulean (597回)-(2016/02/16(Tue) 22:23:47)
No78775 (damedamekun さん) に返信
> →以下の通りです。

その内容は以下のスレッドと同じのようですが、あえて書き直す理由はありますか?
http://bbs.wankuma.com/index.cgi?mode=al2&namber=78742

また指摘を受けているように、複数箇所で同時に質問を進行すると、お互いに不利益を被ります。
回答者側はすでにアドバイスされている内容を時間をかけてしまうことで、時間を無駄にする可能性があります。
質問者側もすでに試して無駄だった内容が繰り返される可能性があります。

そういった指摘を受けていることを理解しましょう。
(無視することもできますが、いずれ相手にされなくなりますよ…)
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -