linyulun
驱动小牛
驱动小牛
  • 注册日期2002-03-18
  • 最后登录2014-05-09
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望61点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1339回复:9

50分请教一个错误问题

楼主#
更多 发布于:2002-06-06 11:47
在编译驱动时有这样一个错误:  
IoSetCompletionRoutine(   R1394_SynchCompletionRoutine,        
  (PVOID) &Event,
  TRUE,
  TRUE,
  TRUE
  );

错误提示:
cannot convert from \'long (__stdcall *)(struct _DEVICE_OBJECT *,struct _IRP *,struct _KEVENT *)\' to \'long (__stdcall *)(struct _DEVICE_OBJECT *,struct _IRP *,void *)\'

这是什么原因,我搞了好久没解决.
magicx
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2014-08-18
  • 粉丝1
  • 关注0
  • 积分-14分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-06 12:50
在编译驱动时有这样一个错误:  
IoSetCompletionRoutine(   R1394_SynchCompletionRoutine,        
  (PVOID) &Event,
  TRUE,
  TRUE,
  TRUE
  );

错误提示:
cannot convert from \'long (__stdcall *)(struct _DEVICE_OBJECT *,struct _IRP *,struct _KEVENT *)\' to \'long (__stdcall *)(struct _DEVICE_OBJECT *,struct _IRP *,void *)\'

这是什么原因,我搞了好久没解决.


linyulun兄:

VOID
IoSetCompletionRoutine
(
  IN PIRP  Irp,
  IN PIO_COMPLETION_ROUTINE  CompletionRoutine,
  IN PVOID  Context,
  IN BOOLEAN  InvokeOnSuccess,
  IN BOOLEAN  InvokeOnError,
  IN BOOLEAN  InvokeOnCancel
);

你上面的好像是少了个:IN PIRP  Irp 项哦!

如不是此问题,则建议先“删除”其他的中间编译结果(文件)后,再来。

祝好运!

嘿嘿,50分吗?。。。。。。。。。。。

 :)
[color=red]大头鬼! :P[/color]
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-06 12:50
VOID
   IoSetCompletionRoutine(
       IN PIRP Irp,
       IN PIO_COMPLETION_ROUTINE CompletionRoutine,
       IN PVOID Context,
       IN BOOLEAN InvokeOnSuccess,
       IN BOOLEAN InvokeOnError,
       IN BOOLEAN InvokeOnCancel
       );
你应该如此使用:

 IoSetCompletionRoutine(Irp,
                        R1394_SynchCompletionRoutine,
                       (PVOID) &Event, // pass the context array element to completion routine
                    TRUE,    // invoke on success
                    TRUE,    // invoke on error
                    TRUE);   // invoke on cancellation of the Irp

犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
Tomgin
驱动牛犊
驱动牛犊
  • 注册日期2001-08-08
  • 最后登录2005-06-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-06 13:02
错误提示:
cannot convert from \'long (__stdcall *)(struct _DEVICE_OBJECT *,struct _IRP *,struct _KEVENT *)\' to \'long (__stdcall *)(struct _DEVICE_OBJECT *,struct _IRP *,void *)\'


看错误提示,应该是你的
R1394_SynchCompletionRoutine 这个函数的原型不对。

你是
long  R1394_SynchCompletionRoutine( PDEVICE_OBJECT, PIRP, PKEVENT );

系统要求

long  R1394_SynchCompletionRoutine( PDEVICE_OBJECT, PIRP, PVOID );
 

努力呀,还有许多东西不会呢。
linyulun
驱动小牛
驱动小牛
  • 注册日期2002-03-18
  • 最后登录2014-05-09
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望61点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-06 15:25
不好意思,我传问题是写错了
IoSetCompletionRoutine(Irp,
R1394_SynchCompletionRoutine,
(PVOID) &Event,
TRUE,
TRUE,
TRUE);

问题还在,(PVOID) &Event 这个类型不能强制转换吗?
linyulun
驱动小牛
驱动小牛
  • 注册日期2002-03-18
  • 最后登录2014-05-09
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望61点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-06 15:34
TO Tomgin 兄:
 我看了DDK的例子,里面是这样定义
t1394Diag_SynchCompletionRoutine(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             Irp,
    IN PKEVENT          Event
    )

它编译的时候为什么没错?

不胜感激
magicx
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2014-08-18
  • 粉丝1
  • 关注0
  • 积分-14分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-06-06 17:00
TO Tomgin 兄:
 我看了DDK的例子,里面是这样定义
t1394Diag_SynchCompletionRoutine(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             Irp,
    IN PKEVENT          Event
    )

它编译的时候为什么没错?

不胜感激
 


嘿嘿,这样看来问题在于你的R1394_SynchCompletionRoutine声明或引用,而不在IoSetCompletionRoutine。

NTSTATUS
(*PIO_COMPLETION_ROUTINE)
(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
);

你查一下R1394_SynchCompletionRoutine涉及的地方是否,还有没进行“类型转化”!struct _KEVENT *  ---》 void *

应该可解决!

祝好运!

 :)
[color=red]大头鬼! :P[/color]
magicx
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2014-08-18
  • 粉丝1
  • 关注0
  • 积分-14分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-06-06 17:04
不好意思,我传问题是写错了
IoSetCompletionRoutine(Irp,
R1394_SynchCompletionRoutine,
(PVOID) &Event,
TRUE,
TRUE,
TRUE);

问题还在,(PVOID) &Event 这个类型不能强制转换吗?


有点糊涂了。。。。。。

是R1394_SynchCompletionRoutine还是t1394Diag_SynchCompletionRoutine???


 :)
[color=red]大头鬼! :P[/color]
Tomgin
驱动牛犊
驱动牛犊
  • 注册日期2001-08-08
  • 最后登录2005-06-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-06-07 08:09
看了一下,ddk 中的代码,

的却是那样写的,你的代码也不应该出错。


这种错误,一般是 设置编译器的警告级别 时会出现这种错误。
你看看 make 文件 和 source 文件是否与 ddk 中有不同的地方。


如果,一样, 那就不好办了,
只有看看你的所有代码和工程配置, 看看是否别的错误导致出现这个错误的。




努力呀,还有许多东西不会呢。
linyulun
驱动小牛
驱动小牛
  • 注册日期2002-03-18
  • 最后登录2014-05-09
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望61点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-06-07 08:48
问题解决了.我在R1394_.....前加了依据强制类型转换(PIO_COMPLETION_ROUTINE)R1394_SynchCompletionRoutine

问题就搞定了.另:R1394_SynchCompletionRoutine时我自己写的驱动里的,不是例子
游客

返回顶部