当前位置:文档之家› 版本自动更新程序及3种实现策略

版本自动更新程序及3种实现策略

版本自动更新程序及3种实现策略
版本自动更新程序及3种实现策略

版本自动更新程序及3种实现策略

C/S程序是基于客户端和服务器的,在客户机编译新版本后将文件发布在更新服务器上。然后建立一个XML文件,该文件列举最新版本号和所有文件及文件最后修改日期。如文件较多可以通过工具自动建立XML 文件。当某客户机运行程序后会自动下载这个XML文件,通过与本地机器上的版本号匹配,如本机上的版本号比服务器上的要旧,通知客户机运行更新程序。如用户更新了版本,将最新版本号写入配置文件,这样方便下一次匹配。

通过可行性分析可以使用下面3种方案下载

1.局域网共享文件夹下载

2.Tcp/ip远程下载

3.通过Web方式下载。

方式1适合内部网络,功能简单,编程只需调用File.Copy()就能实现。如建立VPN网络,也可视为远程下载。我们只需在服务器上共享一个文件夹并设定访问权限,然后将最新版本文件存放在这个目录。升级程序直接从这个目录Copy文件即可。

方式2是通过基于tcp/ip 的Socket组件编程来实现,使用这个机制必须有服务器监听程序。其简单设计思路是在服务器端启动TcpListener监听客户端的Socket连接,当Client发送连接请求,TcpListener捕获当前请求的Socket,并获取收到的数据(字符串,称为

命令)。然后由命令处理程序分析该字符串,如果字符串头部包含GET_FILE标识则为下载文件请求。

例:客户机向服务器程序发送请求命

令:"GET_FILE|D:\PUBLISH\TEST.DLL"。首先TcpListener捕获当前请求的Socket.并接收到字符数据

"GET_FILE|D:\PUBLISH\TEST.DLL",通过分析发现"GET_FILE"标识符,表示下载文件请求.然后通过

socket.SendFile(file="D:\PUBLISH\TEST.DLL")将文件传送给当前Socket。客户端由NetworkStream.Read()方法接收来自服务器发送的文件。

方式3是通过.NetFramework提供的WebClient组件下载文件。只需指定DownloadData()方法中参数address(url)。

通过上面的介绍,1,3方法最简单。Tcp/ip相对复杂。

下面讲解版本更新程序系统框架图

主窗体<->下载控制器<->XmlLoader关系图

图解:

frmUpgrader窗体内定义了一个下载控制器及2个TreeView控件. 当执行[检查更新],控制器调用当前下载器的DownloadServerXml()

方法从服务器下载XmlServerFiles.xml文件。下载成功将文件交给XmlLoader分析器,分析器创建XmlDocument对象。最后将XML 分析器作为FileView构造器参数创建FileView实例,分别调用FileView的LoadTreeViewClient方法创建客户端文件清单的TreeView及LoadTreeViewServer方法创建服务器端文件清单的TreeView。TreeView的数据来源是两个Xml文件。

DownloadController 下载控制器,它负责建立下载策略及控制当前下载器。

FileView对象实际是个TreeView生成器。它跟据Xml结构自动生成TreeView.

XmlLoader分析器主要功能是分析服务器端及本地的XML文件(XmlServerFiles.xml和XmlClientFiles.xml)。XmlLoader类图列举了所有方法,从图中可以看出控制XmlDocument对象。通过XmlDocument.SelectSingleNode方法查找某个指定的文件,然后获取文件最后修改日期文件名等信息用于匹配。

IDownloader接口定义了所有下载器的方法,下面会详细讲解3个下载器的实现策略。

FileInfo是文件的实体类,结构相当简单,只包含文件名,物理路径及最后修改时间。

三种不同的下载器实现方案:

三种不同的下载器实现方案类及接口说明:

frmUpgrader: 主窗体

DownloadController:下载控制器,如上图所示,它是控制IDownloader接口。

IDownloader: 下载器接口, 三种不同的下载器分别实现了这个接口LAN_Downloader: 局域网复制文件下载器。

WebClient_Downloader: 广域网下载器,通过WebClient组件下载文件。

TcpIp_Downloader: Tcp/ip下载器。需要运行Tcp/ip服务器提供下载服务。

主窗体有[检查更新]及[开始更新]两个按钮。分别调用下载控制器的CheckUpdate()及Download()方法。

下载控制器控制IDownloader接口,三种不同的下载器分别实现了这个接口,通过对象多态原理,实际上是

下载控制器间接控制着实现IDownloader接口的所有下载器。我们可以把DownloadController理解为桥接(Bridge)

或适配器(Adpater)。IDownloader接口实现了3种下载策略,这也是策略模式的应用。

Tcp/IP下载器图解:

关于Tcp/IP下载这里有个案例

使用Tcp/Ip下载文件(图)

https://www.doczj.com/doc/f617451811.html,/bbs/html/090809_561.html

Tcp/IP下载器需要有服务器程序支持,使用tcp/ip传送文件其简单设计思路是在服务器端启动TcpListener监听客户端的Socket连接。当Client发送连接请求,TcpListener捕获当前请求的Socket,并获取收到的数据(字符串,称为命令)。然后由命令处理程序分析字符串,如果字符串头部包含GET_FILE则为下载文件请求。

例:如客户机向服务器程序发送请

