安装驱动程序的API,SetupCopyOEMInfW 和 UpdateDriverForPlugAndPlayDevices
来源:互联网 发布:图片锐化软件 编辑:程序博客网 时间:2024/05/15 11:31
Windows下安装驱动程序的api特别的多,反正有一堆。这里介绍2个我用过的,供人参考。
BOOL b;int result=0;result = UpdateDriverForPlugAndPlayDevices(0,L"USB\\Class_ff&SubClass_42&Prot_01",//L"USB\\VID_04E8&PID_6860&MI_01",L"D:/mgyun_driver_32_4/android_winusb.inf",INSTALLFLAG_FORCE,&b);cout<<result<<endl;cout<<hex<<GetLastError()<<endl;
第二个参数 设备的HID,可以使用通用ID;
第三个参数,inf文件的路径
第四个参数,标志符,强制安装等选项
第五个参数,用来传出一个BOOL值,指示是否需要重启电脑,然后由程序决定是否重启电脑。
详细请参见:http://msdn.microsoft.com/en-us/library/windows/hardware/ff553534(v=vs.85).aspx
这个函数在设备没有连接电脑的情况下会出错,错误号码为:ERROR_NO_SUCH_DEVINST
对于64位还是32位程序有要求,也就是必须在64位平台上生成64位的程序。否则会出错ERROR_IN_WOW64。
好处是,执行完成后,设备的驱动就会被加载,启用。因此有些时候,这个函数的执行时间会有一点长。如果驱动签名没有验证,还会弹一个框提示用户进行选择。
-------------------------------------------------------------------------------
BOOL setupResult;setupResult = SetupCopyOEMInf(infFile, //L"D:\\NB_Driver\\usb_driver\\android_winusb.inf",L"",SPOST_NONE, //忽略 OEMSourceMediaLocation的内容SP_COPY_NEWER_OR_SAME, //SP_COPY_REPLACEONLY,替换,一般是升级时用。SP_COPY_NOOVERWRITENULL,0,NULL,NULL);if(setupResult == TRUE)cout<<"sucess"<<endl;else{DWORD d1 = GetLastError();std::cout<<hex<<d1<<std::endl;}
这个函数实现的是无设备安装,即设备没有插入也可以安装驱动。
那么当设备插入电脑的时候,系统就可以自动安装驱动。
BOOL WINAPI SetupCopyOEMInf( __in PCTSTR SourceInfFileName, __in PCTSTR OEMSourceMediaLocation, __in DWORD OEMSourceMediaType, __in DWORD CopyStyle, __out_opt PTSTR DestinationInfFileName, __in DWORD DestinationInfFileNameSize, __out_opt PDWORD RequiredSize, __out_opt PTSTR DestinationInfFileNameComponent);
第一个参数inf的路径
第二个参数源媒体的路径
第三个参数指示源媒体的类型。OEMSourceMediaType。SPOST_NONE:忽略OEMSourceMediaLocation的内容。SPOST_PATH:代表OEMSourceMediaLocation为真正驱动文件的地址,一般为驱动文件sys的地址。(如果你的sys文件跟inf在一个地方,那么OEMSourceMediaLocation可以为NULL),SPOST_URL,这个代表OEMSourceMediaLocation为一个网址,即驱动在internet上。
第四个参数 复制类型。一般我们用到的就SP_COPY_REPLACEONLY,替换,一般是升级时用。SP_COPY_NOOVERWRITE,系统是否已经预存了inf文件。SP_COPY_NEWER_OR_SAME,inf文件比系统的inf新或者一样时进行更新。
后面的参数,好像全用不上啊。具体请参见 http://msdn.microsoft.com/en-us/library/aa376990.aspx
反正我这样是成功了。
上代码吧:
// driverInstall.cpp : 定义控制台应用程序的入口点。//#include <stdio.h>#include <tchar.h>#include <iostream>#include <fstream>#include <Windows.h>#include <SetupAPI.h>#include <newdev.h>//#pragma comment( linker, "/subsystem:windows /entry:wmainCRTStartup " ) //在release 模式下不显示黑窗口//同时不显示任何输出#ifdef NDEBUG#pragma comment( linker, "/subsystem:windows /entry:wmainCRTStartup" )#endifusing namespace std;int _tmain(int argc, _TCHAR* argv[]){_TCHAR * infFile = NULL;bool fileExists = false;if(argc > 1){infFile = argv[1];fstream _file;_file.open(infFile, ios::in);if(!_file){cout<<"file not exist"<<endl;return 0;//文件不存在}else{fileExists = true;//文件存在}}else //无参数return -1;BOOL setupResult;if(fileExists == true){BOOL b;BOOL result=FALSE;result = UpdateDriverForPlugAndPlayDevices(0,L"USB\\VID_04E8&PID_6860&MI_01",infFile,INSTALLFLAG_FORCE,&b);cout<<result<<endl;cout<<hex<<GetLastError()<<endl;getchar();setupResult = SetupCopyOEMInfW(infFile, L"",SPOST_NONE, //忽略 OEMSourceMediaLocation的内容SP_COPY_NEWER_OR_SAME, //SP_COPY_REPLACEONLY,替换,一般是升级时用。SP_COPY_NOOVERWRITENULL,0,NULL,NULL);if(setupResult == TRUE)cout<<"sucess"<<endl;else{DWORD d1 = GetLastError();std::cout<<hex<<d1<<std::endl;}}getchar();return 0;}
- 安装驱动程序的API,SetupCopyOEMInfW 和 UpdateDriverForPlugAndPlayDevices
- 驱动程序的安装和启动方法
- 设备驱动程序的安装和启动
- 监控卡驱动程序和软件的安装
- 虚拟驱动程序的安装
- 驱动程序的安装
- 安装OpenCL和AMD驱动程序
- 安装OpenCL和AMD驱动程序
- Java驱动程序的类型 - 的本地API驱动程序
- NT驱动程序和WDM驱动程序的区别
- IBM X60驱动程序的安装
- 安装驱动程序顺序的学问
- 设备驱动程序安装的重要文件
- Fedora15 显卡驱动程序的安装
- 设备驱动程序安装的重要文件
- JUDDI安装和API的使用
- JUDDI安装和API的使用
- zookeeper C API 的安装和使用指南
- SSH整合配置缓存
- iOS 消息推送原理及实现总结
- TableLayout
- iOS 7: 如何为iPhone 5S编译64位应用
- android JNI库实现reboot,recovery
- 安装驱动程序的API,SetupCopyOEMInfW 和 UpdateDriverForPlugAndPlayDevices
- Python笔记(一) 数字、动态类型、字符串
- Ubuntu ——虚拟机上网NAT
- TextSwitcherProject
- 正则表达式中的符号和preg_match()
- POJ 1159 Palindrome
- 确保目标关键词有人搜索
- Ubuntu13.04下安装搜狗输入法
- ToastProject 飘字提示