vc++开发安装程序实例
前言 市面上有很多安装程序制作软件;但是,要实现个性化安装程序,还是自己动手来写一个更为妥当。本文介绍基本的安装程序制作的步骤。
安装程序界面:
安装程序可以分为几个功能点:1 资源的嵌入、释放。2 资源的解压。3 生成快捷方式。
1 资源导入和释放
导入 在VS资源视图,点击“”添加资源“,再选择“导入资源”,将需要安装的程序导入即可。导入的资源一般是安装程序的压缩包。
释放:将资源释放到指定目录
//将指定资源释放到指定目录下生成特定文件
//ResName 资源名称;ResType:资源类型;FileName:释放后的文件名。
BOOL FreeMyData(LPCTSTR ResName, LPCTSTR ResType, LPCTSTR FileName, int Type)
{
BOOL bRet = TRUE;
HINSTANCE hInst = AfxGetInstanceHandle(); //先判断我们指定的资源是否存在
HRSRC hResInfo = FindResource(hInst, ResName, ResType); if (hResInfo == NULL)
return FALSE; HANDLE hFile = NULL;
DWORD dwWritten = ; //开始调入指定的资源到内存
HGLOBAL hResData = LoadResource(hInst, hResInfo);
LPVOID pvResData = LockResource(hResData);
DWORD dwResSize = SizeofResource(hInst, hResInfo); //再创建目标文件并保存数据至文件
if (Type == )//系统加隐藏属性 如果指定类型为1,那么加上系统和隐藏属性,防止普通用户对文件进行破坏
{
hFile = CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM, NULL);
WriteFile(hFile, pvResData, dwResSize, &dwWritten, NULL);
}
else
{
hFile = CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hFile, pvResData, dwResSize, &dwWritten, NULL);
}
if (hFile == INVALID_HANDLE_VALUE)//创建文件失败
{
FreeResource(hResData);
return FALSE;
} //释放有关内存资源
CloseHandle(hFile);
FreeResource(hResData); return TRUE;
}
调用示例:
2 资源的解压 暨对zip文件解压。本文采用开源代码解压文件。具体调用不再详述。压缩源代码下载。
3 生成快捷方式 生成快捷方式分为两步:1 获取存放快捷文件的目录; 2 生成快捷方式文件(.lnk)。
1 获取存放目录 一般在“桌面“和“开始菜单”创建快捷方式。“桌面“其实对应于Windows系统特定的目录,一般而言该目录为“C:\Users\admin\Desktop”。windows提供了函数获取该目录。对于“开始菜单”处理亦是如此。
//得到当前桌面路径
BOOL SetupHelper::GetDesktopPath(wchar_t *pszDesktopPath)
{
LPITEMIDLIST ppidl = NULL;
if (SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &ppidl) == S_OK)
{
BOOL flag = SHGetPathFromIDList(ppidl, pszDesktopPath);
CoTaskMemFree(ppidl);
return flag; }
return FALSE;
}
//得到 开始->程序组 的路径
BOOL SetupHelper::GetProgramsPath(wchar_t *pszProgramsPath)
{
LPITEMIDLIST ppidl;
if (SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAMS, &ppidl) == S_OK)
{
BOOL flag = SHGetPathFromIDList(ppidl, pszProgramsPath);
CoTaskMemFree(ppidl);
return flag;
} return FALSE;
}
2 生成快捷方式文件(.lnk)
需要调用系统函数生成lnk文件。
/*
函数功能:对指定文件在指定的目录下创建其快捷方式
函数参数:
lpszFileName 指定文件,为NULL表示当前进程的EXE文件。
lpszLnkFileDir 指定目录,不能为NULL。
lpszLnkFileName 快捷方式名称,为NULL表示EXE文件名。
wHotkey 为0表示不设置快捷键
pszDescription 备注
iShowCmd 运行方式,默认为常规窗口
*/
BOOL SetupHelper::CreateFileShortcut(LPWSTR lpszFileName,
LPWSTR lpszLnkFileDir, LPWSTR lpszLnkFileName, LPWSTR lpszWorkDir,
WORD wHotkey, LPWSTR lpszDescription, int iShowCmd )
{
if (lpszLnkFileDir == NULL) return FALSE; HRESULT hr;
IShellLink *pLink; //IShellLink对象指针
IPersistFile *ppf; //IPersisFil对象指针 //创建IShellLink对象
hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pLink);
if (FAILED(hr))
return FALSE; //从IShellLink对象中获取IPersistFile接口
hr = pLink->QueryInterface(IID_IPersistFile, (void**)&ppf);
if (FAILED(hr))
{
pLink->Release();
return FALSE;
} //目标
if (lpszFileName == NULL)
pLink->SetPath(_wpgmptr);
else
pLink->SetPath(lpszFileName); //工作目录
if (lpszWorkDir != NULL)
pLink->SetPath(lpszWorkDir); //快捷键
if (wHotkey != )
pLink->SetHotkey(wHotkey); //备注
if (lpszDescription != NULL)
pLink->SetDescription(lpszDescription); //显示方式
pLink->SetShowCmd(iShowCmd); //快捷方式的路径 + 名称
wchar_t szBuffer[MAX_PATH] = {};
if (lpszLnkFileName != NULL) //指定了快捷方式的名称
wsprintf(szBuffer, L"%s\\%s.lnk", lpszLnkFileDir, lpszLnkFileName);
else
{
//没有指定名称,就从取指定文件的文件名作为快捷方式名称。
wchar_t *pstr;
if (lpszFileName != NULL)
pstr = wcsrchr(lpszFileName, '\\');
else
pstr = wcsrchr(_wpgmptr, '\\'); if (pstr == NULL)
{
ppf->Release();
pLink->Release();
return FALSE;
} //注意后缀名要从.exe改为.lnk
wsprintf(szBuffer, L"%s\\%s", lpszLnkFileDir, pstr); int nLen = wcslen(szBuffer);
szBuffer[nLen] = L'l';
szBuffer[nLen+] = L'n';
szBuffer[nLen +] = L'k';
} //保存快捷方式到指定目录下
hr = ppf->Save(szBuffer, TRUE);
ppf->Release();
pLink->Release();
return SUCCEEDED(hr);
}
调用示例
//生成桌面快捷方式
wchar_t szPath[MAX_PATH] = {};
SetupHelper::GetDesktopPath(szPath); int ret = ;
if (SetupHelper::CreateFileShortcut(filePathExe.GetBuffer(),
szPath, L"IOT集群调度系统", NULL, MAKEWORD(VK_F12, HOTKEYF_CONTROL), L"集群调度终端"))
{
ret++;
}
vc++开发安装程序实例的更多相关文章
- 一个完整的Installshield安装程序实例—艾泽拉斯之海洋女神出品(四) --高级设置二
原文:一个完整的Installshield安装程序实例-艾泽拉斯之海洋女神出品(四) --高级设置二 上一篇:一个完整的安装程序实例—艾泽拉斯之海洋女神出品(三) --高级设置一4. 根据用户选择的组 ...
- 一个完整的Installshield安装程序实例-转
一个完整的Installshield安装程序实例—艾泽拉斯之海洋女神出品(一)---基本设置一 前言 Installshield可以说是最好的做安装程序的商业软件之一,不过因为功能的太过于强大,以至于 ...
- [转]一个完整的Installshield安装程序实例
@import url("http://files.cnblogs.com/files/go-jzg/vs.css"); --> Installshield安装程序实例—基本 ...
- NSIS控制面板中显示安装包的大小和禁止多个安装程序实例
转载:http://www.yhxs3344.net/jscript/nsis 转载:http://www.yhxs3344.net/archives/1292 1.控制面板中显示安装包的大小 ;需要 ...
- Zedboard(二)使用Vivado+SDK开发嵌入式应用程序——实例一
本次介绍用Vivado构建Zedboard开发板的硬件平台+SDK开发应用程序(Zedboard裸机开发) 过程如下: 一.运行Vivado,建立新工程 指定好工程路径,下一步,选择RTL Proje ...
- AutoCAD ObjectARX(VC)开发基础与实例教程2014版光盘镜像
AutoCAD ObjectARX(VC)开发基础与实例教程2014,最新版,光盘镜像 作者:张帆 朱文俊 编著 出版社:中国电力出版社 出版时间:2014年6月 点击一下
- 基于NSIS脚本开发的安装程序制作软件:易量安装
原文 基于NSIS脚本开发的安装程序制作软件:易量安装 前几天“萝卜”给我推荐了一款安装程序制作工具——易量安装. 易量安装是一款安装程序制作软件,基于著名的NSIS(Nullsoft Scripta ...
- 开发一个微信小程序实例教程
一.注册小程序账号 1.进入微信公众平台(https://mp.weixin.qq.com/),注册小程序账号,根据提示填写对应的信息即可.2.注册成功后进入首页,在 小程序发布流程->小程序开 ...
- Qt开发的程序在没有安装Qt环境的机器上可能出现的一些问题
Qt开发的程序在没有安装Qt环境的机器上可能出现的一些问题,如:除png外的其它类型的图片,如:jpg.ico.bmp等,还有中文乱码等问题,出现这些问题的本质是Qt对这类文件格式或编码格式的支持方式 ...
随机推荐
- 微软Office Online服务安装部署(一)
1.要使用office online功能,首先需要的是2台主机,并且主机的系统要求是windwos Server 我把他命名为Server和Client(两台服务器 用户必须为administrato ...
- 本机连接Spark Standalone--最简单的spark调试方式
为了既能远程连接spark 查看ui 又能本地练习 安装简单 去官网 http://spark.apache.org/downloads.html 选择对应版本下载 tar包 解压 tar ...
- dos批处理(bat)运行exe
@echo off SETLOCAL ENABLEDELAYEDEXPANSIONREM 延迟环境变量扩展 color E echo operate:1.start启动 2.stop停止 3.exit ...
- idea配置网络代理
背景 公司限制连接外网,很多软件都被限制了,包括idea,只能通过代理上网. 使用代理上网,以往都是在IE的工具-Internet选项-连接里进行设置就OK了,谷歌浏览器啥的就可以上网了.但intel ...
- 自动登录(过滤器filter的应用)
//反复实验的时候注意数据库数据的更新 //将数据存储到cookie里面 protected void doGet(HttpServletRequest request, HttpServletRes ...
- mysql空值排序
SELECT * FROM lzh_topic_channel_product ORDER BY order_id is null , order_id 其中的ORDER BY order_id i ...
- Maven学习 二 Maven环境搭建
第一步:下载Maven并解压 注意选择镜像地址,选择国内的会快点 解压目录 Maven目录分析 bin:含有mvn运行的脚本 boot:含有plexus-classworlds类加载器框架 conf: ...
- Django的学习进阶(二)———— name
一.问题: 在做完第一个demo的时候,由于只是基础学习,所以对于name的使用并不需要很熟练,也不用理解的很深.但是在做音乐网站的时候遇到了关于如何使用name的内容. 由于一个app中会使用到另一 ...
- shp文件和地理数据库文件的区别
存储文件结构不同.所能进行的计算也不同. https://blog.csdn.net/lucahan/article/details/51761610 对数据库操作更快更方便,如何证明?尤其是数据量比 ...
- Vuejs——(3)计算属性,样式和类绑定
版权声明:出处http://blog.csdn.net/qq20004604 目录(?)[+] 先上总结: (十九)标签和API总结(2) vm指new Vue获取的实例 ①当dom标签里的值 ...