请教 回调函数的使用方法(不知道是指针函数还是函数指针)

挥剑断影 2014-03-17 05:38:09
我买了块视频采集卡,支持二次开发的,提供了一大堆的函数调用,但菜鸟的我连调用都不会;
函数的介绍是这样的:

typedef void (CALLBACK *PrcCapSourceStream)( long lnCardID, long pBuf, long lnWidth, long lnHeight, long lnBiCount );
说明: 捕获原始流回调.
参数: lnCardID: 返回的卡号.
pBuf: 缓冲区.
lnWidth: 视频宽度.
lnHeight: 视频高度.
lnBiCount: 每一象素所需字节数.
返回值:无

我现在要在程序中调用他,不知道如何调用? 另外这边的缓冲区pBuf在函数申明里面申明成了long类型,这儿不应该是数组的指针吗?

请教一下各位!
...全文
417 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
hushoubo 2014-03-19
  • 打赏
  • 举报
回复
既然人家都提供了DEMO,那你就好好看看撒
引用 9 楼 abczhangqing 的回复:
[quote=引用 8 楼 hushoubo 的回复:] 厂家应该提供了开发库撒,里面有头文件被库吧,一般情况下,库的初始化里面就可以传入回调函数
我刚学vc,对这些实在是不懂,什么回调函数实在是搞不明白,厂家提供了vs的demo,里面应该都是初始化好了的,只需要直接用就行了![/quote]
挥剑断影 2014-03-18
  • 打赏
  • 举报
回复
引用 17 楼 mayudong1 的回复:
回调函数用法都是固定的,它已经给出了函数的参数列表和返回值,你定义一个这样的函数就行,然后肯定还有另一个地方需要设置回调函数的,在这里把你定义的函数名作为参数传递进去就行 指针的长度为4个byte,long型也是4个byte,可以直接强转的
还有这样一个函数,不知道是否有关联,该怎么使用啊,我一头雾水哦! HRESULT WINAPI VCAEnableCapSourceStream(int nCards, BOOL bCapStream, VideoFieldType enVideoFieldType, PrcCapSourceStream pCapStream) 说明: 设置视频原始回调格式. 参数: nCards: 卡号. bCapStream:是否允许回调. enVideoFieldType:场类型 pCapStream:原始回调函数指针 返回值:S_OK:成功. S_FALSE:失败.
mayudong1 2014-03-18
  • 打赏
  • 举报
回复
回调函数用法都是固定的,它已经给出了函数的参数列表和返回值,你定义一个这样的函数就行,然后肯定还有另一个地方需要设置回调函数的,在这里把你定义的函数名作为参数传递进去就行 指针的长度为4个byte,long型也是4个byte,可以直接强转的
schlafenhamster 2014-03-18
  • 打赏
  • 举报
回复
BYTE buffer[1024]; (long) &Buf
神-气 2014-03-18
  • 打赏
  • 举报
回复
引用 13 楼 abczhangqing 的回复:
[quote=引用 12 楼 schlafenhamster 的回复:] #define CALLBACK __stdcall 在这里 是厂家 胡说,什么 回调 就是 一个 API #define WINAPI __stdcall 或者 直接用 __stdcall typedef void (__stdcall *PrcCapSourceStream)( long lnCardID, long pBuf, long lnWidth, long lnHeight, long lnBiCount );
我想知道怎么用他这接口啊! 另外他们的函数中定义的缓冲区pBuf为什么是long类型的,怎么不是指针呢?这又该如何使用呢?typedef void (CALLBACK *PrcCapSourceStream)( long lnCardID, long pBuf, long lnWidth, long lnHeight, long lnBiCount ); [/quote] 32位系统下,sizeof(long) = sizeof(void*)
xiaohuh421 2014-03-18
  • 打赏
  • 举报
回复
既然这是一个函数指针, 就是让你实现这样一个函数比如PrcCapSourceStream, 然后在这个库的某个函数中会让你传入这个函数的指针, 然后库中会自动调用你指定的这个函数PrcCapSourceStream了.
挥剑断影 2014-03-18
  • 打赏
  • 举报
