クラス内のCALLBACK関数の呼び出し処理について

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

クラス内のCALLBACK関数の呼び出し処理について

#1

投稿記事 by damedamekun » 4年前

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

以下コードの★★の箇所で以下のコンパイルエラーとなります。
-------------------
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を完結させたいのです。

解決策をご教授下さい。

Sunsun

Re: クラス内のCALLBACK関数の呼び出し処理について

#2

投稿記事 by Sunsun » 4年前

コールバック関数のアドレスがメンバ関数だと特定されないからエラーが出るのですかね。
クラスの外で宣言、定義して、namespaceでまとめるか、
クラス内ならstatic関数にしたらいいのではないですか。

damedamekun

Re: クラス内のCALLBACK関数の呼び出し処理について

#3

投稿記事 by damedamekun » 4年前

「クラスの外で宣言」で宣言する場合、
「System.Collections.Generic.List<T>型」を「LPARAM型」に変換する方法、
またその逆の変換をする方法、を教えて下さい。
List<T>型をLPARAM型に変換する必要があり、
その後で、List<T>型をLPARAM型から再取得する必要があるのです。

「static関数」にすると以下コンパイル】エラーとなってしまいます。

コード:

  
error C2664: 'EnumChildWindows' : 2 番目の引数を 'BOOL (__clrcall *)(HWND,LPARAM)' から 'WNDENUMPROC' に変換できません。(新しい機能 ; ヘルプを参照)

アバター
へにっくす
記事: 630
登録日時: 8年前
住所: 東京都

Re: クラス内のCALLBACK関数の呼び出し処理について

#4

投稿記事 by へにっくす » 4年前

英語だが参考になるかもしれないページ
http://www.pinvoke.net/default.aspx/user32.EnumWindows

あっと、これはC#でした

以下はどうかな?
http://rarara.cafe.coocan.jp/cgi-bin/ln ... 030002.txt

参考にならなかったらすみません
written by へにっくす

damedamekun

Re: クラス内のCALLBACK関数の呼び出し処理について

#5

投稿記事 by damedamekun » 4年前

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

閉鎖

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