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

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

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

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


(過去ログ 133 を表示中)

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

■78742 / inTopicNo.1)  クラス内のCALLBACK関数の呼び出し処理について
  
□投稿者/ damedamekun (3回)-(2016/02/14(Sun) 22:08:32)

分類:[.NET 全般] 

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

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

解決策をご教授下さい。


引用返信 編集キー/
■78744 / inTopicNo.2)  Re[1]: クラス内のCALLBACK関数の呼び出し処理
□投稿者/ Azulean (595回)-(2016/02/14(Sun) 22:51:59)
2016/02/14(Sun) 22:52:20 編集(投稿者)

C++/CLI で続けるにはハードルが高そうなことをうかがわせますが…、大丈夫でしょうか…。

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

通常の C++ の範囲でも、クラスのメンバー関数をコールバック関数として渡すことはできません。(thiscall となるため)
static キーワードをつけた上で呼び出し規約を調整する必要があります。

ただ、C++/CLI の ref class 内だと clrcall が強制されるのでその方法は使えません。
ref class ではない、ネイティブクラスとして実装するか、.NET の世界なりのデリゲートのインスタンスを得て、Marshal::GetFunctionPointerForDelegate を使うかになるでしょう。


このあたりのキーワードから自力で調べられますか?
難しいようなら、C++/CLI でそういったコードを書くのをやめて、C# に移った方がいいと思います。
まだ、ハードルが下がりますし、サンプルコードも豊富にあることが理由です。
引用返信 編集キー/
■78748 / inTopicNo.3)  Re[1]: クラス内のCALLBACK関数の呼び出し処理について
□投稿者/ WebSurfer (821回)-(2016/02/15(Mon) 00:59:50)
No78742 (damedamekun さん) に返信

マルチポストは止めましょう。
引用返信 編集キー/
■78795 / inTopicNo.4)  Re[2]: クラス内のCALLBACK関数の呼び出し処理について
□投稿者/ damedamekun (7回)-(2016/02/17(Wed) 07:41:57)
解決しました。
c++の世界で一時変数を設けて、ポインタを渡し、reinterpret_castで復元する、という方法です。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -