返回信息流有些人觉得下面这些代码的格式很奇怪,其实这就是函数指针,回调函数其实就是传参是函数的地址,下面是两个简单的帮助理解函数指针和回调函数的代码:
代码1
-------------------------------------------------------------------------------------------------
#include<iostream>
using namespace std;
typedef int (*p_type)(int,int);
int add(int a,int b)
{
return a+b;
}
int sub(int a,int b)
{
return a-b;
}
int result(p_type a,p_type b)
{
return a(1,4) + b(1,4);
}
int main()
{
int re;
p_type p = add, q = sub;
re = result(p,q);
printf("%d\n",re);//这个程序的结构很容易弄清楚,先把指针弄明白了
system("pause");
return 0;
}
代码2
-------------------------------------------------------------------------------------------------
typedef int (WINAPI * MESSAGEBOX)(HWND ,LPCSTR ,LPCSTR ,UINT);//这就是定义了一个函数指针的类型
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
HINSTANCE hInst = LoadLibraryA("User32");
MESSAGEBOX _MessageBox_stdcall_ = (MESSAGEBOX) GetProcAddress(hInst,"MessageBoxA\0");//呵呵有写过病毒的人很可能对这两句的风格很熟哦,病毒里的系统调用一般都是通过这种方式调用的
//MESSAGEBOX _MessageBox_stdcall_ = MessageBoxA;//把前两句注释掉,然后运行这句话,效果一样
_MessageBox_stdcall_(0,"Hello World","Win32",MB_OK);
return 0;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #37657同步于 2010/4/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
让你弄清楚函数指针以及回调函数的运行方式
lhy137910144
2010/4/8镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
这是个很有名的非模式窗口WIN32汇编的代码,不要说到汇编就紧张,仔细看,其实win32汇编很简单的,只要配合资源文件编译链接就可以运行了。
-------------------------------------------------------------------------------------------------
.386
.model flat,stdcall
option casemap:none
;***********************************
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
;***********************************
IDD_DIALOG_MML EQU 101
IDC_BUTTON_ADD EQU 1001
IDC_BUTTON_DEC EQU 1002
IDC_EDIT EQU 1000
IDM_EXIT EQU 40001
;*************数据段****************
;.data?
;dwVal DWORD ?
.data
szText db "Hello, world!",0
szCaption db "Win32Asm",0
dwVal DWORD 0
.code
;*******被调用对话框过程 发现了没,这就是个回调函数************
DlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
;invoke MessageBoxA ,NULL,addr szText,addr szCaption,MB_OK
.if uMsg == WM_INITDIALOG
mov dwVal,11
invoke SetDlgItemInt,hWnd,IDC_EDIT,dwVal,FALSE
.elseif uMsg == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif uMsg == WM_COMMAND
mov eax,wParam
.if ax == IDC_BUTTON_ADD
inc dwVal
invoke SetDlgItemInt,hWnd,IDC_EDIT,dwVal,FALSE
.elseif ax == IDC_BUTTON_DEC
dec dwVal
invoke SetDlgItemInt,hWnd,IDC_EDIT,dwVal,FALSE
.elseif ax == IDM_EXIT
;invoke MessageBoxA ,NULL,addr szText,addr szCaption,MB_OK
invoke EndDialog,hWnd,NULL
.endif
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
;***********主程序入口**************
start:
;------获取该程序实例句柄------
invoke GetModuleHandle,NULL
;invoke MessageBoxA ,NULL,addr szText,addr szCaption,MB_OK
;------创建模式对话框----------
invoke DialogBoxParam,eax,IDD_DIALOG_MML,NULL,offset DlgProc,NULL
invoke MessageBoxA ,NULL,addr szText,addr szCaption,MB_OK
;------------------------------
invoke ExitProcess,NULL
end start
下面是资源文件,只要稍微一看你就可以了解运行的界面是什么样子的
-------------------------------------------------------------------------------------------------
#include "resource.h"
#define IDD_DIALOG_MML 101
#define IDR_MENU_DLG 102
#define IDC_EDIT 1000
#define IDC_BUTTON_ADD 1001
#define IDC_BUTTON_DEC 1002
#define IDM_EXIT 40001
#define IDC_STATIC -1
///////////////////////////////////////////
///Dialog
///
IDD_DIALOG_MML DIALOG DISCARDABLE 0,0,170,60
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Model Dialog"
MENU IDR_MENU_DLG
FONT 9,"Tahoma"
BEGIN
EDITTEXT IDC_EDIT,7,7,156,15,ES_AUTOHSCROLL
PUSHBUTTON "增 加",IDC_BUTTON_ADD,21,37,50,11
PUSHBUTTON "减 少",IDC_BUTTON_DEC,95,37,50,11
GROUPBOX "操作",IDC_STATIC,7,26,156,27
END
///////////////////////////////////////////
///Menu
///
IDR_MENU_DLG MENU DISCARDABLE
BEGIN
POPUP "File"
BEGIN
MENUITEM "E&Exit",IDM_EXIT
END
END