基于Visual C++之Windows核心编程代码分析(3)实现程序自动安装

来源:互联网 发布:ubuntu怎么下载qq 编辑:程序博客网 时间:2024/06/06 06:47

转自:http://blog.csdn.net/itcastcpp/article/details/7078745

我们进行Windows编程的时候,经常需要开发程序,使程序进行自动安装。

具体如何实现呢,请见代码实现与注释分析。

**************************************//* 头文件 */#include <Windows.h>#include <Setupapi.h>#include <shlobj.h>/* 库 */#pragma comment (lib, "shell32.lib")#pragma comment (lib, "Setupapi.lib")/************************************** VOID GetSourceDirectory(LPSTR szPath)* 功能 获得当前路径* szPath,返回路径**************************************/VOID GetSourceDirectory(LPSTR szPath){int i;GetModuleFileName(NULL,szPath,MAX_PATH);i=strlen(szPath);while ((i>0)&&(szPath[i-1]!='\\')){szPath[--i]=0;}}/************************************** WinMain* 功能 调用相关Setup API进行安装**************************************/INT WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){HINF hInf; // INF文件句柄CHAR szSrcPath[MAX_PATH];// 源路径CHAR szDisPath[MAX_PATH];// 目的路径BOOL bResult;PVOID pContext;// 与本程序在同一目录下的Setup.infGetSourceDirectory(szSrcPath);lstrcat(szSrcPath,"setup.inf");// 打开 inf 文件hInf = SetupOpenInfFile(szSrcPath, NULL, INF_STYLE_WIN4, NULL);// 是否成功if (hInf == INVALID_HANDLE_VALUE){MessageBox(NULL,"Error: Could not open the INF file.","ERROR",MB_OK|MB_ICONERROR);return FALSE;}// 获得Program Files的路径SHGetSpecialFolderPath(NULL, szDisPath, CSIDL_PROGRAM_FILES , FALSE);// 构造目的路径lstrcat(szDisPath,"\\MyInstall");// 给inf配置文件中的路径ID赋值,使用路径替换路径IDbResult = SetupSetDirectoryId(hInf, 32768, szDisPath);if (!bResult){MessageBox(NULL,"Error: Could not associate a directory ID with the destination directory.","ERROR",MB_OK|MB_ICONERROR);SetupCloseInfFile(hInf);return FALSE;}// 设置默认callback函数的参数pContext=SetupInitDefaultQueueCallback(NULL);// 进行安装bResult=SetupInstallFromInfSection(NULL, // 父窗口句柄hInf, // INF文件句柄"Install", // INF文件中,配置了安装信息的节名SPINST_FILES | SPINST_REGISTRY , // 安装标志NULL, // 安装键值NULL, // 源文件和路径,可以在INF文件中配置0, // 复制时的动作(PSP_FILE_CALLBACK)SetupDefaultQueueCallback, // 回调函数pContext, // 回调函数的参数NULL, // 设备信息NULL // 设备信息);// 安装是否成功if (!bResult){// 失败,输出错误信息MessageBox(NULL,"SetupInstallFromInfSection","ERROR",MB_OK|MB_ICONERROR);//关闭SetupTermDefaultQueueCallback(pContext);SetupCloseInfFile(hInf);return FALSE;}// 关闭SetupTermDefaultQueueCallback(pContext);SetupCloseInfFile(hInf);return TRUE;}



原创粉丝点击