安装驱动程序的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;


第一个参数窗口句柄,可以为0,

第二个参数 设备的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;}




0 0
原创粉丝点击