LPARAM型のキャスト

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
damedamekun

LPARAM型のキャスト

#1

投稿記事 by damedamekun » 8年前

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

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

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: LPARAM型のキャスト

#2

投稿記事 by みけCAT » 8年前

まずは使用しているプログラミング言語を教えてくだだい。
damedamekun さんが書きました:List<T>型をLPARAM型に変換する必要があり、
その後で、List<T>型をLPARAM型から再取得する必要があるのです。
それは本当ですか?
The XY Problemではないですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

damedamekun

Re: LPARAM型のキャスト

#3

投稿記事 by damedamekun » 8年前

言語はC++/cli です。

アバター
tk-xleader
記事: 158
登録日時: 13年前
連絡を取る:

Re: LPARAM型のキャスト

#4

投稿記事 by tk-xleader » 8年前

gcrootテンプレート(<vcclr.h>)を利用すればマネージハンドルをネイティブ型のように扱えます。gcroot<List<T>^>*とすればポインタとして扱えますから、これでLPARAMにキャストすることが出来ます。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: LPARAM型のキャスト

#5

投稿記事 by YuO » 8年前

なんのためにキャストが必要なのでしょうか。

LPARAMが必要になるのは,たいていの場合は同時にコールバック関数と共に関数を呼び出し,そのコールバック関数の引数として渡される場合ですが,
そもそもC++/CLIであるならばデリゲートとMarshal::GetFunctionPointerForDelegateを使うことで,
特定のインスタンスに紐付いた関数呼び出しをコールバック関数に登録できます。

メンバ変数であるList<T>であれば上記の方法で済みますし,ローカル変数であればそのローカル変数をメンバ変数として持つクラスを用意することで対応できます。
# クラスを作る部分をコンパイラが頑張るのがラムダ式の変数キャプチャ機能。

damedamekun

Re: LPARAM型のキャスト

#6

投稿記事 by damedamekun » 8年前

「なんのためにキャストが必要なのか?」について回答します。
「デリゲートとMarshal::GetFunctionPointerForDelegateを使う」について、
具体的な実装コードもしくは参考URLをご教授頂けないでしょうか。

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

以下コードの★★の箇所で以下のコンパイルエラーとなります。

コード:

  
-------------------
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を完結させたいのです。

解決策をご教授下さい。

damedamekun

Re: LPARAM型のキャスト

#7

投稿記事 by damedamekun » 8年前

解決しました。
c++の世界で一時変数を設けて、ポインタを渡し、reinterpret_castで復元する、という方法です。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: LPARAM型のキャスト

#8

投稿記事 by YuO » 8年前

とりあえず,正攻法でdelegate作ってポインタに変換する例。
https://github.com/YuneKichi/BbsSample/ ... et/3/17715

というか,Marshal::GetFunctionPointerForDelegate をGoogleで検索すると,2番目に方法: C++ Interop を使用してコールバックおよびデリゲートをマーシャリングするという,結構そのまんまなMSDNの記事が見つかるはずなんですが……。
オフトピック
サンプルは1スレッドあたり一個のリポジトリにした方が綺麗かなぁ……。
あんまり増えすぎるのもなんだしと思って,ブランチで処理しているけれど。
最初はmasterブランチに追加していこうと思っていたけれど,これだとZIP Downloadが出来ないという難点があることに気づいた……。

閉鎖

“C言語何でも質問掲示板” へ戻る