用VC制作通用安装程序

VC9、VC11、VC14、VC15是啥? 一:先看个关系对应 vs发布版本与vc版本对应关系如下所示: Visual Studio 6 : vc6 Visual Studio 2003 : vc7 Visual Studio 2005 : vc8 Visual Studio 2008 : vc9 Visual Studio 2010 : vc10 Visual Studio 2012 : vc11 Visual Studi... 阅读详情



经过多少日夜的潜心编程,你的软件终于大功告成时,你一定想马上将她呈现在用户面前,
于是她的包装(安装程序)便成了当务之急。
当然你可以选用InstallShield来制作软件的安装程序,但在它带给你制作简便的同时,却给你匠心独具的软件赋予了千篇一律的包装。

一个好的安装程序有助于增加软件的特色、提升软件的品位。
本文介绍用Visual C++来制作通用安装程序的方法,由此你便拥有了一个独具特色的通用安装程序。

1.在硬盘中创建安装目录

软件由若干文件组成,我们通常将其中大部分文件拷贝至安装目录下,
另有小部分文件须拷贝至特定的目录(如C:/Windows/System)下。
首先应在硬盘中创建安装目录。Windows的API函数CreateDirectory()可创建目录。

2.获取特定目录

若软件中包含须拷贝至特定目录的文件,那么应获取所需的特定目录。
GetWindowsDirectory()可得到Windows目录;
GetSystemDirectory()可得到Windows的系统目录,
SHGetSpecialFolderLocation()可得到Windows的特定目录(如Desktop、Start Menu/Programs、Recent、Help等)。

3.拷贝文件

创建安装目录和获取特定目录之后,将软件中的所有文件分别拷贝至这些目录中,CopyFile()可完成文件的拷贝。
在拷贝文件的同时,最好用进度条显示文件拷贝的进度。

4.创建快捷方式

完成软件中所有文件的拷贝之后,在“桌面”或“程序”中创建快捷方式,使之与应用程序相关联。

5.具体实现

假定软件中有5个文件:Myprog.exe,Myprog.hlp,Myprog.dll,Example.dat及Myprog.vxd。
其中前4个文件须拷贝至安装目录下,第5个文件须安装在Windows的系统目录下。

5.1 创建基于对话框的项目

项目名称为Setup,资源中对话框至少应有两个编辑控件IDC_EDIT1、IDC_EDIT2(对应的CString变量为m_strEdit1、m_strEdit2),
分别为“安装目录”、“快捷方式名称”,并且将按钮“确定”改为“安装”,人工输入资源ID的名称IDC_PROGRESSBAR,作为进度条的ID。

5.2 编写自定义函数

编写自定义函数ReadConfig()和CreateShortcut()。
其中ReadConfig()从安装配置文件Setup.cfg中读取安装信息,CreateShortcut()生成快捷方式。

5.2.1 配置信息文件Setup.cfg

[General]

    Topic=安装《我的程序》 //对话框的标题

    SetupDir=C:/Mysoft      //安装目录

    Shortcut=我的程序       //快捷方式名称

    ProgName=Myprog.exe     //应用程序名称

[CopyFiles]                 //须拷贝的文件

    Source1=Myprog.exe      //第1个源文件

    Target1=Myprog.exe      //第1个目标文件(与源文件可不同名)

    Source2=Myprog.hlp

    Target2=Myprog.hlp

    Source3=Myprog.dll

    Target3=Myprog.dll

    Source4=Example.dat

    Target4=Example.dat

    Source5=Myprog.vxd

    Target5=>Sy/Myprog.vxd //该文件拷贝至Windows系统目录下

    …………                    //拷贝的文件数目不限

[End]

5.2.2 读取配置信息函数

BOOL CSetupDlg::ReadConfig(){//从Setup.cfg中读取配置信息

    CFile fileCfg;

    if(!fileCfg.Open("Setup.cfg",CFile::modeRead)){

        MessageBox("Can’t open file: Setup.cfg");//打开文件错误

        return false;

    }

    char pcBuf[1024];//假定文件长度小于1024

    fileCfg.Read(pcBuf,fileCfg.GetLength());//配置信息读入到pcBuf[]中

    CString strBuf=pcBuf;

    char pcItem[20][30]={"Topic","SetupDir","Shortcut","ProgName", "Source1","Target1","Source2","Target2","Source3","Target3","Source4","Target4","Source5","Target5","Source6","Target6","Source7","Target7","Source8","Target8"};//配置信息条目,这里列举20个,可根据需要增减

    int nLoc=-1;//各条目的起始位置

    for(int i=0;i<20;i++){

        nLoc=strBuf.Find(pcItem[i]);

        if(nLoc>=0){    //得到各条目内容char pcCont[][](CSetupDlg成员变量),每条内容最多为30个字符

strcpy(pcCont[i],strBuf.Mid(nLoc+strlen(pcItem[i])+1,30));

    for(int j=0;j<30;j++){

                if(pcCont[i][j]==0x0d)//遇回车符,则置结束符

                    pcCont[i][j]=0;

            }

            nCopyFiles=(i-2)/2;// 须拷贝的文件个数,CSetupDlg成员变量

        }

    }

    fileCfg.Close();

    return true;

}