求:"GET_FILE|D:\PUBLISH\TEST.DLL"。首先TcpListener捕获当前请求的Socket,收到字符串,如果是下载文件请求就通过socket.SendFile(file="D:\PUBLISH\

TEST.DLL")将文件传送给当前Socket。在客户端由NetworkStream.Read()方法接收来自服务器发送的文件。

参考上图来理解如何实现:

UpgraderServer 是tcp/ip服务器的核心类。他控制TcpListener 对象,TcpListener负责监听客户端的Socket连接。

当有下载文件请求时就调用SendFile()方法将文件传送给当前连接的Socket.

Stop()方法用来关闭服务器.

SendFile()方法用来发送文件

StartListening()方法用户启动监听程序。

TcpListener是监听程序,它负责监听客户端的Socket连接。如有连接请求触发AccecptSocket方法。该方法返回当前请求的Socket 对象。

UpgraderClient是tcp/ip客户端的核心类。他控制TcpClient对象, TcpClient对象负责监听来自服务器的请求。

DownloadFile()方法详解:

要明白客户端是如何接收文件,先要明白NetworkStream对象. NetworkStream是提供用于网络访问的基础数据流。客户机监听来自服务器的数据是通过NetworkStream.Read()方法实现的,当程序执行到ns.Read()方法时就开始监听,同时中断下面代码执行,直到接收到数据才会执行Read()下面的代码。请看代码。

byte[] resBytes = new byte[256]; //一次接收256字节

int resSize; //当前接收到的数据长度

do

{

//开始监听,同时中断下面代码执行,直到接收到数据才会执行Read()下面的代码。

resSize = ns.Read(resBytes, 0, resBytes.Length);

string msg = Byte2Str(resBytes);

if (msg.Trim().ToUpper() == "FILE_NOT_FOUND")

{

if (_writeOutput != null) _writeOutput("找不到文件:" + file);

break;

}

if (resSize == 0) break;

ms.Write(resBytes, 0, resSize);

} while (ns.DataAvailable);

ns.Close();

请注意while (ns.DataAvailable)这段代码,当接受到来自服务器的数据时DataAvailable=True,然后通过NetworkStream.Read方法每次读取256字节,直到读取完所有数据时DataAvailable=false。这时监听工作完成,跳出while循环。最后调用FileStream对象保存文件。

TcpIp_Downloader Tcp/IP下载器方法

Download():下载XmlServerFiles.xml定义的所有文件DownloadFile(FileInfo file):下载单个文件DownloadServerXml():下载服务器上的文件清单

Init() //初始化下载器

IDownloader下载器接口定义

///

/// 下载器接口

///

public interface IDownloader

{

void Init(); //初始化下载器

void Download();//下载所有文件

FileInfo DownloadFile(FileInfo file); //下载单个文件

XmlLoader XmlServer { get;} //服务器上的Xml文件

XmlLoader XmlLocal { get;}//客户机上的Xml文件

int DownloadsCount { get;} //下载成功的文件总数

int DownloadFaliedCount { get;}//下载失败的文件总数

void DownloadServerXml(); //下载服务器上的文件清单(xml文件)

void SetProgressBar(ToolStripProgressBar progress);

void SetTrace(ListBox logList);

}

下载器类型

///

/// 下载器类型

///

public enum DownloadType

{

Intranet = 1,

TcpIp = 2,

WebDownload = 3

}

下载控制器,该控件器可以创建3种不同的下载器。

///

/// 下载控制器,该控件器可以创建3种不同的下载器。

/// 策略模式应用。

///

public class DownloadController

{

private IDownloader _downloader = null;

public IDownloader CurrentDownloader { get { return _downloader; } }

private TreeView _tvServerFiles;

private TreeView _tvLocalFiles;

private ListBox _log;

private ToolStripProgressBar _progress = null;

public DownloadController(IDownloader downloader)

{

_downloader = downloader;

}

///

/// 跟据下载类型创建3种不同的下载策略

///

public static DownloadController Create(DownloadType type)

{

if (DownloadType.Intranet == type)

return new DownloadController(new LAN_Downloader());

if (DownloadType.TcpIp == type)

return new DownloadController(new TcpIp_Downloader());

if (DownloadType.WebDownload == type)

return new DownloadController(new WebClient_Downloader());

return null;

}

public void Download()

{

_log.Items.Add("开始下载....");

_downloader.SetProgressBar(_progress);

_downloader.Init();

_downloader.SetTrace(_log);

_downloader.Download();

_log.Items.Add("下载完成....");

_log.Items.Add("刷新文件列表....");

//下载完成更新视图

new FileView(_downloader.XmlLocal, _progress).LoadTreeViewClient(_tvLocalFiles, null); _log.Items.Add("完成.");

}

public void CheckUpdate()

{

_log.Items.Add("开始检查服务器上有用更新....");

_downloader.SetProgressBar(_progress);

_downloader.Init();

_downloader.SetTrace(_log);

//加载Treeview

new FileView(_downloader.XmlServer, _progress).LoadTreeViewServer(_tvServerFiles);

new FileView(_downloader.XmlLocal, _progress).LoadTreeViewClient(_tvLocalFiles,

_downloader.XmlServer);

if (_downloader.XmlLocal.HasNewVersion)

_log.Items.Add("服务器上有最新版本,请更新.");

else

_log.Items.Add("检查完成,没有发现新版本.");

}

public void BindControls(TreeView tvServerFiles, TreeView tvLocalFiles, ListBox log, ToolStripProgressBar progress)

{

_progress = progress;

_tvLocalFiles = tvLocalFiles;

_tvServerFiles = tvServerFiles;

_log = log;

}

}

文件对象定义

///

/// 文件对象

///

public class FileInfo

{

private string _name = "";

private string _FullPath = "";

private DateTime _ModifyTime = DateTime.MinValue;

public FileInfo() { }

public FileInfo(string fileName, string fullPath, DateTime lastEditDate)

{

https://www.doczj.com/doc/f617451811.html, = fileName;

this.FullPath = fullPath;

this.ModifyTime = lastEditDate;

}

///

/// 纯文件名,不包含路径。:如upgrader.exe

///

public string Name { get { return _name; } set { _name = value; } }

///

/// 文件完整路径。如:[.\8.8.8.2\abc.dll]

///

public string FullPath { get { return _FullPath; } set { _FullPath = value; } }

///

/// 最后更新时间。

///

public DateTime ModifyTime { get { return _ModifyTime; } set { _ModifyTime = value; } }

public override string ToString()

{

return https://www.doczj.com/doc/f617451811.html,;

}

}

XML文件解释器,分析服务器/客户端的xml文件

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

using System.Xml;

using System.Collections;

using System.Windows.Forms;

namespace VJSDN.Tech.AutoUpgraderLib

{

///

/// XML文件解释器,分析服务器/客户端文件清单。

///

public class XmlLoader

{

private XmlDocument _xml;

public XmlDocument XML { get { return _xml; } }

private string _xmlFilePath;

public XmlLoader(string xmlFile)

{

_xml = new XmlDocument();

_xmlFilePath = xmlFile;

if (System.IO.File.Exists(xmlFile)) _xml.Load(xmlFile);

}

private bool _HasNewVersion = false;

//本机文件清单与服务器文件清单比较后是否发现新版本。

public bool HasNewVersion { get { return _HasNewVersion; } set { _HasNewVersion = value; } }

///

/// 创建空的Xml文件

///

///

public static XmlLoader CreateEmpty(string xmlFilePath)

{

string xml =

" \r\n" +

" \r\n" +

"本机最近更新清单 \r\n" +

" \r\n" +

" \r\n" +

" \r\n" +

" \r\n" +

" \r\n" +

" \r\n" +

" \r\n";

//删除旧的更新文件

if (File.Exists(xmlFilePath)) File.Delete(xmlFilePath);

string dir = Path.GetDirectoryName(xmlFilePath);

if (!Directory.Exists(dir)) throw new Exception("不存在目录:" + dir);

StreamWriter sw = File.CreateText(xmlFilePath);

sw.Write(xml);

sw.Flush();

sw.Close();

return new XmlLoader(xmlFilePath);

}

//保存最后更新信息

public void SetLastUpdateInfo(string version, DateTime lastUpdateTime)

{

XmlNode nodeVersion = _xml.SelectSingleNode("Upgrader/Application/Version");

XmlNode nodeTime = _xml.SelectSingleNode("Upgrader/Application/LastUpdateTime");

nodeVersion.Attributes["value"].Value = version;

nodeTime.Attributes["value"].Value = lastUpdateTime.ToString();

}

//获取xml文件版本信息

public string GetVersion()

{

XmlNode ver = _xml.SelectSingleNode("Upgrader/Application/Version");

if (ver != null)

return ver.Attributes["value"].Value;

else

return "";

}

///

/// 比较服务器与本机文件的最后更新时间。

/// 返回True:表示可以更新。False:服务器与本机文件版本一致。

///

/// 服务器上的文件

///

public bool CompareFile(FileInfo file)

{

if (file == null) return true; //文件没找到,为不相同,返回True;

XmlNode node = this.GetFileNode(file.FullPath);

if (node == null) return true; //文件没找到,为不相同,返回True;

DateTime date;

if (DateTime.TryParse(node.Attributes["lastModify"].Value, out date))

{

return https://www.doczj.com/doc/f617451811.html,pareTo(date) > 0;

}

return false;

}

///

/// 比较两个XmlNode的日期大小

///

public bool CompareNode(XmlNode node1, XmlNode node2)

{

if (node1 == null || node2 == null) return false;

DateTime date1 = Common.StrToDate(node1.Attributes["lastModify"].Value); DateTime date2 = Common.StrToDate(node2.Attributes["lastModify"].Value);

return https://www.doczj.com/doc/f617451811.html,pareTo(date2) > 0;

}

//获取在xml文件的结点

public XmlNode GetFileNode(string fullPath)

{

string xPath = @"Upgrader/Files/File[@fullPath=''" + fullPath + "'']";

XmlNode node = _xml.SelectSingleNode(xPath);

return node;

}

//获取在xml文件的结点,转换为FileInfo对象。

public FileInfo GetFileInfo(string fullPath)

{

XmlNode node = this.GetFileNode(fullPath);

if (node != null)

{

FileInfo fi = new FileInfo();

fi.FullPath = node.Attributes["fullPath"].Value;

fi.ModifyTime = Common.StrToDate(node.Attributes["lastModify"].Value); https://www.doczj.com/doc/f617451811.html, = node.Attributes["fileName"].Value;

return fi;

}

return null;

}

///

/// 在客户端的Xml记录文件加入更新记录

///

///

///

public void AddOrUpdateHistory(FileInfo serverFile, FileInfo clientFile)

{

XmlNode node = GetFileNode(serverFile.FullPath);

if (node == null)

XmlNode fileRoot = _xml.SelectSingleNode("Upgrader/Files");

node = _xml.CreateNode(XmlNodeType.Element, "File", "");

fileRoot.AppendChild(node);

}

node.RemoveAll();//先删除结点内的数据

node.Attributes.Append(CreateAttribute("fileName", https://www.doczj.com/doc/f617451811.html,));

node.Attributes.Append(CreateAttribute("fullPath", serverFile.FullPath));

node.Attributes.Append(CreateAttribute("lastModify", serverFile.ModifyTime.ToString())); }

private XmlAttribute CreateAttribute(string name, string value)

{

XmlAttribute attr = _xml.CreateAttribute(name);

attr.Value = value;

return attr;

}

//保存历史记录

public void Save()

{

_xml.Save(_xmlFilePath);

}

///

/// 获取文件数量

///

public int FilesCount

{

get

{

XmlNode node = _xml.SelectSingleNode("Upgrader/Files");

return node.ChildNodes.Count;

}

}

///

/// 获取文件列表

///

public IList GetFiles()

{

IList files = new ArrayList();

XmlNode node = _xml.SelectSingleNode("Upgrader/Files");

foreach (XmlNode n in node.ChildNodes)

FileInfo sf = new FileInfo();

sf.FullPath = n.Attributes["fullPath"].Value;

sf.ModifyTime = Common.StrToDate(n.Attributes["lastModify"].Value);

https://www.doczj.com/doc/f617451811.html, = n.Attributes["fileName"].Value;

files.Add(sf);

}

return files;

}

}

}

版本自动更新程序及3种实现策略(一)文档及UML图

版本自动更新程序及3种实现策略(二)下载器实现

程序界面及系统设置

图1-版本升级程序服务器端设置

1. 服务器端程序发布URL地址,该参数用于Web下载器连接的url 地址。

2. 服务器端程序发布目录,用于tcp/ip下载器下载的目录。

3. 服务器端程序共享目录,用于Lan下载器下载的目录.

以前3个参数跟据选择的下载器类型做相应设置。

图2-本机配置

本地程序发布目录:用于任一下载器下载文件后存放文件的目录。

图3-下载器设置(更新参数设置,未改名)

选择三种下载器中任何一种作为当前下载器。

图4-Tcp/Ip下载器服务器程序.

当您选择Tcp/Ip下载器升级程序,请先运行服务器端程序。

图5-版本自动升级程序主界面

运行程序前先要配置系统参数,配置文件保存在程序运行目录下的upgrader.dat文件。参考上面的所介绍的系统设置界面。跟据选择的下载器类型作相应配置。

如出现以下提示,说明您还没有配置程序目录下无upgrader.dat 文件.

图6-没有配置文件提示窗体

服务器程序发布目录结构如下图:

图7-服务器程序发布目录结构

D:\Shared\是服务器上的目录,该目录存放最新版本文件及XmlSer verFiles.xml 文件清单。

清单文件可以通过枚举目录下包括子目录下所有文件自动生成,下次更新版本时只需调整某几项内容。

XmlServerFiles.xml 文件内容

服务器端文件清单

AppSettings.cs 系统参数代码实现(序列化对象保存为文件)

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

using System.Windows.Forms;

namespace VJSDN.Tech.AutoUpgraderLib

{

///

/// 系统参数。序列化对象保存为文件.

///

[Serializable]

public class AppSettings

{

private string _ServerSharedFolder = "";

private string _ServerIP = "";

private int _ServerPort = 0;

private string _ServerFilesXml = "";

private string _ServerPublishFolder = ""; //用于tcp/ip下载.服务器上程序文件的发布目录。

private string _ServerPublishUrl = "";

private string _ClientSaveFolder = "";

private string _ClientFilesXml = "";

private int _DownloaderType = 0;

private static AppSettings _instance = null;

///

/// 系统参数实例。

///

public static AppSettings Instance

{

get

{

if (_instance == null) CreateDefault();

return _instance;

}

}

private static void CreateDefault()

{

_instance = new AppSettings();

_instance.ServerFilesXml = "XmlServerFiles.xml";

_instance.ServerSharedFolder = @"\\192.168.1.2\Shared";

_instance.ServerPublishUrl = "https://www.doczj.com/doc/f617451811.html,/UserUpload";

_instance.ServerPublishFolder = @"d:\mypublish\autoupgrader";

_instance.ServerIP = "192.168.1.1";

Android应用程序的自动更新升级

Android应用程序的自动更新升级(自身升级、通过tomcat) 刚入手android一个多月,因公司需要提交技术文档,才写了这个demo测试,想保存下来,以备后用!有什么不对的地方欢迎大家指正,这个示例也是参考了网上别人的demo自己做的。 Android应用程序的升级(自身升级) 一、引言: 很多的Android应用都具有版本检测和自动更新的功能,用户一键就可以完成软件的升级和更新。Android应用程序的升级本质上是利用了Linux系统的软件包管理和安装机制,而对于上层这一功能的开发来说很容易,只需要我们开发人员利用Android自带的API就可以实现。 二、功能说明: 1、本示例用来实现单个应用程序的自身升级 2、程序启动时,连接tomcat7 web服务器进行版本的检测,若有新版本则提示更新 3、将从web服务器下载的新版本的APK文件放到sdcard中 4、监听新版本的APK应用是否安装完成,如果是,则将下载的apk文件从sdcard中删除 三、程序框架流程:

四、环境说明: 1、服务器端:Ubuntu下的tomcat7web服务器,安装后默认端口是8080,Android模拟器访问时要将apk文件放到/var/lib/tomcat7/webapps/ROOT/目录下,Android模拟器的访问方式是http://10.0.2.2/NewAppSample.apk 2、Android模拟器端的开发环境: Ubuntu+eclipse+ADT 五、流程详解及关键点说明: (一) 新版本的应用程序(NewAppSample)准备: a) 新建一个android工程,编辑其版本代码为2,高于我们的旧版本用于更新测试,版本名称为1.0.1 b) 编辑应用程序对应的版本信息文件version.json 说明:后缀为json的文件是一种轻量级的数据交换格式,比xml要快很多,适合于小型数据的网络交换,其实质类似键值对,键用字符串的形式表示与其值用冒号隔开,能存储多种数据类型。 (二) 旧版本的应用程序准备: 1、在其AndroidManifest.xml中定义版本代码为versionCode=”1”让其自动生成即可,我们主要利用程序的版本代码的高低来判断是否有新的版本,用于更新。 2、我们在应用程序启动时自动联网检测是否有新的版本,即在onCreate()函数中进行联网检测。 a) 从服务器获得读取版本信息文件version.json,我们单独写了一个类来实现,用其GetUpdateInfo静态方法来返回读取的version.json,返回形式是字符串。代码如下

用C#开发软件自动更新程序

用C#实现在线升级的关键步骤 这里我主要使用日期信息来检测是否需要下载升级版本。 4.1 准备一个XML配置文件 名称为AutoUpdater.xml,作用是作为一个升级用的模板,显示需要升级的信息。 名称为AutoUpdater.xml,作用是作为一个升级用的模板,显示需要升级的信息。 //xml版本号 //升级文件所在服务器端的网址 //升级文件的更新日期 //升级文件的版本号 //升级文件列表 //共有三个文件需升级 //允许重新启动应用程序 //启动的应用程序名 从以上XML文档中可以得知升级文档所在服务器端的地址、升级文档的更新日期、需要升级的文件列表,其中共有三个文件需升级:aa.txt、VB40.rar、VB4-1.CAB。以及是否允许重新启动应用程序和重新启动的应用程序名。 4.2 获取客户端应用程序及服务器端升级程序的最近一次更新日期 通过GetTheLastUpdateTime()函数来实现。 private string GetTheLastUpdateTime(string Dir) { string LastUpdateTime = ""; string AutoUpdaterFileName = Dir + @"\AutoUpdater.xml"; if(!File.Exists(AutoUpdaterFileName)) return LastUpdateTime; //打开xml文件 FileStream myFile = new FileStream(AutoUpdaterFileName,FileMode.Open); //xml文件阅读器 XmlTextReader xml = new XmlTextReader(myFile); while(xml.Read()) { if(https://www.doczj.com/doc/f617451811.html, == "UpdateTime") {

软件自动更新技术

软件自动更新思路 时间:2011-06-03 03:17:54 来源:作者:中原石油勘探局地质录井处付全彬 1前言 长期以来,广大程序员为到底是使用Client/Server,还是使用Browser/Server结构争论不休,在这些争论当中,C/S结构的程序可维护性差,布置困难,升级不方便,维护成本高就是一个相当重要的因素。有很多企业用户就是因为这个原因而放弃使用C/S。然而当一个应用必须要使用C/S结构才能很好的实现其功能的时候,我们该如何解决客户端的部署与自动升级问题?部署很简单,只要点击安装程序即可,难的在于每当有新版本发布时,能够实现自动升级。我们希望开发一个与具体应用无关的能够复用的自动升级系统。下面结合工作中所承担的井场数据中心项目为大家介绍如何实现可复用的自动升级系统。 2软件自动升级存在的困难 第一,为了查找远程服务器上的更新,应用程序必须有查询网络的途径,这需要网络编程、简单的应用程序与服务器通讯的协议。 第二是下载。下载看起来不需要考虑联网的问题,但要考虑下载用户请求的文件,以及在没有用户同意时下载大文件。友好的自动更新应用程序将使用剩余的带宽下载更新。这听起来简单,但却是一个技术难题,幸运的是已经有了解决方法。 第三个考虑因素是使用新版应用程序更换原应用程序的过程。这个问题比较有趣,因为它要求代码运行时将自己从系统删除,有多种办法可以实现该功能,本文程序主要通过比较新旧版本的日期号来实现替换新版本应用程序的功能。 3软件自动在线升级的原理 写两个程序,一个是主程序;一个是升级程序;所有升级任务都由升级程序完成。 3.1.启动升级程序,升级程序连接到网站,下载新的主程序(当然还包括支持的库文件、XML配置文档等)到临时文件夹; 3.2.升级程序获取服务器端XML配置文件中新版本程序的更新日期或版本号或文件大小; 3.3.升级程序获取原有客户端应用程序的最近一次更新日期或版本号或文件大小,两者进行比较;如果发现升级程序的日期大于原有程序的最新日期,则提示用户是否升级;或者是采用将现有版本与最新版本作比较,发现最新的则提示用户是否升级;也有人用其它属性如文件大小进行比较,发现升级程序的文件大小大于旧版本的程序的大小则提示用户升级。本文主要采用比较新旧版本更新日期号来提示用户升级。 3.4.如果用户选择升级,则获取下载文件列表,开始进行批量下载文档; 3.5.升级程序检测旧的主程序是否活动,若活动则关闭旧的主程序; 3.6.删除旧的主程序,拷贝临时文件夹中的文件到相应的位置; 3.7.检查主程序的状态,若状态为活动的,则启动新的主程序; 3.8.关闭升级程序,升级完成。 4实现在线升级的关键步骤 这里我主要使用日期信息来检测是否需要下载升级版本。 4.1 准备一个XML配置文件 名称为AutoUpdater.xml,作用是作为一个升级用的模板,显示需要升级的信息。 //xml版本号 <AutoUpdater> <URLAddres URL="http://192.168.198.113/vbroker/log/"/>//升级文件所在服务器端的网址

WSUS客户端补丁自动更新配置

在办公电脑上配置自动更新因为有部分电脑启用自动更新服务会出现错误。 所以我将排错步骤一起写进配置文档里。 第一步,在“运行”里输入 %windir% 找到微软补丁服务的文件夹 找到Softwaredistribution这个文件夹,将它删除掉。 如果直接删除,可能会提示有程序正在使用它。

删除Softwaredistribution文件夹的方法如下:以管理员的身份启动命令行管理器。 位置:开始-->程序-->附件-->命令提示符 右键点击,选择“以管理员身份运行”

使用net stop wuauserv 命令将更新服务程序停止掉。 然后就可以删除掉Softwaredistribution文件夹。 之后,在使用net start wuauserv 命令启动更新服务程序。 然后还需要确定一次windows update 这个服务是否已经启动了。在“运行”里输入 services.msc 进行查看 如果没有启动,就讲它启动起来。

到这里,准备步骤就已经完毕。 现在,开始配置每一台需要更新的机器的关键部分。指定WSUS更新服务器的IP。并设置自动更新和安装。在“运行”里输入gpedit.msc进入组策略管理。

找到:“管理模板”-->“Windows组件”-->“Windows Update”“双击鼠标左键”打开它 接下来是重要的配置步骤: 以上用箭头标注的六个地方需要配置。 启用“配置自动更新”,并选择“自动下载并计划安装” 安装时间,可以根据实际当前电脑开机的时段进行配置。

启用“指定Intranet Microsoft更新服务位置” 配置WSUS服务器IP地址 格式为 X.X.X.X 这个地址更具实际情况进行配置,每个网段的电脑配置IP会不一样。

VC++ 6.0 MFC 俄罗斯方块 自动求解 代码 源程序

#include #include #include #include #define tDown 1 //方块下落定时器的标识(编号) #define tPaint 2 //重绘定时器的标识(编号) #define tDownTime 500 //方块下落一行位置的时间间隔 #define tPaintTime 50 //窗口重绘的时间间隔 #define ROW 24 //地图的行数目(第23行不用) #define COL 14 //地图的列数目(第0列和第13列不用) #define MAX_CLASS 7 //方块形状数目 #define LEN 20 //每个方格大小为20×20像素 #define StartY -1 * LEN + 5 //-15,绘制俄罗斯方块地图时的边界起始位置#define StartX -1 * LEN + 5 //-15 int iDeleteRows = 0; //总共清除的行 int iTotalNum = 0; //总得分 char WindowTxt[100] = "俄罗斯方块游戏自动求解已关闭"; //窗口标题 char s1[] = "关闭", s2[] = "启动"; //用于启动/关闭自动求解功能时显示不同的标题

bool bAuto; //是否自动求解的标志 bool Pause; //是否暂停的标志 int Map[ROW][COL]; //俄罗斯方块的地图(被占据的方格为1,否则为0) int CurrentBox[4][4]; //当前落下的方块 int CurrentY, CurrentX; //当前落下方块的当前位置(指左上角位置) int NextBox[4][4]; //下一个将落下的方块 int Box[MAX_CLASS][4][4] = //7种方块形状 { { {0,0,0,0}, {1,1,1,1}, {0,0,0,0}, {0,0,0,0} }, { {0,0,0,0}, {0,1,0,0}, {1,1,1,0}, {0,0,0,0} }, { {0,0,0,0}, {1,1,0,0}, {0,1,1,0}, {0,0,0,0} }, { {0,0,0,0}, {0,1,1,0}, {1,1,0,0}, {0,0,0,0} }, { {0,1,1,0}, {0,0,1,0}, {0,0,1,0}, {0,0,0,0} }, { {0,1,1,0}, {0,1,0,0}, {0,1,0,0}, {0,0,0,0}

API实现程序自动升级

社区彩票 社区农场 社区赌场 社区法院 社区房产 社区股市 欢迎大家到这个网上的共同的家园交流你的思想、分享你的经验!收藏本页 联系我们 论坛帮助 redbridge 重登录隐身用户控制面板搜索风格论坛状态论坛展区社区设施社区服务退出 >> PowerBuilder编程技术与相关应用我的收件箱 (0) 程序员家园论坛→软件开发→ PowerBuilder → [转帖]使用PB调用API自动更新(非FTP模式) 您是本帖的第 12 个阅读者 * 贴子主题:[转帖]使用PB调用API自动更新(非FTP模式) hongjuan 头衔:菜鸟协会会长 等级:管理员 威望:1 文章:35158 积分:44536 魅力:34850 现金:18265 存款:11106 门派:足彩协会 住址:幸福之家21号 注册:2003-12-31 鲜花(0) 鸡蛋(0) 楼主 [转帖]使用PB调用API自动更新(非FTP模式)

一、STRUCTURE定义 1、s_filetime global type s_filetime from structure long dwlowdatetime long dwhighdatetime end type 2、s_win32_find_data global type s_win32_find_data from structure long dwfileattributes s_filetime ftcreationtime s_filetime ftlastaccesstime s_filetime ftlastwritetime long nfilesizehigh long nfilesizelow long dwreserved0 long dwreserved1 character cfilename[255] character calternatefilename[14] end type 3、s_netresource global type s_netresource from structure long dwScope long dwType long dwDisplayType long dwUsage string lpLocalName string lpRemoteName string lpComment string lpProvider end type 一、WNetAddConnection2A function ulong WNetAddConnection2A(ref s_netresource lpNetResource, String lpPassword, String lpUserName, long dwFlags) library "mpr.dll" Alias for "WNetAddConnection2A" 说明: VB声明 Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long

WSUS客户端补丁自动更新配置

在办公电脑上配置自动更新 因为有部分电脑启用自动更新服务会出现错误。 所以我将排错步骤一起写进配置文档里。 第一步,在“运行”里输入%windir% 找到微软补丁服务的文件夹 找到Softwaredistribution这个文件夹,将它删除掉。 如果直接删除,可能会提示有程序正在使用它。 删除Softwaredistribution文件夹的方法如下: 以管理员的身份启动命令行管理器。

位置:开始-->程序-->附件-->命令提示符 右键点击,选择“以管理员身份运行” 使用net stop wuauserv 命令将更新服务程序停止掉。 然后就可以删除掉Softwaredistribution文件夹。 之后,在使用net start wuauserv 命令启动更新服务程序。 然后还需要确定一次windows update 这个服务是否已经启动了。

在“运行”里输入services.msc 进行查看 如果没有启动,就讲它启动起来。 到这里,准备步骤就已经完毕。 现在,开始配置每一台需要更新的机器的关键部分。 指定WSUS更新服务器的IP。并设置自动更新和安装。 在“运行”里输入gpedit.msc进入组策略管理。 找到:“管理模板”-->“Windows组件”-->“Windows Update”“双击鼠标左键”打开它

接下来是重要的配置步骤: 以上用箭头标注的六个地方需要配置。 启用“配置自动更新”,并选择“自动下载并计划安装”安装时间,可以根据实际当前电脑开机的时段进行配置。 启用“指定Intranet Microsoft更新服务位置”

资料WindowsUpdate自动更新错误代码大全

【资料】Windows Update 自动更新错误代码大全 在使用Windows Update更新时,时常会遇到过这样的情况:“升级没有成功,只给出一段不知其意的代码如“XXXXXX”!让人无从下手,特将这些错误提示的代码的整理出来供大家参考! Windows Update 错误51F 如果在尝试安装更新时收到Windows Update 错误51F,则Microsoft Office 2003 产品的本地安装源(LIS) 已损坏。LIS 是Office 2003 产品用来安装程序和Office 程序更新的软件。 Windows Update 错误52F

如果在尝试安装更新时收到Windows Update 错误52F,说明Microsoft Office 2003 产品的本地安装源(LIS) 已损坏。LIS 是Office 2003 产品用来安装程序和Office 程序更新的软件。 Windows Update 错误80070070 如果在尝试安装更新时收到Windows Update 错误80070070,请释放计算机上的磁盘空间,然后重新尝试。 Windows Update 错误80070002 如果在检查更新时收到Windows Update 错误80070002,需要删除Windows 用于确定计算机更新的临时更新文件。若要删除这些文件,请完成下面的所有步骤,然后重新尝试检查Windows 更新。 Windows Update 错误80070003 如果在检查更新时收到Windows Update 错误80070003,则需要删除Windows 用于识别计算机更新的临时文件。若要删除这些临时文件,请完成下面的所有步骤,然后重新尝试检查Windows 更新。 Windows Update 错误80070422 如果在下载更新时收到Windows Update 错误80070422,可能需要更改Windows

客户端常见问题及解决办法

客户端常见问题及解决办法 客户端简介: 宽带认证客户端是由北京城市热点公司开发的宽带接入认证程序。主要用于高校,企业,或者其他局域网上网认证,以及网络管理。 客户端常见问题及解决办法: 常见问题有:登陆超时失败、code(21)、账号正在使用、用户名或密码错误、本账号只能在指定ip使用、其他程序占用端口、下载的客户端安装时出现乱码、IP地址错误或网卡被禁用、网络连接受限等。 1.其他程序占用端口: 提示图 原因:你电脑中正在运行的某个应用程序占用了客户端的通信端口(客户端通信端口UDP 61440)、杀毒软件或防火墙也会引起此类问题。 解决办法:方法一.检查出现这个问题之前,你安装了什么应用软件,把这个应用软件卸载掉或者在任务管理器中停掉相应的进程;方法二.开始——运行——输入"cmd”回车——再输入"netsh winsock reset "回车然后重启电脑(前提是在XP下,或vista的特权模式下)方法三..卸载客户端——重启电脑,下载最新版本的客户端重新安装。 2.code21错误: 客户端提示图 原因:客户端程序与本机安装的防火墙有系统冲突、应用程序破坏了客户端所写的注册表信息、本机系统的协议工作状态异常也会导致code(21) 解决办法:

方法一右键点击客户端图标选择属性,在打开的属性窗口中点击 查找目标,会自动打开客户端安装的文件夹,选择文件双击。 方法二这个可以用命令netsh winsock reset 解决,前提是在XP下,或vista 的特权模式下 方法三以上使用之后还不能解决,建议用户卸载客户端——重启电脑——再安装客户端 3.登陆超时失败: 出现此类问题比较多,原因也很多, 客户端提示图 原因及解决办法: (1)本地连接显示已经连接上,但还是上不了网,此类问题多是系统问题,用户可查看客户端登录服务器地址 是否正确,我校客户端登陆服

源代码版本管理

目录 1 Visual Studio环境下源代码版本管理 2 Eclipse环境源代码版本管理 3体会

1Visual Studio环境下源代码版本管理 1.1SubVersion+TortoiesSVN的配置 1.1.1安装SubVersion 。(下载地址: https://www.doczj.com/doc/f617451811.html,/servlets/ProjectDocumentList?folderID=8100&exp andFolder=8100&folderID=91),例如我安装到D:/SVN/SubVersion 1.1.2安装TortoiseSVN。(下载地址:https://www.doczj.com/doc/f617451811.html,/downloads),这是一个SubVersion的图像化管理工具,没有它也可以,但是管理SubVersion需要使用命令行的形式,安装过TortoiseSVN可以在右键菜单出现相应的选项。例如我安装到了D:/SVN/TortoiseSVN 1.1.3建立版本库(repository)。这点和VSS一样,我们需要一个库来存放版本信息。创建方式有两种通过SubVersion的命令行或者通过TortoiseSVN的图形界面来创建。我们就直接通过TortoiseSVN创建,例如我想在D盘建立一个文件夹SVNServices 用来放版本库,然后在其中建立一个EMIData的文件夹作为我的项目EMI的版本库,这是我对EMIData点击右键--TortoiseSVN—Create Repository here 即可将EMIData最为一个版本库,这是你会发现EMIData文件夹中多了很多的文件。 1.1.4启动SVN服务。到这里我们的SubVersion其实还没有启动,我们在cmd命令行输入:svnserve –-daemon –-root D:/SVNServices这样我们就可以启动SVN并且以D:/SVNServices作为根目录。这里我要指明几点,第一就是输入的命令中两处都是两个‘-’,也就是‘--’而不是‘-’;第二点就是启动后cmd窗口使不能关闭的,

自动更新程序源码下载(C#.Net)=

由于微软提供的更新程序使用不方便,所以又写了此程序。此程序是本人一年前所写的一段程序,当时在开发一个CS版本报价系统,当时由于开发过程仓促,代码可能有点不是太规范此程序编译后只有一下AutoUpdate.exe文件与一个配置文件UpdateList.xml,主要通过本地程序与服务端程序文件的版本号来升级与更新本地程序文件。UpdateList.xml文件内容如下: Application autoUpdate http://10.0.5.98/SoftUpdate/ 2005-09-05 ItemSoft.exe . 1.0.0.0 说明: 程序的描述; 更新服务器地址,为一个虚拟目录或站点路径; 需要更新主程序文件,为exe; . 需要更新主程序文件所在路径; 1.0.0.0 主程序版本号; 需要更新的文件列表;Ver:文件版本号,Name:文件名,包括路径(相对); 使用时,在更新服务器上新建Web虚拟目录或站点,然后将需要更新的文件与UpdateList.xml放在上面; 本地将AutoUpdate.exe与UpdateList.xml放在主程序的根目录下。本地UpdateList.xml中的版本号如果小于服务端,自动程序会自动下载所需要更新的文件。 本人的完整.Net打包程序下载中所带的项目中,就使用了此更新程序。 源码下载:/Files/jenry/AutoUpdate.rar 二进制文件下载:/Files/jenry/bin.rar 生成配置文件UpdateList.xml工具:/Files/jenry/AULWriter1.0.rar(由whatisgood 提供,感谢!!)

系统自动更新AutoUpdate

系统自动更新分为插件更新和系统主程序更新,其中插件更新需要用户手动检查,系统主程序更新在程序启动时检查。 系统主程序更新 1.可更新除AutoUpdate.exe外的所有文件。 一般情况下不更新主程序配置文件,因为主程序配置文件里包含了用户个性化配置,如果更新主程序配置文件就会清空用户配置。 2.更新的前提条件如下: (1)需要配置IIS服务器提供Web服务,供AutoUpdate.exe从服务器上下载更 新文件。 (2)在程序中设置配置文件的路径: http://192.168.1.100/UFVideo/CSFiles/UpdateXMLFile.xml

配置文件的内容如下: 13 http://192.168.1.100//UFVideo/CSFiles/UpdateMainFiles.zip 配置文件提供了两个值一是最新的版本号13,二是更新文件的下载路径http://192.168.1.100//UFVideo/CSFiles/UpdateMainFiles.zip 3.AutoUpdate.exe的工作流程 (1)系统登录时主程序检查版本,主程序根据设置配置文件的服务器XML路径 检查比较自身版本和服务器提供版本是否一致,如果低于服务器版本就提示用户更新。 (2)用户根据提示同意更新后由主程序启动AutoUpdate.exe,并且在启动时提供三个参 数:最新的版本号、主程序名称、下载文件路径。 (3)AutoUpdate.exe启动后就开始根据提供的下载路径参数下载更新文件。(4)更新文件下载完成后解压到自身的启动目录中,完成文件更新。 (5)更新主程序配置文件中的版本号。 (6)重新启动主程序,完成更新任务。 using System; using System.Collections.Generic; using https://www.doczj.com/doc/f617451811.html,ponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using DevExpress.XtraEditors; using System.Threading; using Shell32; using System.Configuration; namespace AutoUpdate { public partial class XtraFormUpdate : DevExpress.XtraEditors.XtraForm { public XtraFormUpdate(string[] agr) { InitializeComponent(); this.ShowInTaskbar = false;

Qt实现软件自动更新

前言 最近在学习Qt开发上位机,想实现一个检查更新的功能,网上搜索了 一大圈,发现实现过程都很复杂,关键是代码看不懂,所以就自己开发一种 简单的方式来实现。实现效果如下: 1.点击“检查更新”按钮,如果当前版本低于远程的版本,那么会弹出如下 窗口,提示更新,并显示远程的的版本号,更新时间,更新说明,如下图所示: 2.如果点击"去下载",那么会调用系统默认浏览器,直接创建下载任务。点击"不更新",则取消更新。 如果当前版本号和远程一致,那么会提示"已经是最新版本": 实现原理 首先在远程放置了一个文件,内容包含最新版软件的版本号、下载链接、更新时间、更新说明等,当用户点击"检查更新"时,会访问这个文件的地址,并对文件内容进行解析,得到最新的版本号、下载链接、更新时间、更新说 明等,如果版本号比当前软件的版本号高,那么弹出更新窗口。

我们先创建一个文本文件,可以是TXT格式、XML格式、JSON格式等等,因为之前学习过JSON的解析,所以这里我选择了JSON格式,当然选择其他格式也都是可以的。命名为 software_update.json,内容如下: 1.{ 2."PulseSensor": 3. { 4. "LatestVerison":"V1.1", 5. "Url":" //XXX. XXX. XXX /Demo_v1.1.exe", 6. "UpdateTime":"2019-03-31", 7. "ReleaseNote":"\n1.添加检查更新说明,包含版本号,下载链接,更 新时间,更新说明.\n2.优化“关于”界面" 8. }, 9."RGBContrl": 10. { 11. "LatestVerison":"V1.0", 12. "Url":" //***. ***.***/Demo_v1.1.exe", 13. "UpdateTime":"2019-03-30", 14. "ReleaseNote":"版本说明" 15. } 16.} 其中Url键值,是最新版软件的下载地址,然后把这个文件存放到服务器上,可以通过链接直接访问,如果有软件发布,只需要修改这个文件的内容:版本号、下载链接、更新说明、更新时间。当然,从文件内容也可以看出,支持多个软件的说明放在一起。 Qt端的实现 Qt端的实现,主要使用到了网络请求和JSON解析两个部分。 1.pro文件添加网络支持 1.# 网络请求 2.QT += network 2.添加头文件 1.//网络相关头文件 2.#include 3.#include 4.#include 5.//JSON相关头文件 6.#include 7.#include 8.#include 3.对象的定义和函数的声明 1.QNetworkAccessManager *manager; //定义网络请求对象 2.int parse_UpdateJSON(QString str); //解析数据函数的声明 3.void replyFinished(QNetworkReply *reply); //网络数据接收完成槽函数的声 明 4.QString CurVerison = "V1.1"; //定义当前软件的版本号 4.连接信号与槽 1.manager = new QNetworkAccessManager(this); //新建 QNetworkAccessManager对象

软件源码版本管理系统要求规范

软件版本管理规范 1.第一章目的 本规范详细规定软件项目版本管理的对象、存储目录、分支、权限、维护等内容,使软件项目版本管理流程化并规范化,确保在系统开发和实施过程中项目的完整性和一致性。 2.第二章适用范围 所有系统开发及实施项目的软件项目都应进行版本管理。项目中所有正式文档和代码都应纳入配置库(可使用工具建立配置库,本文所述使用的是SVN)进行版本管理。 3.第三章职责 配置库管理员:负责配置库的日常维护和管理;监督开发及测试部门及时提交版本管理对象(即配置项)。 此岗位可由开发或测试人员兼任。 4.第四章内容 4.1. 版本管理对象 包括但不限于: ?项目总体计划 ?可行性研究报告 ?开发计划 ?需求说明书 ?需求设计原型 ?设计说明书 ?系统开发变更申请单 ?系统管理手册 ?用户操作手册 ?培训计划 ?培训记录 ?源程序 ?支持系统运行的配置文件

?存储过程脚本 ?测试计划 ?测试用例 ?测试脚本 ?测试报告 ?上线计划 ?上线申请 ?版本维护日志 4.2. 配置库的目录结构 每个项目在配置库中应拥有唯一的项目名称。配置库目录结构与项目内部的目录结构建议按下列格式创建。 配置库目录结构规划: ┠tags(发布) ┃ ├v1.0.0_T1_2016909 ┃ ├v1.0.0.33899_T1_20161009 ┃ ├v1.0.0_R1_20161109 ┃ ├v1.1.0_T1_20170109 ┃ └v1.1.0_R1_20170209 ┠trunk(主版本) ┃ └projectA ┃ ├src ┃ ├MY_MOOC ┃ ├doc ┃ ├tool ┃ ├。。。 ┖branches(分支) ├SY_ABC ├TJ_ABC ├WH_MOOC

自动更新程序源码

UpdateList.xml文件内容如下: Application autoUpdate http://10.0.5.98/SoftUpdate/ 2005-09-05 ItemSoft.exe . 1.0.0.0 说明: 程序的描述; 更新服务器地址,为一个虚拟目录或站点路径; 需要更新主程序文件,为exe; .需要更新主程序文件所在路径; 1.0.0.0主程序版本号; 需要更新的文件列表;Ver:文件版本号,Name:文件名,包括路径(相对); 使用时,在更新服务器上新建Web虚拟目录或站点,然后将需要更新的文件与UpdateList.xml 放在上面; 本地将AutoUpdate.exe与UpdateList.xml放在主程序的根目录下。本地UpdateList.xml中的版本号如果小于服务端,自动程序会自动下载所需要更新的文件。 本人的完整.Net打包程序下载中所带的项目中,就使用了此更新程序。

程序代码自动生成系统的设计与实现

万方数据

万方数据

万方数据

万方数据

基于敏捷开发的高校网络评教系统 作者:吴衡, WU Heng 作者单位:天水师范学院物理与信息科学学院,甘肃天水,741001 刊名: 计算技术与自动化 英文刊名:Computing Technology and Automation 年,卷(期):2011,30(4) 被引用次数:1次 参考文献(8条) 1.丁增富;葛信勇构建教学质量监控体系努力提高教学质量[期刊论文]-高等农业教育 2004(03) 2.陈莉和谐校园构建于素质教育双效联动[期刊论文]-中国市场 2007(2-3) 3.成奋华;金敏基于敏捷过程的IT项目范围管理的研究与应用[期刊论文]-计算机技术与发展 2010(10) 4.徐诚斌;王金平MVC在ThinkPHP框架中的应用研究 2011(03) 5.赵国栋;黄永中开源软件在高校的应用与推广策略研究[期刊论文]-中国资源综合利用 2007(01) 6.马文龙;高宝成用php实现基于MVC模式的Web应用程序开发 2008(07) 7.原晓林基于B/S教学管理系统的开发与研究[期刊论文]-山西警官高等专科学校学报 2009(04) 8.蓝蔚青;曹剑敏;张帆高校学生网络评教系统的构建与完善[期刊论文]-高等农业教育 2006(06) 引证文献(1条) 1.蒋建洪电子商务系统协同开发实践教学研究[期刊论文]-中国教育信息化·基础教育 2013(5) 本文链接:https://www.doczj.com/doc/f617451811.html,/Periodical_jsjsyzdh201104028.aspx

自动更换墙纸的小程序易语言源码

界面部图 所需程序的数据 的原代码: .版本 2 .支持库vclbase .程序集窗口程序集1 .程序集变量flag, 逻辑型 .程序集变量bmpfile, 文本型 .子程序_按钮_立即更换_被单击 ' ' 当"立即更换"按钮被按下时 ' Sub CmdNow_Click()

' Dim bmpfile As String ' '如果列表框中没有图片,不做任何操作 ' If Listfile.ListCount = 0 Then End ' '否则把选中的图片更换为墙纸 ' bmpfile = Listfile.List(Listfile.ListIndex) ' SystemParametersInfo SPI_SETDESKWALLPAPER, 0, bmpfile, SPIF_UPDA TEINIFILE ' End Sub .如果真(列表框1.取项目数() ≠0) bmpfile =列表框1.取项目文本(列表框1.现行选中项) .如果真(文件是否存在(bmpfile) =真) SystemParametersInfo (#SPI_SETDESKWALLPAPER, 0, bmpfile, #SPIF_UPDA TEINIFILE) .如果真结束 .如果真结束 .子程序_按钮_添加墙纸_被单击 ' ' 当"添加墙纸"按钮被按下时 ' Sub CmdAdd_Click() ' '弹出通用对话框(打开文件) ' On Error Resume Next ' ComOpen.CancelError = True ' ComOpen.ShowOpen ' If Err = cdlCancel Then Exit Sub ' '如果选择了墙纸图片则把图片的路径添加到列表框中去 ' Listfile.AddItem ComOpen.FileName ' End Sub .如果真(打开图片文件对话框1.打开()) 列表框1.加入项目(打开图片文件对话框1.文件名, ) .如果真结束 .子程序_按钮_退出_被单击 ' '当"退出程序"按钮被按下时,退出 ' Sub CmdExit_Click() ' Unload Me ' End Sub 结束() .子程序__启动窗口_创建完毕

如何实现CAD表格的自动更新

如何实现CAD表格的自动更新 经常需要使用表格的CAD工程师一定会有这样一个深刻的体会,与EXCEL异常强大的表格处理能力相比,CAD的表格简直就是“小儿科”。虽然,随着CAD技术的不断进步,CAD 软件的表格处理能力也在不断提升,但不管怎样,始终与EXCEL相距甚远。其实也不奇怪,谁让人家EXCEL是专业的呢! 当需要用的表格比较简单时,许多工程师选择直接在CAD中绘制。这种方式的缺点是,效率低,而且无法让表格实现自动统计功能,许多在EXCEL中可以轻易实现的功能,在CAD 表格中却难以实现。 当表格比较复杂时,很多人选择先在EXCEL中完成表格的编辑,然后,利用Ctrl+C和Ctrl+V快捷键的方式将表格直接复制到CAD中。这种方式明显比前一种方法优越,因为通过EXCEL,工程师就可以使用EXCEL表格中各种数学函数和自动统计功能。然而,这种方式依然有许多不尽如人意之处,比如,当外部的EXCEL表格的数据发生改变时,CAD表格中的表格不会自动更新。那,究竟有没有更完美的方法,让设计师在使用CAD的同时,又可以享受EXCEL强大的表格处理能力呢? 回答是肯定的。 虽然没能在CAD中实现像EXCEL那样强大的表格处理功能(包括AutoCAD),但浩辰CAD (2011以上版本)却给出了一种折中的解决方案——通过AutoXlsTable(一个小插件,已集成到软件中),实现CAD和EXCEL协同作业。 我想这么说,很多没用过这个功能的朋友一定还没明白,还是让我们来看看实际操作吧! 1、启动浩辰CAD(其它CAD软件好像没有这个功能),选择如下图所示的菜单命令。 2、选择命令后EXCEL会自动起动。当然,前提是你已经安装了EXCEL。而且,你会发现EXCEL的“加载项”中多了一个“AutoXlsTable”的按钮(如下图所示)。

相关主题
文本预览
相关文档 最新文档