阅读:2804回复:30
一个困惑了我一天的bug
我的应用主程序如下:
#include <stdio.h> #include <Windows.h> #include <winioctl.h> #include \"Addxy.h\" void main() { HANDLE hDevice; int z; xy *pxy; DWORD truesize; hDevice = CreateFile(\"\\\\\\\\.\\\\d:\\\\driverdevelop\\\\apptovxd\\\\apptovxd.vxd\", 0, 0, 0, CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0); if(hDevice == INVALID_HANDLE_VALUE) { fprintf(stderr, \"Cannot load VXD, error = %ld\\n\", GetLastError()); exit(1); } pxy = new xy; pxy->x = 40; pxy->y = 80; if(!DeviceIoControl(hDevice, ADDXY, pxy, sizeof(xy), &z, sizeof(int), &truesize, NULL)) { fprintf(stderr, \"Failed to ADD. error = %d\\n\", GetLastError()); exit(1); } printf(\"%d + %d = %d\\n\", pxy->x, pxy->y, z); CloseHandle(hDevice); } Addxy.h头文件如下: #define ADDXY CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_NEITHER, FILE_ANY_ACCESS) struct xy { int x; int y; }; 运行时,出现如下错误: Failed to ADD. error = 87 请问这是为什嬷? |
|
最新喜欢:jmzz00...
|
沙发#
发布于:2002-01-30 13:06
你打开设备有误。
hDevice = CreateFile(\"\\\\\\\\.\\\\d:\\\\driverdevelop\\\\apptovxd\\\\apptovxd.vxd\", 0, 0, 0, CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0); 你这是打开的apptovxd.vxd这个文件,而不是设备。 你可参考如下例子: hDevice = CreateFile(\"\\\\\\\\.\\\\apptovxd.vxd\", FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,OPEN_EXISTING, 0,NULL); MSDN中如是说:For communications resources, the dwCreationDisposition parameter must be OPEN_EXISTING, and the hTemplate parameter must be NULL. Read, write, or read-write access can be specified, and the handle can be opened for overlapped I/O. (CreateFile) |
|
板凳#
发布于:2002-01-30 14:03
我的这个程序,功能就是应用程序传递两个整数给VXD,VXD实现加法运算后,将结果回传给应用程序。
我已经照你的建议修改了CreateFile,但是还不行。这次的error=6。就是说handle不对。但是VXD的加载没有问题。 |
|
|
地板#
发布于:2002-01-30 15:01
你在VXD中所对应的IOcode的IOCTL中加打印语句,看是否运行到此?
|
|
地下室#
发布于:2002-01-30 15:45
你在VXD中所对应的IOcode的IOCTL中加打印语句,看是否运行到此? 我的Debug Monitor用不起来,所以打印看不出来。 我觉得,可能问题还是在CreateFile上,就是解决不了,又是一天了。 |
|
|
5楼#
发布于:2002-01-30 15:45
你把vxd放在应用程序所在的路经,然后
CreateFile(\"\\\\\\\\.\\\\apptovxd.vxd\", |
|
|
6楼#
发布于:2002-01-30 16:12
你这个是一本书上的例子,应该不会有错呀,我的机器上运行得很正常呀。
你能把VXD文件的代码也贴出来吗。 |
|
7楼#
发布于:2002-01-31 08:43
你把vxd放在应用程序所在的路经,然后 我的应用程序和VXD就在一个目录下。另外\\\\.\\指的路径是应用程序的当前路径吗? |
|
|
8楼#
发布于:2002-01-31 08:48
你这个是一本书上的例子,应该不会有错呀,我的机器上运行得很正常呀。 是啊,这是书上的例子,可是就是有问题,调试不通过,我的VXD程序和书上的一样,所以,这个问题真是很头疼。 |
|
|
9楼#
发布于:2002-01-31 11:27
这样吧,你用softice跟踪一下,
多设几个断点,看看问题到底出在那一步? 是driver还是app |
|
|
10楼#
发布于:2002-02-01 10:55
问题可能出在pxy上
把指针传下去好象就不大好 |
|
|
11楼#
发布于:2002-02-01 11:20
问题,还没有解决,放了一天。
pxy传指针有问题吗?事实上它和定义一个字符串数组,然后传首地址,性质是一样的。我不觉得这里会有问题。 我现在还没有用任何的调试工具,softice等,因为也没装,过两天装一个。 顺便问一下,不用管vxd那边怎样,只要应用层正确,运行都会正常,只是没有处理消息函数的功能,程序应该能顺利进行结束吧? |
|
|
12楼#
发布于:2002-02-01 13:39
为什么你不愿意把指针改掉试试呢?
不费什么劲吧 |
|
|
13楼#
发布于:2002-02-01 14:47
为什么你不愿意把指针改掉试试呢? #include <stdio.h> #include <Windows.h> #include <winioctl.h> #include \"Addxy.h\" void main() { HANDLE hDevice; // int z; char inbuf[256] = \"inbuf\", outbuf[256] = \"outbuf\"; DWORD truesize; OVERLAPPED o; // hDevice = CreateFile(\"\\\\\\\\.\\\\d:\\\\driverdevelop\\\\apptovxd\\\\apptovxd.vxd\", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); hDevice = CreateFile(\"\\\\\\\\.\\\\d:\\\\driverdevelop\\\\apptovxd\\\\apptovxd.vxd\", 0, 0, 0, CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, NULL); if(hDevice == INVALID_HANDLE_VALUE) { fprintf(stderr, \"Cannot load VXD, error = %ld\\n\", GetLastError()); exit(1); } // pxy = new xy; // // pxy->x = 40; // pxy->y = 80; if(!DeviceIoControl(hDevice, ADDXY, inbuf, 256, outbuf, 256, &truesize, &o)) { fprintf(stderr, \"Failed to ADD. error = %d\\n\", GetLastError()); exit(1); } // printf(\"%d + %d = %d\\n\", pxy->x, pxy->y, z); CloseHandle(hDevice); } 我改成了字符串数组,依然不行。 错误代码:error = 6 |
|
|
14楼#
发布于:2002-02-01 16:11
1,传指针肯定是不行的,但不会报错
2,我不清楚你现在cretefile到底成功没有,如果没有成功,那就牵扯不到指针的问题 |
|
|
15楼#
发布于:2002-02-01 16:51
1,传指针肯定是不行的,但不会报错 createfile成功了,运行到的deviceiocontrol时,出现了错误,如下: Failed to ADD. error = 6 |
|
|
16楼#
发布于:2002-02-01 16:54
//我是说这样
#include <stdio.h> #include <Windows.h> #include <winioctl.h> #include \"Addxy.h\" void main() { HANDLE hDevice; int z; //xy pxy; xy myxy; //here DWORD truesize; hDevice = CreateFile(\"\\\\\\\\.\\\\d:\\\\driverdevelop\\\\apptovxd\\\\apptovxd.vxd\", 0, 0, 0, CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0); if(hDevice == INVALID_HANDLE_VALUE) { fprintf(stderr, \"Cannot load VXD, error = %ld\\n\", GetLastError()); exit(1); } //pxy = new xy; //pxy->x = 40; //pxy->y = 80; myxy.x = 40; //here myxy.y = 80; //here if(!DeviceIoControl(hDevice, ADDXY, &myxy, sizeof(xy), &z, sizeof(int), &truesize, NULL)) { fprintf(stderr, \"Failed to ADD. error = %d\\n\", GetLastError()); exit(1); } //printf(\"%d + %d = %d\\n\", pxy->x, pxy->y, z); printf(\"%d + %d = %d\\n\",myxy.x,myxy.y,z); //here CloseHandle(hDevice); } 另外,你的IoctlCode定义有问题好象: Addxy.h头文件如下: #define ADDXY CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_NEITHER, FILE_ANY_ACCESS) vxd的ControlCode是这样定义的吗? 去找个vxd的例子来看看 |
|
|
17楼#
发布于:2002-02-01 17:08
ControlCode定义有问题吗?之后,我看了两个程序了,都是这样的。
另外,我把你改完的程序copy到我的程序中了,运行还是在DeviceIoControl时出现了错误。错误如下: Failed to ADD. error = 87 查Vc得知,原因是由参数错误。 很奇怪?这是书上的一个例子,而且楼上有朋友说它可能成功的运行了这个例子。我实在很纳闷! |
|
|
18楼#
发布于:2002-02-01 17:14
ControlCode没错
//真丢人 :( //那我不知道了 |
|
|
19楼#
发布于:2002-02-01 17:32
ControlCode没错 首先,如果我真的错了,请告诉我因该如何定义,或者告诉我怎样查到相关文档。 其次,我买的一本书中,我不知道,是不是我眼睛的问题,作者告诉我定义ControlCode的方法就是这样。 最后,我在vToolsD中的例子中(路径:VtoolsD\\Examples\\c\\apc)apcx.h也是如此定义的。 你能告诉我,错的原因吗?! |
|
|
上一页
下一页