//
static UINT Res2File( LPCTSTR lpName, LPCTSTR lpType, LPCTSTR filename ) //把资源保存到文件
{
HRSRC hRes = ::FindResource( NULL, lpName, lpType );
HGLOBAL gl =::LoadResource( NULL, hRes );
LPVOID lp = ::LockResource( gl );
HANDLE fp = ::CreateFile( filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
if( fp == INVALID_HANDLE_VALUE )
return 1;
DWORD a;
if( !::WriteFile( fp, lp, SizeofResource( NULL, hRes ), &a, NULL ) )
return 1;
CloseHandle( fp );
FreeResource( gl );
return 0;
//Res2File(MAKEINTRESOURCE(IDR_EXE_MAKEBIN),"MYFILE","C://makeb.exe"); //测试保存资源
}
//
static UINT THREAD_InstallUSBDriver_Function(LPVOID pParam) //安装usb驱动的线程
{
const char installdriver_bat[]="//installdriver.bat";
char syspath[MAX_PATH+1];
GetSystemDirectory(syspath,MAX_PATH+1);
CString installbatpath= syspath;
installbatpath +=installdriver_bat;
//
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo; //启动参数
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
StartupInfo.wShowWindow = SW_HIDE; //不显示
StartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; //使以上参数生效
//
if(CreateProcess(installbatpath, NULL,
NULL,NULL,FALSE,
0,
NULL,
syspath,
&StartupInfo,
&ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess,INFINITE); //必须等待,否则就跑到下面删除的语句了。
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
else
{
AfxMessageBox("创建安装驱动进程失败,请重试!",MB_OK|MB_ICONERROR);
}
//删除释放的文件
CDlg *pDlg = (CDlg*)pParam;
::EnableWindow(::GetDlgItem(pDlg->m_hWnd,IDC_BTN_INSTALLDRIVER),TRUE);
//
return(0);
}
void _usb_testerDlg::OnBnClickedBtnInstalldriver()//安装驱动
{
UINT err=0;
const char usb_inf[]="//_usb.inf";
const char usb_sys[]="//_usb.sys";
const char usb_cat[]="//_usb.cat";
const char installdriver_bat[]="//installdriver.bat";
//
char syspath[MAX_PATH+1];
GetSystemDirectory(syspath,MAX_PATH+1);
CString strTemp ,strDriverPath = syspath ; //得到类似c:/windows/system32形式
//strcat(syspath,"//drivers");
//strcpy(tempstr,syspath); //syspath,tempstr 类似c:/windows/system32/drivers
//
strTemp =strDriverPath + usb_inf;
err = Res2File(MAKEINTRESOURCE(IDR_USBINF),"USBDRV", strTemp);
strTemp = strDriverPath + usb_sys;
err+= Res2File(MAKEINTRESOURCE(IDR_USBSYS),"USBDRV", strTemp);
strTemp = strDriverPath + usb_cat;
err+= Res2File(MAKEINTRESOURCE(IDR_USBCAT),"USBDRV", strTemp);
//
strTemp = strDriverPath + installdriver_bat;
err+= Res2File(MAKEINTRESOURCE(IDR_INSTALLDRIVER_BAT),"USBDRV", strTemp);
//return;
if(err)
{
AfxMessageBox("释放驱动出错,请重试!",MB_OK|MB_ICONERROR);
return;
}
//安装
GetDlgItem(IDC_BTN_INSTALLDRIVER)->EnableWindow(FALSE);
AfxBeginThread(THREAD_InstallUSBDriver_Function,this,THREAD_PRIORITY_ABOVE_NORMAL);
}
//比较重要的bat文件:
@echo off
rem 安装load驱动
rundll32.exe setupapi.dll,InstallHinfSection xxx_usb_DDI.NT 132 .//xxx_usb.inf
// 更新,在Vista以上系统中变了:
Windows 7/8:
%SystemRoot%\System32\InfDefaultInstall.exe "%1"