转自:http://blog.youkuaiyun.com/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.inf
GetSourceDirectory(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赋值,使用路径替换路径ID
bResult = 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;
}