5.2.3 创建快捷方式函数

BOOL CSetupDlg::CreateShortcut(LPSTR szProgPath,LPSTR szShortcut)

{// szProgPath为目标程序路径,szShortcut为快捷方式名称

    IShellLink* pISL;

    IPersistFile* pIPF;

    HRESULT hr;

    WCHAR wszShortcut[MAX_PATH];

    hr=CoCreateInstance(CLSID_ShellLink,0,1,IID_IShellLink,(void**)&pISL);

//创建IShellLink接口

    if(FAILED(hr)) return false;

    pISL->SetPath(szProgPath);//设置目标应用程序

    pISL->SetShowCmd(…);//设置显示方式

    pISL->SetWorkingDirectory(…);//设置工作目录(其它设置参阅MSDN)

    hr=pISL->QueryInterface(IID_IPersistFile,(void**)&pIPF);

//得到IPersistFile接口

    if(FAILED(hr)){

pISL->Release();return false;}

    MultiByteToWideChar(0,0,szShortcut,-1,wszShortcut,MAX_PATH);//将char*转换为WCHAR*格式

    hr=pIPF->Save(wszShortcut,false);//保存快捷方式数据

    pIPF->Release();

    pISL->Release();

if(FAILED(hr)) return false;

    SHChangeNotify(SHCNE_ALLEVENTS,SHCNF_PATH|SHCNF_FLUSH,szShortcut,0);//通知系统更新

    return true;

}

5.3 修改对话框初始化函数

    通过ClassWizard映射消息WM_INITDIALOG,生成OnInitDialog()函数。在其中增加初始化的内容。

BOOL CSetupDlg::OnInitDialog()

{

    …………//自动生成的内容

    nCopyFiles=0;//初始化须拷贝的文件数

    ReadConfig();//读取配置信息

    SetWindowText(pcCont[0]);//设置对话框标题

    SetDlgItemText(IDC_EDIT1,pcCont[1]);//初始化安装目录

    SetDlgItemText(IDC_EDIT2,pcCont[2]);//初始化快捷方式名称

    return true;

}

5.4 修改OnOK()函数

对话框中的按钮“确定”改为“安装”,但其ID名称仍为IDOK,通过ClassWizard映射该消息,生成OnOK()函数。在其中增加的内容为:

(1)创建、设置进度条

(2)取得当前目录

(3)取得Windows特定目录

(4)创建安装目录

(5)拷贝文件

(6)生成快捷方式

void CSetupDlg::OnOK()