回复
引用 12 楼 schlafenhamster 的回复:
#define CALLBACK __stdcall 在这里 是厂家 胡说,什么 回调 就是 一个 API #define WINAPI __stdcall 或者 直接用 __stdcall typedef void (__stdcall *PrcCapSourceStream)( long lnCardID, long pBuf, long lnWidth, long lnHeight, long lnBiCount );
我想知道怎么用他这接口啊! 另外他们的函数中定义的缓冲区pBuf为什么是long类型的,怎么不是指针呢?这又该如何使用呢?typedef void (CALLBACK *PrcCapSourceStream)( long lnCardID, long pBuf, long lnWidth, long lnHeight, long lnBiCount );
schlafenhamster 2014-03-18
  • 打赏
  • 举报
回复
#define CALLBACK __stdcall 在这里 是厂家 胡说,什么 回调 就是 一个 API #define WINAPI __stdcall 或者 直接用 __stdcall typedef void (__stdcall *PrcCapSourceStream)( long lnCardID, long pBuf, long lnWidth, long lnHeight, long lnBiCount );
挥剑断影 2014-03-18
  • 打赏
  • 举报
回复
引用 6 楼 ADF1230 的回复:
[quote=引用 5 楼 abczhangqing 的回复:] [quote=引用 1 楼 ADF1230 的回复:] 强转一下就好了。 你是上帝,找客服问。
如何强转?客服不理呢![/quote] 你写一个类似下面的函数。 void CALLBACK my_PrcCapSourceStream( long lnCardID, long pBuf, long lnWidth, long lnHeight, long lnBiCount ); { //做你想做的 unsigned char* pBuffer = (unsigned char*)pBuf; if(0==InCardID) { FILE* fpDump = fopen("dump.dara","wb"); const long bufsize = InWidth*InHeight*InBiCount/8; fwrite(fpDump,pBuffer,bufsize ,1); fclose(fpDump); } }[/quote] 我还有点不理解,他用来存数据的缓冲区怎么是各long类型的pBuf,而不是指针了,这样用可以吗?
神-气 2014-03-18
  • 打赏
  • 举报
回复
引用 7 楼 abczhangqing 的回复:
[quote=引用 6 楼 ADF1230 的回复:] [quote=引用 5 楼 abczhangqing 的回复:] [quote=引用 1 楼 ADF1230 的回复:] 强转一下就好了。 你是上帝,找客服问。
如何强转?客服不理呢![/quote] 你写一个类似下面的函数。 void CALLBACK my_PrcCapSourceStream( long lnCardID, long pBuf, long lnWidth, long lnHeight, long lnBiCount ); { //做你想做的 unsigned char* pBuffer = (unsigned char*)pBuf; if(0==InCardID) { FILE* fpDump = fopen("dump.dara","wb"); const long bufsize = InWidth*InHeight*InBiCount/8; fwrite(fpDump,pBuffer,bufsize ,1); fclose(fpDump); } }[/quote] 写这个函数与厂家给的函数接口 typedef void (CALLBACK *PrcCapSourceStream)( long lnCardID, long pBuf, long lnWidth, long lnHeight, long lnBiCount ); 有联系吗? 我调用你给的那段函数,厂家给的函数会被调用吗? 感觉好奇怪哦, 两函数似乎是没什么联系啊![/quote] 这函数是厂家的lib会在满足一定条件下自动调用的。 API应该有类似于SetCallBack(void (CALLBACK *PrcCapSourceStream)( long lnCardID, long pBuf, long lnWidth, long lnHeight, long lnBiCount ))这样的函数。 你应该学一学C语言、
挥剑断影 2014-03-18
  • 打赏
  • 举报
回复
引用 8 楼 hushoubo 的回复:
厂家应该提供了开发库撒,里面有头文件被库吧,一般情况下,库的初始化里面就可以传入回调函数
我刚学vc,对这些实在是不懂,什么回调函数实在是搞不明白,厂家提供了vs的demo,里面应该都是初始化好了的,只需要直接用就行了!
hushoubo 2014-03-18
  • 打赏
  • 举报
回复
厂家应该提供了开发库撒,里面有头文件被库吧,一般情况下,库的初始化里面就可以传入回调函数
挥剑断影 2014-03-18
  • 打赏
  • 举报
回复
引用 6 楼 ADF1230 的回复:
[quote=引用 5 楼 abczhangqing 的回复:] [quote=引用 1 楼 ADF1230 的回复:] 强转一下就好了。 你是上帝,找客服问。
如何强转?客服不理呢![/quote] 你写一个类似下面的函数。 void CALLBACK my_PrcCapSourceStream( long lnCardID, long pBuf, long lnWidth, long lnHeight, long lnBiCount ); { //做你想做的 unsigned char* pBuffer = (unsigned char*)pBuf; if(0==InCardID) { FILE* fpDump = fopen("dump.dara","wb"); const long bufsize = InWidth*InHeight*InBiCount/8; fwrite(fpDump,pBuffer,bufsize ,1); fclose(fpDump); } }[/quote] 写这个函数与厂家给的函数接口 typedef void (CALLBACK *PrcCapSourceStream)( long lnCardID, long pBuf, long lnWidth, long lnHeight, long lnBiCount ); 有联系吗? 我调用你给的那段函数,厂家给的函数会被调用吗? 感觉好奇怪哦, 两函数似乎是没什么联系啊!
schlafenhamster 2014-03-18
  • 打赏
  • 举报
回复
HRESULT WINAPI VCAEnableCapSourceStream(int nCards, BOOL bCapStream, VideoFieldType enVideoFieldType, PrcCapSourceStream pCapStream) 这个函数才看出 “回调” 的 问题 其中: PrcCapSourceStream pCapStream 就是 所谓的 “回调” 函数 的地址, “它已经给出了函数的参数列表和返回值,你定义一个这样的函数就行,(17楼)” 即你要 写 一个 回调 函数 (这个函数将由 dll 调用, 你 不会调用) 即: void CALLBACK my_PrcCapSourceStream( long lnCardID, long pBuf, long lnWidth, long lnHeight, long lnBiCount ); (11楼) dll 调用 你这个函数 将会 把 Stream 复制到 你 pBuf 里。 所以: 1. 写个函数 my_PrcCapSourceStream 2. 调用 VCAEnableCapSourceStream 设置 “回调” 函数 3. 在 你的 回调 函数中 得到 Stream
神-气 2014-03-17
  • 打赏
  • 举报
回复
引用 5 楼 abczhangqing 的回复:
[quote=引用 1 楼 ADF1230 的回复:] 强转一下就好了。 你是上帝,找客服问。
如何强转?客服不理呢![/quote] 你写一个类似下面的函数。 void CALLBACK my_PrcCapSourceStream( long lnCardID, long pBuf, long lnWidth, long lnHeight, long lnBiCount ); { //做你想做的 unsigned char* pBuffer = (unsigned char*)pBuf; if(0==InCardID) { FILE* fpDump = fopen("dump.dara","wb"); const long bufsize = InWidth*InHeight*InBiCount/8; fwrite(fpDump,pBuffer,bufsize ,1); fclose(fpDump); } }
挥剑断影 2014-03-17
  • 打赏
  • 举报
回复
引用 1 楼 ADF1230 的回复:
强转一下就好了。 你是上帝,找客服问。
如何强转?客服不理呢!
挥剑断影 2014-03-17
  • 打赏
  • 举报
回复
引用 2 楼 hushoubo 的回复:
你应该按照回调接口的定义,实现它,然后传给库,这样有数据的时候就会自动调用你的函数
如何实现它 又怎么传给库啊?不明白哦!
挥剑断影 2014-03-17
  • 打赏
  • 举报
回复
如何强转?客服不理呢! 如何实现它 又怎么传给库啊?不明白哦!
hushoubo 2014-03-17
  • 打赏
  • 举报
回复
你应该按照回调接口的定义,实现它,然后传给库,这样有数据的时候就会自动调用你的函数
神-气 2014-03-17
  • 打赏
  • 举报
回复
强转一下就好了。 你是上帝,找客服问。

16,471

社区成员

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

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

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