阅读:3291回复:42
急救
主程序中有如下代码
pxy=new xy[1]; pz=new int[1]; pxy[1].x =40; pxy[1].y=80; if(DeviceIoControl(hDevice,ADDXY,&pxy[1],0,pz,0,0,NULL)) { fprintf(stderr,\"Failed to ADD\\n\"); exit(1); } printf(\"%d+%d=%d\\n\",pxy[1].x,pxy[1].y,*pz); VXD中: DWORD ApptovxdDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams) { xy * pxy; switch(pDIOCParams->dioc_IOCtlCode) { case DIOC_OPEN: case DIOC_CLOSEHANDLE: return DEVIOCTL_NOERROR; case ADDXY: pxy=(xy*) pDIOCParams->dioc_InBuf; *(int*)pDIOCParams->dioc_OutBuf=pxy->x+pxy->y; return 1; default: return -1; } 为什么在主程序中调用了VXD后*pz没有改变,即VXD根本没给*pz赋值 (时间很急,请高手不吝赐教) |
|
最新喜欢:dongju...
|
沙发#
发布于:2002-04-17 14:04
if(DeviceIoControl(hDevice,ADDXY,&pxy[1],0,pz,0,0,NULL))一句中,inputbuffer参数pxy本为指针为什么还要加&,去掉试试 如下: if(DeviceIoControl(hDevice,ADDXY,pxy[1],0,pz,0,0,NULL)) |
|
|
板凳#
发布于:2002-04-17 14:21
去掉后编译出错:
如下: D:\\VTOOLSD\\Bin\\callapptovxd.cpp(32) : error C2664: \'DeviceIoControl\' : cannot convert parameter 3 from \'struct xy\' to \'void *\' |
|
|
地板#
发布于:2002-04-17 14:31
deviceiocontrol的第4和第6个参数是输入和输出缓冲区的长度,怎么能为零。
|
|
|
地下室#
发布于:2002-04-17 15:20
去掉后编译出错: zydact说的对: 正确调用应该如下: DeviceIoControl(hDevice, ADDXY, (LPVOID)pxy, sizeof(xy), (LPVOID)pz, sizeof(int), &dwByteret, NULL); 按你的意思应该有如下定义: typedef struct { ... ... }xy,*pxy; 你还要定义一个 DWORD dwByteRet = 0L;以接受DeviceIoControl的返回字节数。 |
|
|
5楼#
发布于:2002-04-17 15:51
谢谢各位先.我相信调用过程现在应该没问题,但我这结果还是不对
输出40+80=-842150451. 而且我现在所有的通过DeviceIoControl来实现VC与VxD通信的程序都不能得到正确结果(VxD程序通过Debug monitor调试通过).是不是我的设置有问题.另外我发现我的DeviceIoControl的返回值总是0.这正常吗? 我在OnWin32DeviceIoControl中的每个case的返回值都改为1,结果得到的还是0,郁闷,谁帮帮我? |
|
|
6楼#
发布于:2002-04-17 16:03
返回非0值表示成功,0值失败
调用一下GetLastError()看一下什么错误 |
|
|
7楼#
发布于:2002-04-17 16:04
哦,想起来了,#define ADDXY CTL_CODE(FILE_DEVICE_UNKNOWN,1,METHOD_NEITHER,FILE_ANY_ACCESS)
我在VxD的cpp文件中定义了一个,在应用程序中也define了一下,不是这问题吧?? :P |
|
|
8楼#
发布于:2002-04-17 16:07
当然两边都要定义了
否则怎么找得到对应的函数 |
|
|
9楼#
发布于:2002-04-17 16:08
哇靠,我看的一本书居然告诉我返回0成功,真是误人子弟!faint!! :mad:
|
|
|
10楼#
发布于:2002-04-17 16:09
还是msdn最可靠
|
|
|
11楼#
发布于:2002-04-17 16:14
if(!DeviceIoControl(hDevice,ADDXY,(LPVOID)pxy,sizeof(xy),(LPVOID)pz,sizeof(int),&dwByteRet,NULL))
{ fprintf(stderr,\"Failed to ADD\\n\"); fprintf(stderr,\"cant load err=%d\\n\",GetLastError()); exit(1); } 结果得到 err=87;什么毛病? |
|
|
12楼#
发布于:2002-04-17 16:19
The parameter is incorrect.
|
|
|
13楼#
发布于:2002-04-17 16:27
不会吧,那该怎么写?
if(!DeviceIoControl(hDevice,ADDXY,(LPVOID)pxy,sizeof(xy),(LPVOID)pz,sizeof(int),&dwByteRet,NULL)) 还不行? [编辑 - 4/17/02 作者: trent] |
|
|
14楼#
发布于:2002-04-17 16:33
刚才少说了一句,vxd下的ioctl码和nt下定义方式不一样
你只需要在两边都按顺序定义就行了,如 #define PCI_Configure 2 #define Initial_INT 3 // Initial #define Clear_INT 4 #define INT_Status 5 注意从2开始 |
|
|
15楼#
发布于:2002-04-17 16:36
同意。
|
|
16楼#
发布于:2002-04-17 16:50
刚才少说了一句,vxd下的ioctl码和nt下定义方式不一样 我是菜鸟,厚脸皮问一下,ioctl码是什么东东,跟这问题有什么关系? 能不能详细点,我觉得自己都苯死了. :P :P |
|
|
17楼#
发布于:2002-04-17 17:19
就是你定义的,这是nt下的定义方式。
#define ADDXY CTL_CODE(FILE_DEVICE_UNKNOWN,1,METHOD_NEITHER,FILE_ANY_ACCESS) ADDXY就是你定义的ioctl码,系统是根据这个冬冬来找到你的应用程序所需要调用的驱动中的例程。 |
|
|
18楼#
发布于:2002-04-17 17:21
ioctrl码就是IO control code :)
就是你的ADDXY了。在VxD下,不需要象NT下那样,用 CTL_CODE(FILE_DEVICE_UNKNOWN,1,METHOD_NEITHER,FILE_ANY_ACCESS), 直接定义数字就可以的。 例如: #define PCI_Configure 2 #define Initial_INT 3 // Initial #define Clear_INT 4 #define INT_Status 5 在VxD: case PCI_Config: do... break; case INT_Status: break; |
|
19楼#
发布于:2002-04-17 17:47
哦 :o
|
|
|
上一页
下一页