WinIO初始化异常怎么解决
本篇内容主要讲解“WinIO初始化异常怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“WinIO初始化异常怎么解决”吧!
创新互联专注于企业营销型网站、网站重做改版、献县网站定制设计、自适应品牌网站建设、H5页面制作、商城网站定制开发、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为献县等各大城市提供网站开发制作服务。
初始化的时候调用的是InitializeWinIo()函数:
bool _stdcall InitializeWinIo() { bool bResult; DWORD dwBytesReturned;` IsNT = IsWinNT(); if (IsNT) { hDriver = CreateFile("\\.\WINIO", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // If the driver is not running, install it if (hDriver == INVALID_HANDLE_VALUE) { GetDriverPath(); bResult = InstallWinIoDriver(szWinIoDriverPath, true); if (!bResult) return false; bResult = StartWinIoDriver(); if (!bResult) return false; hDriver = CreateFile("\\.\WINIO", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hDriver == INVALID_HANDLE_VALUE) return false; } // Enable I/O port access for this process if (!DeviceIoControl(hDriver, IOCTL_WINIO_ENABLEDIRECTIO, NULL, 0, NULL, 0, &dwBytesReturned, NULL)) return false; } else { VxDCall = (DWORD (WINAPI *)(DWORD,DWORD,DWORD))GetK32ProcAddress(1); hDriver = CreateFile("\\.\WINIO.VXD", 0, 0, 0, CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0); if (hDriver == INVALID_HANDLE_VALUE) return false; } IsWinIoInitialized = true; return true; }
函数首先查看是不是NT系统,如果是,就创建设备驱动的handle,如果没有的话,就安装一个。有的话就直接使用。
仔细看看这个函数值后就知道其实引起初始化失败的原因很多。我遇到的问题就是有时候异常退出了,第二次就无法正常启动WinIO了,只能按照这样的方式来进行:
InitWinIO->成功->程序异常退出->InitWinIO->失败->ShutdownWinIO->InitWinIO->成功
也就是说重新启动两次程序才行。由于异常退出保留在内存的驱动第二次InitWinIO会失败,然后ShutdownWinIO就会卸载这个驱动,再进行InitWinIO就正确了。
那么直接在应用程序启动前无论怎么就运行ShutdownWinIO先关闭一下可以么?看看代码似乎是可以的:
void _stdcall ShutdownWinIo() { DWORD dwBytesReturned;` if (IsNT) { if (hDriver != INVALID_HANDLE_VALUE) { // Disable I/O port access DeviceIoControl(hDriver, IOCTL_WINIO_DISABLEDIRECTIO, NULL, 0, NULL, 0, &dwBytesReturned, NULL); CloseHandle(hDriver); } RemoveWinIoDriver(); } else CloseHandle(hDriver); IsWinIoInitialized = false; }
我测试过,直接在程序一开始就执行ShutdownWinIo()然后在初始化WinIO,一样可能提示出错。什么原因呢?
其实,WinIO的ShutdownWinIo这里有一个bug:
if(IsNT)
如果你没有调用过InitializeWinIo()的话,全局变量IsNT是为false的,他就没有正确的执行nt平台的代码。这就解释了为什么没有关闭成功。
所以,找到了问题所在,有两种解决方法:
将IsNT替换为IsWinNT()的函数调用
在InitWinIO里面if(IsNT)以后,执行一次ShutdownWinIO即可。
到此,相信大家对“WinIO初始化异常怎么解决”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
分享标题:WinIO初始化异常怎么解决
网页路径:http://scyanting.com/article/pohshh.html