amei
驱动牛犊
驱动牛犊
  • 注册日期2002-03-21
  • 最后登录2006-11-10
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1355回复:8

参数无法从应用程序传到vxd的RO_OpenCreateFile函数?

楼主#
更多 发布于:2002-05-04 15:53
我要用vxd 打开一个文件,假设文件为:e:\\test.txt
我的应用程序为:
    HANDLE hDevice;
    PCHAR filename=\"e:\\test.txt\";
if(! DeviceIoControl(hDevice,OPENFILE,filename,
     strlen(filename)+1,NULL,0,NULL,NULL))
   { fprintf(stderr,\"can not openfile,error=08ld\\n\",
                  GetLastError());
  exit(1);}
vxd.cpp为:
DWORD FileDevice::OnW32DeviceIoControl(PIOCTLPARAMS p)
{  switch(p->dioc_IOCtlCode)
      {  case DIOC_OPEN:  return 0;
         case DIOC_CLOSEHANDLE: return 0;
         case OPENFILE:
         { WORD error;
           HANDLE h;
BYTE actionTaken;
           h=R0_OpenCreateFile(
TRUE,
          (PCHAR)->dioc_InBuf,
OPEN_ACCESS_READONLY,
ATTR_READONLY,
ACTION_IFNOTEXISTS_CREATE,
R0_NO_CACHE,
&error,
           &actionTaken);
 if(error==0)   m_LogFileHandle=h;
 else    m_LogFileHandle=(HANDLE)-1;
  break;
}
....
}
}
我是按照vtoolsd的帮助文件C:\\Program Files\\NuMega\\VtoolsD\\Examples\\cpp\\r0fileio编写的
但是我无法打开文件。用GetLastFile()捕捉错误号为87,我查error.h:
#define ERROR_INVALID_PARAMETER   87
我的错误究竟在哪呢?请教各位大侠!!!!
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-05-04 16:55
HDEVICE没有初始化. 先打开你的VXD. 然后在DEVICEIOCONTROL.
跟一下VXD. 对于IOCTL CODE 0 , 你必须回答SUCCESS.
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-05-04 17:30
PCHAR filename=\"e:\\test.txt\";
 
应该是e:\\\\test.txt吧?少了个\\,当然不认识啦!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-05-04 19:01
nod
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
amei
驱动牛犊
驱动牛犊
  • 注册日期2002-03-21
  • 最后登录2006-11-10
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-05-06 19:31
HDEVICE没有初始化. 先打开你的VXD. 然后在DEVICEIOCONTROL.
跟一下VXD. 对于IOCTL CODE 0 , 你必须回答SUCCESS.



不明白是否能将得更清楚一些??
amei
驱动牛犊
驱动牛犊
  • 注册日期2002-03-21
  • 最后登录2006-11-10
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-05-06 20:01
我要用vxd 打开一个文件,假设文件为:e:\\test.txt
我的应用程序为:
    HANDLE hDevice;
    PCHAR filename=\"e:\\test.txt\";
    
   /char name[20];

if(! DeviceIoControl(hDevice,OPENFILE,filename,
     strlen(filename)+1,name,0,NULL,NULL))
   { fprintf(stderr,\"can not openfile,error=08ld\\n\",
                  GetLastError());
  exit(1);}

   /printf(\"%s\\n\",name);

vxd.cpp为:
DWORD FileDevice::OnW32DeviceIoControl(PIOCTLPARAMS p)
{  switch(p->dioc_IOCtlCode)
      {  case DIOC_OPEN:  return 0;
         case DIOC_CLOSEHANDLE: return 0;
         case OPENFILE:
         { WORD error;
           HANDLE h;
BYTE actionTaken;

         /  PCHAR fname;        

           h=R0_OpenCreateFile(
TRUE,
          (PCHAR)p->dioc_InBuf,
OPEN_ACCESS_READONLY,
ATTR_READONLY,
ACTION_IFNOTEXISTS_CREATE,
R0_NO_CACHE,
&error,
           &actionTaken);

         /fname=(PCHAR)p->dioc_InBuf;
        /strcpy((char *)p->dioc_OutBuf,fname);

 if(error==0)   m_LogFileHandle=h;
 else    m_LogFileHandle=(HANDLE)-1;
  break;
}
....
}
}
我是按照vtoolsd的帮助文件C:\\Program Files\\NuMega\\VtoolsD\\Examples\\cpp\\r0fileio编写的
但是我无法打开文件。用GetLastFile()捕捉错误号为87,我查error.h:
#define ERROR_INVALID_PARAMETER   87
我的错误究竟在哪呢?请教各位大侠!!!!
 


我没有把e:\\test.txt改为e:\\\\test.txt,重启了一下机器,就不再提示有错误了,但我不知道我是否把文件名穿过去了,所以我试着将传给vxd的文件名再穿回应用程序,但应用程序收到的却是乱码(烫烫烫烫烫)。于是我做了一个小程序在vxd中实现字符串连接并将结果返回应用程序,得到的也是一堆乱码?我的问题是
1。 我想看一下我的vxd.cpp文件中的(PCHAR)p->dioc_InBuf的内容是不是我所传的e:\\test.txt,在vtoolsd中用什么函数,怎么用?
2。 我的方法为什么得到的结果是乱码?程序见上,前面\"/\"的是我后加来取回文件名的
这些问题使我的五一节过得糟透了,我实在是搞不明白了,请大家指教了。
 
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-05-06 20:05
我这人习惯不好. 看到第一个的错误之后, 后面的东西就不看了,
回过头来, 再看看后面的, 连你的意图都看不明白了.

zydcat回答的虽然苛刻, 但你确实要仔细读读VXD的文档资料.

彻底讲明白VXD, 不是几千字能解决的. 自己装个DRIVER STUDIO, 用VTOOLD的自动代码生成工具生成一个最简单的VXD, 参照文档理解一下可能更有收获.

把论坛ABC的资料从头到尾看看, 会有收获的.
还有就是耐心把 SDK的 CREATEFILE,DEVICEIOCONTROL的全部说明看完.
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-05-06 20:32
你装了softice吗?用它跟一下,就可以看到了。
amei
驱动牛犊
驱动牛犊
  • 注册日期2002-03-21
  • 最后登录2006-11-10
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-05-06 21:11
我这人习惯不好. 看到第一个的错误之后, 后面的东西就不看了,
回过头来, 再看看后面的, 连你的意图都看不明白了.

zydcat回答的虽然苛刻, 但你确实要仔细读读VXD的文档资料.

彻底讲明白VXD, 不是几千字能解决的. 自己装个DRIVER STUDIO, 用VTOOLD的自动代码生成工具生成一个最简单的VXD, 参照文档理解一下可能更有收获.

把论坛ABC的资料从头到尾看看, 会有收获的.
还有就是耐心把 SDK的 CREATEFILE,DEVICEIOCONTROL的全部说明看完.
 


我只是想做一个vxd,打开一个指定的文件将其读到内存并以双字的形式输出到打印机端口。可能是我太想急于完成这个程序,我接触vxd和vc不到三个月,有好多不明白的地方。我一直在看vtoolsd的help,和msdn,ABC我也也都看过了,我一直在努力的学习vxd,谢谢你的指导。vxd比我想象得要难得多了。
游客

返回顶部