参数在哪(CallBack)?

flyhigh 2000-11-06 05:40:00
CallBack是带几个参数的函数指针, 可是调用时往往只用到函数名不知哪位大侠知道参数怎么传递?
...全文
554 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjf 2000-11-10
  • 打赏
  • 举报
回复
更正:
typdef void (CALLBACK *YourCallBack)(int param);

顺便说一下:
CALLBACK没什么神秘的,它只不过是__stdcall的一个宏定义罢了。

wjf 2000-11-10
  • 打赏
  • 举报
回复
如果这样你先要取得CallBack函数的指针(通常是作为你说的过程的一个参数).for example:

//定义回调函数;
typdef void (CALLBACK *YourCallBack(int param);

//你的过程:
void YourProc(...,YourCallBack yourcallback)
{
int yourparam;
......
//调用回调函数;
yourcallback(yourparam);
......
}

flyhigh 2000-11-07
  • 打赏
  • 举报
回复
各位大哥:按以上说法,如果我自己要写一个过程要用到CallBack该怎么办?
xiaozuo 2000-11-06
  • 打赏
  • 举报
回复
CALLBACK是操作系统的一个回调函数,参数调用的方法有操作系统规定。
程序运行时调用函数的方法很多,C++和PASCAL就有不同的调用方法,这些方法主要涉及函数参数的传递方法。参数调用是通过堆栈实现的,堆栈中参数的顺序与调用协议有关,VC中许多函数前面都有调用的协议说明,例如PASCAL,stdcall等等。调用的函数名称除了表示函数指令所在的起始地址外,还包括堆栈的内容,至于一共包含多少单元的内容,要看函数的类型,就像调用一个数主要看数组的类型一样。所以回调函数一定要严格按照要求构建,是绝对不可以自己胡编乱造的。
土豆 2000-11-06
  • 打赏
  • 举报
回复
在调用的时候,是系统将参数传递给你的函数,而不是你自己传递参数。
土豆 2000-11-06
  • 打赏
  • 举报
回复
CALLBACK的函数不是你调用,而是有你将函数指针传递给系统的操作,有系统操作来调用你的函数的。比如在easypaper老兄的发言中,你将EnumFontsProc函数指针传递给系统的EnumFonts函数,在执行EnumFonts的时候,他会执行你的EnumFontProc函数。没玫举一种字体,你的EnumFontProc函数就被调用一次。
dingsg 2000-11-06
  • 打赏
  • 举报
回复

参数是通过内存指针传送的
例子:

BOOL OpenTheFile (HWND hWndRichEdit, int iAttrib, char
*lpszFileName)
{
HFILE hFile;
OFSTRUCT of;
EDITSTREAM eStream;

if (hFile = OpenFile (lpszFileName, &of, OF_READ))
{
// dwCookie is an app-defined value that holds
// the handle to the file.
eStream.dwCookie = hFile;
eStream.pfnCallback = EditStreamCallback;
eStream.dwError = 0;
SendMessage (hWndRichEdit, EM_STREAMIN, (WPARAM)iAttrib,
(LPARAM)&eStream);

// Reset the dirty bit.
SendMessage (hWndRichEdit, EM_SETMODIFY, (WPARAM)TRUE, OL);

CloseHandle ((HANDLE)hFile);
return TRUE;
}
return FALSE;
}

DWORD CALLBACK EditStreamCallback (DWORD dwCookie,
LPBYTE pbBuff, LONG cb, LONG FAR *pcb)
{
ReadFile ((HANDLE)dwCookie, pbBuff, cb, pcb, NULL);
if (*pcb < cb)
return 0; // file has been fully read in
else
return (DWORD) *pcb; // more to read
}


sxbyl 2000-11-06
  • 打赏
  • 举报
回复
又是CALLBACK!!!
leer说得对,CALLBACK指是一种类型,可以简单的看作是特殊的消息相应函数,一般来说是当某特定事件发生时由系统调用,具体参数个数、类型由调用者决定,不是固定的。你在MSDN中搜一下标题中有CALLBACK的内容,可以发现有很多。学VC一定要多看MSDN!!!
老魏2006 2000-11-06
  • 打赏
  • 举报
回复
这是一个例子,用来枚举系统字体
int __stdcall EnumFontsProc(TLogFontA &LogFont, TTextMetricA &/*TextMetric*/,
int /*FontType*/, Pointer Data)
{
TCharsetObject *FontCharset;
FontCharset = new TCharsetObject((int)LogFont.lfCharSet);
((TStrings *)Data)->AddObject((AnsiString)LogFont.lfFaceName,FontCharset);
return 1;
}

void CMyView::GetFontNames(void)
{
HDC hDC = GetDC(0);
void * cTmp = (void *)FontName->Items;
EnumFonts(hDC, NULL, (FONTENUMPROC) EnumFontsProc, (long) cTmp );
ReleaseDC(0,hDC);
}
坎坷的菜贩 2000-11-06
  • 打赏
  • 举报
回复
CALLBACK是一种函数调用类型(calling convention),通常用于声明消息处理函数,如声明窗口的消息处理函数:
DWORD CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
因为CALLBACK函数是由系统调用的,因此它的参数是系统约定的。
andygood 2000-11-06
  • 打赏
  • 举报
回复

BTW:callback函数并不只是让操作系统来进行调用的,如果你需要你可以自己写调用函数。一切都不神秘。

andygood 2000-11-06
  • 打赏
  • 举报
回复

“调用时往往只用到函数名”是什么意思?不太明白。

指针的概念你真正懂吗?函数指针就是指针,也就是内存中的某个地址。函数传递参数的时候可以传递指针变量,当然也能传递函数指针变量了。调用函数根据这个指针调用callback函数,同时把参数传递过去。这个调用过程与普通函数的调用过程完全相同。

我想你的问题可能是对其形式不太明白吧,习惯了就行了。

leer 2000-11-06
  • 打赏
  • 举报
回复
callback好象是声明一种函数类型吧,指该函数是由操作系统来进行调用。反正据我所知是这样,如有不对还请指正。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