{

    GetDlgItemText(IDC_EDIT1,m_strEdit1);//将IDC_EDIT1的值赋给m_strEdit1

    GetDlgItemText(IDC_EDIT2,m_strEdit2);//将IDC_EDIT2的值赋给m_strEdit2

    GetDlgItem(IDOK)->EnableWindow(false);//不能第二次按“安装”

//设置进度条(在对话框中添加进度条控件,为其添加控制变量m_progCtrl)

    m_prgCtrl.SetRange(0,100);//设置进度条的范围

    m_prgCtrl.SetPos(0); //设置进度条的初始位置

    //取得当前目录

    char szCurrentDir[MAX_PATH];

    GetCurrentDirectory(MAX_PATH,szCurrentDir);

    if(szCurrentDir[strlen(szCurrentDir)-1]=='//') //去掉最后的'/'

        szCurrentDir[strlen(szCurrentDir)-1]=0;

    //取得Windows和系统目录

    char szWindowsDir[MAX_PATH];

    char szSystemDir[MAX_PATH];

    GetWindowsDirectory(szWindowsDir,MAX_PATH);

    GetSystemDirectory(szSystemDir,MAX_PATH);

    //取得桌面和程序的目录

    LPITEMIDLIST lpIIDL;

    char szDesktopDir[MAX_PATH];//桌面的目录

    SHGetSpecialFolderLocation(HWND_DESKTOP,CSIDL_DESKTOP,&lpIIDL);

    SHGetPathFromIDList(lpIIDL,szDesktopDir);

    char szProgramDir[MAX_PATH];//程序的目录

    SHGetSpecialFolderLocation(HWND_DESKTOP,CSIDL_PROGRAMS,&lpIIDL);

    SHGetPathFromIDList(lpIIDL,szProgramDir);  

    //创建安装目录

    char szDir[MAX_PATH];

    if(m_strEdit1.GetAt(m_strEdit1.GetLength()-1)!='//')

        m_strEdit1+='//';//若m_strEdit1最后不为'/',则加上'/'

    for(int i=0;i<m_strEdit1.GetLength();i++){//目录必须逐级创建

        if(m_strEdit1.GetAt(i)=='//'){

            strcpy(szDir,m_strEdit1);

            szDir[i]=0;

            CreateDirectory(szDir,NULL);

        }

    }

    m_strEdit1=m_strEdit1.Left(m_strEdit1.GetLength()-1);   //去掉最后的'/'

    //拷贝文件

    char szSourceFile[MAX_PATH];

    char szTargetFile[MAX_PATH];

    for(i=0;i<nCopyFiles;i++){

        sprintf(szSourceFile,"%s//%s",szCurrentDir,pcCont[i*2+4]);

    if(pcCont[i*2+5][0]=='>' && pcCont[i*2+5][3]=='//'){//拷贝至特定目录下

if(pcCont[i*2+5][1]=='W' && pcCont[i*2+5][2]=='i')//Windows目录

        sprintf(szTargetFile,"%s//%s",szWindowsDir,&pcCont[i*2+5][4]);

        else if(pcCont[i*2+5][1]=='S'&&pcCont[i*2+5][2]=='y')//System目录

            else return;

        }

        else    //拷贝至安装目录下

            sprintf(szTargetFile,"%s//%s",m_strEdit1,pcCont[i*2+5]);

        if(!CopyFile(szSourceFile,szTargetFile,FALSE)){

            char pcMessage[50];

            sprintf(pcMessage,"拷贝文件 %s 失败",pcCont[i*2+4]);

            MessageBox(pcMessage,"错误信息",MB_ICONERROR|MB_OK);

            return;

VC维(VC dimension) 参考文献:learning from data——Yaser S. Abu-Monstafa/ Malik Magdon-Ismail / Hsuan-Tien Lin 阅读详情

相关推荐

visual basic 6.0用于Windows各系统附安装教程

visual basic 6.0中文版是一种由微软公司开发的包含协助开发环境的事件驱动编程语言,它源自于BASIC编程语言,拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。开发人员可以定义和处理各种事件,例如按钮点击、文本框输入等,以实现特定的功能和交互逻辑。强大的库和控件:Visual Basic提供了丰富的类库和控件集合,开发人员可以直接使用这些库和控件来快速构建各种功能丰富的应用程序。

qq_53545309的博客 2万+

VC++制作安装包

经过多少日夜的潜心编程,你的软件终于大功告成时,你一定想马上将她呈现在用户面前,于是她的包装(安装程序)便成了当务之急。当然你可以选用InstallShield来制作软件的安装程序,但在它带给你制作简便的同时,却给你匠心独具的软件赋予了千篇一律的包装。      一个好的安装程序有助于增加软件的特色、提升软件的品位。本文介绍用Visual C++来制作通用安装程序的方法,由此你便拥有了一个独具

rainkop的专栏 5651

VC源码实现分形图像制作器

在本章中,我们将概述分形图像制作器的VC源代码,为接下来深入探讨其核心算法和实现细节打好基础。分形图像制作器作为一种利用计算机生成分形图案的工具,深受艺术家、数学家和计算机图形学家的喜爱。其源代码不仅涉及到复杂的数学算法,还要求开发者具备良好的软件工程实践。分形是自然界中一种普遍存在的复杂几何结构。它具有自相似性,即在不同尺度下都显示出相似的模式。这种性质使得分形图形即使放大到极高的倍数,也仍然能观察到与整体相似的细节。

weixin_42607969的博客 831

VC++ 安装程序制作

VC++ 安装程序制作 2009-10-25 10:40 当用VC++完成应用程序的编制后,如果不为它制作一个安装程序,似乎感到缺少一点什么, 你也许急于到市面找制作安装程序的工具,如"CreateInstall"、" iSetup"等,事实上,VC++6.0 的企业版已为我们提供了一套制作安装程序的工具"InstallShield for Microsoft Visu

zhongyhc的专栏 6831

vc制作的安装包程序

制作的安装包程序,很好用.用于安装程序包

VC通用安装和卸载程序

本程序为Visual C++来制作通用安装和卸载程序,使你拥有一个独具特色的通用安装和卸载程序。 安装程序处理包括: (1)将zip包应用程序文件解压到安装目录; (2)创建桌面和开始菜单快捷方式; (3)在注册表写入应用信息。 卸载程序处理包括: (1)删除安装目录文件; (2)删除桌面和开始菜单快捷方式; (3)删除注册表应用信息。 The software for the Visual C + + to make generic install and uninstall programs, you have a unique common install and uninstall programs. The installation procedures include: (1) extract the zip package application files to the installation directory; (2) to create desktop and start menu shortcuts; (3) the application of information written in the registry. The uninstall procedures including: (1) delete the install directory files; (2) delete the desktop and start menu shortcuts; (3) delete the registry application information.

vc++开发安装程序实例

前言 市面上有很多安装程序制作软件;但是,要实现个性化安装程序,还是自己动手来写一个更为妥当。本文介绍基本的安装程序制作的步骤。 安装程序可以分为几个功能点:1 资源的嵌入、释放。2 资源的解压。3 生成快捷方式。 1 资源导入和释放 导入 在VS资源视图,点击“”添加资源“,再选择“导入资源”,将需要安装的程序导入即可。导入的资源一般是安装程序的压缩包。 释放:将资源释放到指定目录 //将指定资...

530

VC++制作程序安装向导完整源码实现

VC++制作程序安装向导完整源码实现,制作自制安装包,单步进入操作向导安装程序流程。

VC中利用FLASH制作图声并茂的动画程序

1.                                                               VC中利用FLASH制作图声并茂的动画程序                                                                         作者:通信指挥学院三十一队 罗少波

StoneRain 3503

Installshield for VC++ 6.0 安装包制作工具

VC++6.0安装包制作工具,用于发布自己开发好的程序。该InstallShield是专门为Microsoft Visual C++6定制的,所以从Visual C++6开发环境中直接运行InstallShield更快捷方便。   当用户用Visual C++6调试好应用程序后并编译成Release版的EXE文件,就可选择"Tools"菜单中"InstallShield Wizard"命令,执行下列过程

vc++6.0安装程序

vc++6.0安装程序,有需要的请自行下载,

VC工具栏图标制作流程

VC工具栏图标制作流程本篇文章来源于:开发学院 http://edu.codepub.com   原文链接:http://edu.codepub.com/2010/0326/21372.php VC做工具栏上的图标,或其他用到的图标是比较麻烦的了,遇到了几次,干脆把流程写下来:(1)准备好要用到的图标资源,记得图标是有可能有版权的,http://www.iconfinder.n

Huichao_Zhi的专栏 905

MATLAB 论文复现——面向紧急需求响应的规模化灵活资源负荷管理快速决策方法

其次,对灵活资源参与EDR的功率分配模型进行了建模,并提出了基于分层分布式共识算法的快速决策方法,对功率分配模型进行快速求解,以满足EDR实时性的需求,在保证较高精度的前提下提高了决策速度。[1]孔祥玉,杨至端,孙裕策,等.面向紧急需求响应的规模化灵活资源负荷管理快速决策方法[J/OL].电力系统自动化,1-13[2024-07-29].http://kns.cnki.net/kcms/detail/32.1180.TP.20240709.1843.002.html.关键词: 规模化灵活资源;

sjr1478的博客 374

VC制作Dll

之前在写VC程序的时候习惯了将所有的代码都使用静态编译来生成程序,虽然方便,但是考虑到以后难免会由于某些原因而需要使用动态编译来链接程序。所以,经过一番摸索,终于学会制作自己的Dll,以下我就举两个例子来分享下,以方便自己以后查看用到,同时也方便其他同仁遇到同样的问题时能快速解决问题。             以下例子本人在 VC2010 中成功测试通过!         例子一:     

xbmoxia的专栏 1363

ESP32 IDF开发 应用篇⑲ 空中升级OTA

在实际产品开发过程中,在线升级可以远程解决产品软件开发引入的问题,更好地满足用户需求。OTA(空中)更新是使用 Wi-Fi 连接而不是串行端口将固件加载到 ESP 模块的过程。(1)、ESP32 的 OTA 升级有三种方式:·Arduino IDE:主要用于软件开发阶段,实现不接线固件烧写·Web Browser:通过 Web 浏览器手动提供应用程序更新模块·HTTP Server:自动使用http服务器 - 针对产品应用在三种升级情况下,必须通过串行端口完成第一个固件上传。

lu330274924的博客 3324

LSM6DS3TR-C IMU传感器入门:从MEMS原理到姿态解算实战

惯性测量单元(IMU)是现代智能设备实现运动感知的核心部件,其基础原理基于微机电系统(MEMS)技术。MEMS加速度计通过检测质量块在惯性力作用下的位移来测量线性加速度,而陀螺仪则利用科里奥利力效应感知角速度。这种技术使得微型化、低成本的6自由度运动测量成为可能,为机器人、无人机、可穿戴设备等提供了关键的空间姿态和运动状态信息。在实际工程中,开发者需要掌握I2C/SPI通信协议、传感器数据读取与校准,并通过互补滤波等算法融合加速度计和陀螺仪数据,实现稳定的姿态解算。LSM6DS3TR-C作为一款高性价比的6

weixin_28684655的博客 596

用VC制作非常酷的工具条

http://www.rosipay.com/4/2468.html用VC制作非常酷的工具条 自微软推出Windows 95后,一大批全新的控件使我们的应用程序更加美观,使用也更加方 便。其中一个显著的变化就是工具条不再是一个突出的3D小方框,而是变成了平面的状态,但 是只要把鼠标移动到上面,它就会自动地浮出来,大大方便了用户。 笔者经过一段时间摸索,终于找到了制作这种工具条的方法。原来Windo

skyremember的专栏 1395

PV-RCNN实战:如何在KITTI数据集上实现3D目标检测(附完整代码解析)

本文提供了在KITTI数据集上实战PV-RCNN 3D目标检测的完整指南,涵盖环境配置、数据预处理、模型训练与评估全流程。通过详细的代码解析和调参技巧,帮助读者掌握这一融合点与体素优势的经典3D目标检测模型,并实现从理论到实践的跨越。

weixin_29098391的博客 403

VC维(VC Dimension)

定义 VC Dimension:全称是Vapnik-Chervonenkis dimension。其用来衡量一个模型的复杂度,定义为:在该模型对应的空间中随机撒x点,然后对其中的每个点随机分配一个2类标签,使用你的模型来分类,并且要分对,请问x至多是多少。这个x就是VC维。 例子 1.线性函数 如果选用二维空间中的直线作为判别函数,该分类模型的VC维是多少? 答案:3 解释:如果是3个点,无论如何随机的打标签,都存在一条直线都可以将两类样本分开。 如果是4个点,就可能会出现一种标签序列,使得不存在一条直线将

qq_43391414的博客 1万+

Innovus Function ECO实战:5步搞定数字后端设计中的网表修正(含Calibre LVS验证技巧)

本文提供了一份完整的Innovus Function ECO实战指南,详细解析了数字后端设计中网表修正的五步流程。从理解Function ECO概念、准备关键文件,到在Innovus中执行逻辑比对、自动布线及GUI检查,并重点攻克了ECO后Calibre LVS验证的难点与调试技巧,帮助工程师高效、精准地完成流片前的设计微调。

day7的博客 949

LangGraph实战训练营-从零构建AI驱动的wiki知识库

本文深入解析 LangChain 团队开源的 Deep Agents 框架核心示例——LLM Wiki,一个基于大语言模型自动构建和维护持久化知识库的生产级 AI Agent 系统。文章从项目架构、环境搭建、核心原理到实战操作全面展开:详解 CompositeBackend 组合后端与细粒度权限控制的安全设计、四种工作模式(初始化/摄取/查询/质量检查)的完整流程、LangSmith 远程沙箱的隔离执行机制,以及人机协同审核(HITL)的实践应用。

program哲学 198

VC9、VC11、VC14、VC15库 最新下载链接

更新版本的PHP是用VC11,VC14或VC15(分别为Visual Studio 2012,2015或2017编译器)构建的,并且包括性能和稳定性的改进。 由于还是有少部份人在Apache+PHP低版本的是时候,需要用上VC9(Visual C++ 2008)因此今天更新出来。 VC9构建需要安装Visual Studio 2008 x86或x64的Visual C ++ Redistrib...

jackbon8的博客 3万+

信息传输仿真:卫星通信系统仿真_(12).基于SystemVue的卫星通信仿真

SystemVue是Cadence公司开发的一款用于系统级设计和仿真的软件工具。它主要用于无线通信系统的设计和验证,特别是在卫星通信、雷达、射频和微波通信等领域。SystemVue提供了一个集成的环境,用户可以通过拖拽和连接各种预定义的模块来构建复杂的通信系统模型,从而进行性能分析和优化。

2401_87715305的博客 1370
上一篇: 对于VC制作安装程序什么工具比较好
GoldCoder
博客等级 码龄17年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值