函数指针做形参问题

lxr5109 2010-09-14 08:01:04
要调用一个函数,原型是:
MVCAPI DWORD WINAPI MVC_SetStreamHOOK(DWORD CardNo,StreamProc lpStreamFun, PVOID pUserData);

其中第二个参数StreamProc是一个函数指针,定义是这样的:
typedef UINT (WINAPI *StreamProc)(WORD wHWCardNo,MVCFRAMEINFO m_FrameInfo, PVOID pUserData);

现在有一个函数
UINT WINAPI a(WORD wHWCardNo,MVCFRAMEINFO m_FrameInfo, PVOID pUserData);

我想把这个函数作为要调用函数的第二个参数,我是这么写的:
MVC_SetStreamHOOK(m_iCurDevNo,a,this);

编译时报错说error C2664: 'MVC_SetStreamHOOK' : cannot convert parameter 2 from 'unsigned int (unsigned short,struct _MVCFRAMEINFO_,void *)' to 'unsigned int (__stdcall *)(unsigned short,struct _MVCFRAMEINFO_,void *)'

这是什么原因啊?函数名可以作为传递函数指针的参数吗?
谢谢。
...全文
290 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wujita01 2013-03-13
  • 打赏
  • 举报
回复
微视采集卡的函数呀。我也在用。 我使用的时候没有遇到这个问题。可以看看自带的实例。
lxr5109 2010-09-15
  • 打赏
  • 举报
回复
我发现问题所在了,是我没说清楚,a函数是一个类的成员函数,成员函数的函数指针和普通函数的函数指针不同,包含了对象信息,不能直接传递的。谢谢上面各位了。
lxr5109 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hastings 的回复:]

仪~~~这个神奇~~~我知道模板元编程里有函数类型和函数指针类型,两者不等同的。
你这里的编译错误是函数类型不能转为函数指针类型~~
但是照理说函数名作为参数传递给函数是可以转化为指针的呀~~
难道说你前面的那个MVCAPI 宏惹的祸?
[/Quote]

应该不是MVCAPI的宏的问题,这个是导出dll的吧,定义是这样的:
#define MVCAPI extern "C" __declspec (dllexport)

我猜是不是因为(__stdcall *)写在一个括号里的关系啊?就像1楼说的,__stdcall放在外面大概就没事。但问题是我现在不能改动这个东西,那还有什么办法可以实现调用吗?
lxr5109 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 namelij 的回复:]

上面一个 为word 一
个 dword不知道影响不

还有,函数名可以作为参数,回调函数这样的
[/Quote]

对呀,这个就是一个回调函数,但是不知道为什么会出现无法转换成"*"的错误……
hastings 2010-09-14
  • 打赏
  • 举报
回复
仪~~~这个神奇~~~我知道模板元编程里有函数类型和函数指针类型,两者不等同的。
你这里的编译错误是函数类型不能转为函数指针类型~~
但是照理说函数名作为参数传递给函数是可以转化为指针的呀~~
难道说你前面的那个MVCAPI 宏惹的祸?
  • 打赏
  • 举报
回复
上面一个 为word 一
个 dword不知道影响不

还有,函数名可以作为参数,回调函数这样的
lxr5109 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 namelij 的回复:]

C/C++ code

typedef UINT (WINAPI *StreamProc)(WORD wHWCardNo,MVCFRAMEINFO m_FrameInfo, PVOID pUserData);

改为
typedef UINT WINAPI( *StreamProc)(WORD wHWCardNo,MVCFRAMEINFO m_FrameInfo, PVOID pUserDat……
[/Quote]

这个定义是别人公司产品的sdk里的定义,我觉得不怎么能改吧……主要是看看调用上和传递参数上有没有什么解决的办法啊?
  • 打赏
  • 举报
回复

typedef UINT (WINAPI *StreamProc)(WORD wHWCardNo,MVCFRAMEINFO m_FrameInfo, PVOID pUserData);

改为
typedef UINT WINAPI( *StreamProc)(WORD wHWCardNo,MVCFRAMEINFO m_FrameInfo, PVOID pUserData);

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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