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

转自: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.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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值