関数ポインタ ( 変数 )

  サンプルソース



  
#include <lightbox.h>
LboxDlg *Dlg;
void MyFunc( HWND hWnd, LboxDlg *Dlg );
LRESULT CALLBACK About( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
	switch( message )
	{
		case WM_INITDIALOG:
			Dlg = new LboxDlg( hDlg );
			return TRUE;

		case WM_COMMAND:
			if( LOWORD(wParam) == IDCANCEL ) {
				EndDialog(hDlg, LOWORD(wParam));
				delete Dlg;
				return TRUE;
			}
			if( LOWORD(wParam) == IDC_BUTTON1 ) {
				void (*ptr)( HWND hWnd, LboxDlg *Dlg );
				ptr = MyFunc;
				ptr( hDlg, Dlg );
			}
			if( LOWORD(wParam) == IDC_BUTTON2 ) {
				char *ptr;
				ptr = (char *)MyFunc;
				((void (*)(HWND, LboxDlg *))ptr)( hDlg, Dlg );
			}
			break;
	}
	return FALSE;
}

void MyFunc( HWND hWnd, LboxDlg *Dlg )
{
	Dlg->MsgOk( hWnd, "関数呼び出し成功" );
}
  



  関数ボインタ変数の定義



  
void (*ptr)( HWND hWnd, LboxDlg *Dlg );
  

上記の記述は、関数型のポインタ変数を定義しています。使用目的は、MyFunc を呼び出す為のものですが、(*ptr) を MyFunc と書き換えれば MyFunc の宣言と全く同じになります

つまり同型なので以下の式が実行可能です

ptr = MyFunc

こうなってしまえば、ptr の扱いは通常の関数名と同じになります

ptr( hDlg, Dlg );



  通常のポインタ変数を関数ポインタとして使用

  
char *ptr;
  

ptr は char 型のポインタ変数ですが、単純にキャストすれば関数ポインタを格納できます

ptr = (char *)MyFunc;

ptr は、char 型のポインタなので、関数として使用する場合は 関数型のポインタにキャストする必要があります

(void (*)(HWND, LboxDlg *))ptr

それに対して、キャストで指定した引数を与えて実行します

((void (*)(HWND, LboxDlg *))ptr)( hDlg, Dlg );




  マクロを使用する

関数の戻り値と引数の仕様さえ解っておれば、関数のポインタよりその関数を実行する事ができます。これは、dll より関数のポインタを取得して dll 内の関数を実行する事ができる事を意味します

  
#include <lightbox.h>
LboxDlg *Dlg;
void MyFunc( HWND hWnd, LboxDlg *Dlg );

// 上記関数用の関数ポインタ変数を定義する為のマクロ
#define MyFuncPtr(a) void (*a)( HWND hWnd, LboxDlg *Dlg )

// 関数ポインタへキャストする為のマクロ
#define MyFuncCast(a) ((void (*)( HWND, LboxDlg * ))a)

LRESULT CALLBACK About( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
	switch( message )
	{
		case WM_INITDIALOG:
			Dlg = new LboxDlg( hDlg );
			return TRUE;

		case WM_COMMAND:
			if( LOWORD(wParam) == IDCANCEL ) {
				EndDialog(hDlg, LOWORD(wParam));
				delete Dlg;
				return TRUE;
			}
			if( LOWORD(wParam) == IDC_BUTTON1 ) {
				MyFuncPtr(ptr);
				ptr = MyFunc;
				ptr( hDlg, Dlg );
			}
			if( LOWORD(wParam) == IDC_BUTTON2 ) {
				char *ptr;
				ptr = (char *)MyFunc;
				MyFuncCast(ptr)( hDlg, Dlg );
			}
			break;
	}
	return FALSE;
}

void MyFunc( HWND hWnd, LboxDlg *Dlg )
{
	Dlg->MsgOk( hWnd, "関数呼び出し成功" );
}
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