阅读:1421回复:14
老大,看看这个问题,救救我吧,VXD加载方面的奇怪问题
我的程序在测试模块中用的自编的定时器VXD(COMS定时器中断,精度为1ms),当进行报表打印后,再进入测试模块,就会出现VXD加载不上,如果不进行打印,只进行预览,其它操作都不会有问题,那位老大指点一下啊
ghDevice = CreateFile(\"\\\\\\\\.\\\\IRQTIMER\\\\IRQTIMER.VXD\", 0,0,0,CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, 0); if (ghDevice == INVALID_HANDLE_VALUE) { ::MessageBox(hWnd, \"定时器VxD加载失败,请重新打开程序.\", \"系统消息\", MB_OK); pView->Reset(); return 0; } if (!DeviceIoControl(ghDevice, ADDRESSPASS, CallBackAPC, 0, 0, 0, 0, 0)) { ::MessageBox(hWnd, \"定时器VxD调用失败,请重新打开程序.\", \"系统消息\", MB_OK); return 0; } |
|
|
沙发#
发布于:2002-08-08 19:10
呵呵,恭喜。
|
|
板凳#
发布于:2002-08-08 18:33
不好意思,我是新手上路,分不多,请消纳。 :)
|
|
|
地板#
发布于:2002-08-08 18:28
问题解决了! :) 改 = CreateFile(\"\\\\\\\\.\\\\IRQTIMER\\\\IRQTIMER.VXD\", 为 = CreateFile(\"\\\\\\\\.\\\\IRQTIMER.VXD\", 把IRQTIMER.VXD复制到 windows\\system\\.也可以 谢谢两位老大,可解决大问题了,我的系统终于验收通过了. |
|
|
地下室#
发布于:2002-08-08 01:14
谢谢两位老大的指点,我去试试看,希望能找到原因,解决问题。
|
|
|
5楼#
发布于:2002-08-07 09:10
是ghDevice = CreateFile(\"\\\\\\\\.\\\\IRQTIMER\\\\IRQTIMER.VXD\", 0,0,0,CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, 0);这句返回错误了吗?GetLastError是什么?
改成ghDevice = CreateFile(\"\\\\\\\\.\\\\IRQTIMER.VXD\", 0,0,0,OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, 0); 将irqtimer.vxd copy到system目录,再看看? |
|
6楼#
发布于:2002-08-07 00:11
please print out the value of GetLastError.
any reason for a fail open will get a return value of INVALID_HANDLE_VALUE. and... hen create vxd as devcie, people commonly use SysHandle = CreateFile( VXD_FILE, 0, 0, NULL , 0, FILE_FLAG_OVERLAPPED | FILE_FLAG_DELETE_ON_CLOSE, NULL ); and also, does not use vxdfilename like \\\\\\\\.\\\\IRQTIMER\\\\IRQTIMER.VXD why add IRQTIMER\\\\ ??? |
|
7楼#
发布于:2002-08-06 21:29
#define DEVICE_MAIN
#include \"irqtimer.h\" #include \"Event.h\" Declare_Virtual_Device(IRQTIMER) #undef DEVICE_MAIN MyHwInt* pMyIRQ; PVOID CallBackApc = 0; THREADHANDLE TheThread = 0; int x = 0, y = 0; unsigned char b; IrqtimerVM::IrqtimerVM(VMHANDLE hVM) : VVirtualMachine(hVM) {} IrqtimerThread::IrqtimerThread(THREADHANDLE hThread) : VThread(hThread) {} //中断服务程序 VOID MyHwInt::OnHardwareInt(VMHANDLE) { _outp(0x70, 0xc); _inp(0x71); //清除中断标志 x++; if(x >= 5){//1秒 x = 0; y++; VWIN32_QueueUserApc(CallBackApc, (DWORD)&y, TheThread); //用指定线程和返回值调用WIN32应用程序 //(DWORD)&x异步传给RING3程序的参数 //RING0线程句柄 //VSD_Bell(); //发声500ms dout<<\"aaaa\"<<endl; } sendPhysicalEOI(); //通知VPICD结束中断处理 //VPICD:virtual Programmable Interrupt Controller Device } BOOL IrqtimerDevice::OnSysDynamicDeviceInit() { dout<<\"//动态打开设备\"<<endl; pMyIRQ = new MyHwInt(); if (!pMyIRQ || !pMyIRQ->hook()) return FALSE; _outp(0x70,0xb); b =_inp(0x71); //保存寄存器B初始值 _outp(0x70,0xb); _outp(0x71,0x40 | b); pMyIRQ->physicalUnmask(); return TRUE; } BOOL IrqtimerDevice::OnSysDynamicDeviceExit() { dout<<\"////动态关闭设备\"<<endl; _outp(0x70,0xb); _outp(0x71,b); //禁止周期中断,恢复寄存器B初值 if (pMyIRQ) delete pMyIRQ; return TRUE; } DWORD IrqtimerDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams) { switch(pDIOCParams->dioc_IOCtlCode) { case DIOC_OPEN:{//动态打开设备//用CreateFile方式 dout<<\"动态打开设备\"<<endl; break; } case DIOC_CLOSEHANDLE:{//动态关闭设备//用CloseHandle方式 dout<<\"动态关闭设备\"<<endl; break; } case hEventPASS:{ dout<<\"hEventPASS\"<<endl; CallBackApc = pDIOCParams->dioc_InBuf; TheThread = Get_Cur_Thread_Handle(); break; } case READ:{ dout<<\"READ\"<<endl; break; } default:return -1; } return 0; } |
|
|
8楼#
发布于:2002-08-06 18:21
void CMotorTestView02::OnInitialUpdate()
{ ........... Thread3 = AfxBeginThread(LoadTimer, NULL, D_PRIORITY_NORMAL,0, CREATE_SUSPENDED); ........... } //测试过程中 ....... //启动测试线程 //恢复线程 if(!bThread2){ Thread2->ResumeThread(); bThread2 = TRUE; } if(!bThread3){ Thread3->ResumeThread(); bThread3 = TRUE; } ....... |
|
|
9楼#
发布于:2002-08-06 18:17
//装载定时VXD
UINT LoadTimer(LPVOID pParam) { CMainFrame* pMainwnd = (CMainFrame*)AfxGetApp()->m_pMainWnd; CMotorTestView02* pView = (CMotorTestView02*)pMainwnd->GetActiveView(); ghDevice = CreateFile(\"\\\\\\\\.\\\\IRQTIMER\\\\IRQTIMER.VXD\", 0,0,0,CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, 0); if (ghDevice == INVALID_HANDLE_VALUE) { ::MessageBox(hWnd, \"定时器VxD加载失败,请重新打开程 序.\", \"系统消息\", MB_OK); pView->Reset(); return 0; } if (!DeviceIoControl(ghDevice, ADDRESSPASS, CallBackAPC, 0, 0, 0, 0, 0)) { ::MessageBox(hWnd, \"定时器VxD调用失败,请重新打开程 序.\", \"系统消息\", MB_OK); return 0; } while(TRUE){ if(bEndThread)break; SleepEx(INFINITE, TRUE); } ::AfxEndThread(0); return 0; } |
|
|
10楼#
发布于:2002-08-06 15:41
和deviceID没有关系的。
把你的createfile相关的代码贴上来看看? |
|
11楼#
发布于:2002-08-06 13:16
是啊 ,CreateFile(vxd)时返回 error code 为 INVALID_HANDLE_VALUE,奇怪的是不进行打印操作的话,就不会有问题,包括打印预览,看来不会是我打印模块的问题,是不是打印驱程和我的定时器VXD有冲突? 在VXD中我设的Device ID为 UNDEFINED_DEVICE_ID,这有没有问题呢
|
|
|
12楼#
发布于:2002-08-06 08:44
就是说用createfile打开vxd出错?error code是?
|
|
13楼#
发布于:2002-08-05 21:46
大佬,你好
我做的是一个测试系统,自己做了一个精度为1ms的定时器,做为定时触发采集,VXD程序是参照本站首页上一篇文章: //Windows 9X硬件中断设备驱动程序的开发 //作者: 姜山 程君实 现在出现这样一个问题,就是在我的程序里打印报表后,再重新进入进行测试时,会出现加载VXD失败,如果打印后退出程序,再重新进入,或只进行打印预览操作,再进行测试(再次加载VXD)都不会有问题的。 我想: 这是不是打印驱动和我编的VXD有冲突? 在什么情况下会出现VXD加载不成功? 请指教。 |
|
|
14楼#
发布于:2002-08-05 11:17
说的不够清楚,不好理解。
|
|