API实现程序自动升级
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.apk2、Android模拟器端的开发环境:Ubuntu+eclipse+ADT五、流程详解及关键点说明:(一) 新版本的应用程序(NewAppSample)准备:a) 新建一个android工程,编辑其版本代码为2,高于我们的旧版本用于更新测试,版本名称为1.0.1b) 编辑应用程序对应的版本信息文件version.json说明:后缀为json的文件是一种轻量级的数据交换格式,比xml要快很多,适合于小型数据的网络交换,其实质类似键值对,键用字符串的形式表示与其值用冒号隔开,能存储多种数据类型。
微信小程序发布新版本时自动提示用户更新的方法

微信⼩程序发布新版本时⾃动提⽰⽤户更新的⽅法如图,当⼩程序发布新的版本后,⽤户如果之前访问过该⼩程序,通过已打开的⼩程序进⼊(未⼿动删除),则会弹出这个提⽰,提醒⽤户更新新的版本。
⽤户点击确定就可以⾃动重启更新,点击取消则关闭弹窗,不再更新。
const updateManager = wx.getUpdateManager()updateManager.onCheckForUpdate(function (res) {// 请求完新版本信息的回调console.log(res.hasUpdate)})updateManager.onUpdateReady(function () {wx.showModal({title: '更新提⽰',content: '新版本已经准备好,是否重启应⽤?',success(res) {if (res.confirm) {// 新的版本已经下载好,调⽤ applyUpdate 应⽤新版本并重启updateManager.applyUpdate()}}})})updateManager.onUpdateFailed(function () {// 新版本下载失败})官⽅提供的demo中,只有最基本的更新提⽰,并未做异常处理。
⽽且官⽅也说了这个功能基础库 1.9.90 开始⽀持,低版本需做兼容处理,那么就需要对着端代码进⾏改进了。
另⼀⽅⾯,如果当前版本更新有重⼤调整,⼀定需要⽤户更新,那么可以在⽤户点击取消的回调中给出提⽰,并重新进⼊版本提⽰流程。
如下图,在上边的更新提⽰中,⽤户点击取消,则弹出下⾯提⽰弹窗,⽤户点击确定,则更新版本,点击取消,则重新调⽤上边的更新提⽰。
总之,⽤户只有更新了,才能正常访问⼩程序(如⾮必须,建议慎⽤)。
//app.jsApp({onLaunch: function(options) {this.autoUpdate()},autoUpdate:function(){console.log(new Date())var self=this// 获取⼩程序更新机制兼容if (wx.canIUse('getUpdateManager')) {const updateManager = wx.getUpdateManager()//1. 检查⼩程序是否有新版本发布updateManager.onCheckForUpdate(function (res) {// 请求完新版本信息的回调if (res.hasUpdate) {//2. ⼩程序有新版本,则静默下载新版本,做好更新准备updateManager.onUpdateReady(function () {console.log(new Date())wx.showModal({title: '更新提⽰',content: '新版本已经准备好,是否重启应⽤?',success: function (res) {if (res.confirm) {//3. 新的版本已经下载好,调⽤ applyUpdate 应⽤新版本并重启updateManager.applyUpdate()} else if (res.cancel) {//如果需要强制更新,则给出⼆次弹窗,如果不需要,则这⾥的代码都可以删掉了wx.showModal({title: '温馨提⽰~',content: '本次版本更新涉及到新的功能添加,旧版本⽆法正常访问的哦~',success: function (res) {self.autoUpdate()return;//第⼆次提⽰后,强制更新if (res.confirm) {// 新的版本已经下载好,调⽤ applyUpdate 应⽤新版本并重启updateManager.applyUpdate()} else if (res.cancel) {//重新回到版本更新提⽰self.autoUpdate()})}}})})updateManager.onUpdateFailed(function () {// 新的版本下载失败wx.showModal({title: '已经有新版本了哟~',content: '新版本已经上线啦~,请您删除当前⼩程序,重新搜索打开哟~',})})}})} else {// 如果希望⽤户在最新版本的客户端上体验您的⼩程序,可以这样⼦提⽰wx.showModal({title: '提⽰',content: '当前微信版本过低,⽆法使⽤该功能,请升级到最新微信版本后重试。
计算机软件网络自动升级模块

1.升级文件可能是多个文件,包括压缩文件和非压缩文件,该系统中默认的压 缩文件格式是因特网上使用最广泛的 7+)格式。每一个文件(指非压缩文件,对 压缩文件而言则指解压缩后的各个文件)都对应于一个子目录名,用来表示在升 级时该文件被放置的目录。它是一个相对目录,在升级过程中和用户机器上应用 软件安装的主目录组合成一个绝对路径。基于上面的讨论,定义了如下主要对象 体系:($)数据储存基类:6&898 该类是一个模板类,专门处理对象数据的储 存与读取,任何需要储存数据的类都是它的子类。(!)磁盘文件类:6&+1:;+(’ 它是 6&898 类的子类,用来描述一个磁盘文件。它主要包含两个属性:属 性;+(’58<’ 表示被下载文件的全路径;属性=>?&+@ 表示该文件被下载后放 置到用户机器上的相对目录名。 2(A)下载文件类:6&/0-B/8.;+(’它是 6&898 类的子类,用来描述一个下载文 件,由于一个下载文件可能是压缩格式,即包含多个文件,因此它是 6&+1:C;+(’ 对象的集合.(D)下载配置参数类:6&/0-B/8.E/-F+G 它是 6&898 类的子类,用 来描述一个下载配置参数文件,最终的配置文件由该类生成。由于下载配置文件 需要包含,’?服务器端和客户端的信息,它的属性和方法也分别描述上述两个部 分。下载的文件可能为多个,每个文件都可能是压缩格式,因此本类是 6&/0-B/8.;+(’对象的集合 3(%)下载类:6&/0-B/8.HI9+/-它是 6J?K’I9 类的子类,用来实现,’? 文件下 载,对它的详细讨论参见下一节。A ,’? 文件下载算法,’? 文件的下载主要是 通过 L66M 协议和,+-1/I: HMN 实现的。在 L66M 协议中常用的请求方法有两种: OP6 和:G.H,对下载而言使用 E<H 方法。最简化的 E<H 请求包如下:E<H IJ19KL MHH: N $#$,其中 IJ19KL 表示客户端欲下载的文件路径,“MHH: N $#$”表示协议版本号。这里的 IJ19KL 在直接下载和使用代理下载时是不同的。 若为直接下载它是一个相对*,-,如“N D)26#O’J”; 若通过代理服务器下载 则是一个全*,-,如“K99J:N N @P9F#)DF#87 N D)26#O’J”。程序生成 E<H 请 求包,在成功连接对应 3)4 服务器的 Q" 或其它端口后,使用基于 H5: 协议的 同步模式套接字发送请求包并等待返回信息。服务器将返回。一个应答包,格式 为:
一种软件系统自动升级方法

一种软件系统自动升级方法
软件系统自动升级可以通过以下方法实现:
1. 自动检测更新:软件系统可以定期检查最新版本的升级,并提醒用户进行更新。
这可以通过在软件启动时进行检查,或者在后台运行时进行检查来实现。
2. 下载和安装更新:一旦发现有新版本可用,软件系统可以自动下载更新并安装,或者提示用户进行下载和安装。
3. 后台更新:软件系统可以在后台运行时进行更新,不干扰用户的正常操作。
4. 自动回滚:如果更新失败或导致系统不稳定,软件系统可以自动回滚到之前的版本,确保用户的系统不被损坏。
5. 用户设置选项:用户可以选择自动更新的时间、频率和是否应用更新等选项,以满足用户的不同需求。
通过以上方法,软件系统可以实现自动升级,为用户提供更好的使用体验,同时也能及时修复系统中的漏洞和bug。
用VB6.0编写的自我升级的程序请参考

以下是我的具体思路:写两个程序,一个是主程序;一个是升级程序(升级程序放在服务器上);说明:所有升级任务都由升级程序完成。
1.启动升级程序,升级程序连接到网站,下载新的主程序(当然还包括支持的库文件等)到临时文件夹; 2.升级程序检测旧的主程序是否活动,若活动则关闭旧的主程序(同时记下主程序的状态);3.删除旧的主程序,拷贝临时文件夹中的文件到相应的位置,同时注册相应的文件;4.检查主程序的状态,若状态为活动的,则启动新的主程序; 5.关闭升级程序。
6.祝贺你,升级完成。
由于网友提出了关于升级这个升级程序的问题,以下是对其思路进行的一点补充,但原文仍然是升级主程序的,具体代码需读者自己添加:7.主程序升级完毕;8.升级程序继续检查所下载的临时文件中是否含有NewU pdate.exe(新的升级程序)和re name.exe(是一个可以更改文件名的程序);9.若存在以上两个文件,表示要更新Updat e.exe文件;启动renam e.exe程序,同时updat e.exe关掉自己;10.ren ame.e xe程序检测upda te.ex e是否已被关掉,若已关掉,删除该upda te.ex e。
移动临时文件夹中的NewU pdate.exe文件到主程序的目录下,同时更名为updat e.exe;11.re name.exe关掉自己。
12.OK,至此升级程序也被升级了。
下面进行具体的程序编写,需建立三个工程,然后把它们编辑成一个组,三个工程需共用一个模块。
建立工程步骤:1.建立工程proMa in:打开vb,“新建工程”,选择“标准EXE”,再给工程中添加模块,并且命名为modC ommon,修改窗体名为frm Main,同时修改工程名为pr ojMai n,然后保存到某个文件夹(譬如在桌面建立个文件夹U pdate),窗体、模块和工程分别保存为frmMa in.fr m、mod Commo n.bas、proj Main.vbp;2. 建立工程proj NewMa in:点击菜单“文件新建工程” ,选择“标准EX E”,点击菜单“工程添加模块”,在弹出的对话框中选择“现存”标签,定位到Upd ate文件夹,选中m odCom mon.b as模块。
Android应用更新之自动检测版本及自动升级

Android应⽤更新之⾃动检测版本及⾃动升级本⽂为⼤家分享了Android⾃动检测版本及⾃动升级的具体代码,供⼤家参考,具体内容如下步骤:1.检测当前版本的信息AndroidManifest.xml–>manifest–>[Android]2.从服务器获取版本号(版本号存在于xml⽂件中)并与当前检测到的版本进⾏匹配,如果不匹配,提⽰⽤户进⾏升级,如果匹配则进⼊程序主界⾯。
(demo中假设需要更新)3.当提⽰⽤户进⾏版本升级时,如果⽤户点击了“更新”,系统将⾃动从服务器上下载安装包并进⾏⾃动升级,如果点击取消将进⼊程序主界⾯。
效果图如下:下⾯介绍⼀下代码的实现:1.获取应⽤的当前版本号,我是封装了⼀个⼯具类来获取 // 获取本版本号,是否更新int vision = Tools.getVersion(this);获取当前版本号⼯具类:public class Tools {/*** 检查是否存在SDCard** @return*/public static boolean hasSdcard() {String state = Environment.getExternalStorageState();if (state.equals(Environment.MEDIA_MOUNTED)) {return true;} else {return false;}}/*** 2 * 获取版本号 3 * @return 当前应⽤的版本号 4*/public static int getVersion(Context context) {try {PackageManager manager = context.getPackageManager();PackageInfo info = manager.getPackageInfo(context.getPackageName(),0);String version = info.versionName;int versioncode = info.versionCode;return versioncode;} catch (Exception e) {e.printStackTrace();}return 0;}}2.获取服务器版本号,是否要更新(此处就是简单的⽹络请求拿到需要的数据即可,我是写了固定值) // 获取更新版本号private void getVersion(final int vision) {// {"data":{"content":"其他bug修复。
VAT_API 软体使用手册说明书

目录1. VAT_API软体介绍 (1)1.1 软体基本功能 (1)1.2 系统需求 (1)1.3 软体主界面 (1)1.3.1 菜单 (2)1.3.2 图像显示模块 (3)1.3.3 缺陷显示模块 (4)1.3.4 状态栏 (4)1.3.5一键测试模块 (4)1.3.6 相机信息模块 (5)1.3.7手动测试模块 (5)1.3.8检测模块 (6)1.3.9批量测试模块 (6)1.3.10 TT显示模块 (7)1.3.11 亮度测量模块 (7)1.4 机种设置 (7)1.4.1 机种设置界面 (7)1.4.2 机种列表 (8)1.4.3 相机pattern设置 (8)1.4.4 参数设置 (12)1.4.5 算法设置 (13)1.5 系统设置 (15)1.6 判片规则 (16)1.6.1 判片规则主界面 (16)1.6.2 单一规则设置 (16)1.7 批量检测 (18)1.7.1 “批量检测”界面 (18)1.8 端子测试 (19)1.8.1 “IO测试”主界面 (19)1.8.2 输出IO测试与配置 (19)1.8.3 输入IO测试与配置 (20)1.9 扫码测试 (20)1.9.1 “扫码测试”主界面 (20)1.9.2 串口配置 (20)1.9.3 扫码测试 (21)1.9.4 功能测试 (21)1.10 版本信息 (22)1.10.1 “版本显示”主界面 (22)1.10.2 软件版本号 (22)1.10.3 算法版本号 (22)1.11 除尘控制 (22)1.11.1 “除尘控制”主界面 (22)1.12 用户设置 (23)1.12.1 “用户设置”主界面 (23)1.13 上报设置 (24)1.13.1 “上报设置”主界面 (24)1.14 扫码查图 (24)1.14.1 “扫码查图”主界面 (24)1.15 设置不检区 (25)2 AOI程序升级介绍 (25)2.1 VAT_API软体升级 (26)2.2 PCIE驱动升级 (27)2.3 TFTP升级 (28)2.3.1 TFTP升级软件概述 (28)2.3.2 升级网络 (29)2.3.4 TFTP软体升级步骤 (29)2.4 RemoteLoad升级 (30)2.4.1 “RemoteLoad-读版本号”升级软件概述 (30)2.4.2 “RemoteLoad-读版本号”升级软件主界面 (30)2.4.3 “RemoteLoad-读版本号”升级操作步骤 (31)异常处理手册(待更新) (33)1. PC异常处理 (34)1.1 PC无法识别PCIE板卡 (34)1.2 PPC电脑不显示E盘或E盘容量变小 (34)2. 相机异常处理 (35)1.1相机连接状态异常 (35)1.2 MainCCD取像不清晰 (36)3. 图像采集器异常处理 (36)4.图像处理器异常处理 (36)5. 配置异常处理 (37)6. 系统升级异常处理 (37)6.1 PCIE驱动升级异常处理 (37)6.2 TFTP升级异常处理 (37)6.2.1没有找到连接的PCIE硬件设备 (37)API 软件使用手册1. V AT_API软体介绍1.1 软体基本功能V AT_API软体是控制AOI设备进行各项功能的主要软体。
Electron实现应用打包、自动升级过程解析

Electron实现应⽤打包、⾃动升级过程解析成功搭建了vue + electron的helloworld程序,这次将electron应⽤打包及⾃动升级的流程梳理了⼀下。
1. 应⽤打包使⽤electron builder打包只需要在vue.config.js中配置即可,这⾥需要注意的是,默认情况下electron builder打包出来的安装程序是不能修改安装⽬录的,需要allowToChangeInstallationDirectory这个配置设置为true。
// see https:///configmodule.exports = {productionSourceMap: false,pluginOptions: {electronBuilder: {nodeIntegration: true,builderOptions: {appId: 'com.itqn.electron.helloworld',productName: 'helloworld',// see https://www.electron.build/configuration/publish#genericserveroptionspublish: {provider: 'generic',url: 'http://192.168.1.100/itqn/electron/helloworld'},win: {// must be at least 256x256icon: './public/favicon.ico'},asar: false,nsis: {oneClick: false,// 允许修改安装⽬录allowToChangeInstallationDirectory: true,allowElevation: true,createDesktopShortcut: true,createStartMenuShortcut: true,shortcutName: 'helloworld'}}},configureWebpack: {resolve: {symlinks: true}}}}接着执⾏下⾯的命令进⾏应⽤打包npm run electron:build如果成功打包,将为在项⽬的dist_electron⽬录中⽣成对应的exe。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
社区彩票社区农场社区赌场社区法院社区房产社区股市欢迎大家到这个网上的共同的家园交流你的思想、分享你的经验!收藏本页联系我们论坛帮助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_filetimeglobal type s_filetime from structurelong dwlowdatetimelong dwhighdatetimeend type2、s_win32_find_dataglobal type s_win32_find_data from structurelong dwfileattributess_filetime ftcreationtimes_filetime ftlastaccesstimes_filetime ftlastwritetimelong nfilesizehighlong nfilesizelowlong dwreserved0long dwreserved1character cfilename[255]character calternatefilename[14]end type3、s_netresourceglobal type s_netresource from structurelong dwScopelong dwTypelong dwDisplayTypelong dwUsagestring lpLocalNamestring lpRemoteNamestring lpCommentstring lpProviderend type一、WNetAddConnection2Afunction 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说明创建同一个网络资源的连接返回值Long,零表示成功。
>0表示失败参数表参数类型及说明lpNetResource 在这个结构中设置了下述字段,对要连接的网络资源进行了定义:dwType,lpLocalName (可为 vbNullString), lpRemoteName, lpProvider (设为 vbNullString 表示用默认提供者)。
该结构的其他所有变量都会被忽略lpPassword String,可选的一个密码。
如为vbNullString,表示采用当前用户的默认密码。
如为一个空字串,则不用任何密码lpUserName String,用于连接的用户名。
如为vbNullString,表示使用当前用户dwFlags Long,设为零;或指定常数CONNECT_UPDATE_PROFILE,表示创建永久性连接2、WNetGetConnectionAfunction ulong WNetGetConnectionA(String lpszLocalName, String lpszRemoteName, long cbRemoteName) library "mpr.dll"说明:VB声明Declare Function WNetGetConnection Lib "mpr.dll" Alias "WNetGetConnectionA" (ByVal lpszLocalName As String, ByVal lpszRemoteName As String, cbRemoteName As Long) As Long说明获取本地或已连接的一个资源的网络名称返回值Long,零表示成功。
>0表示失败。
参数表参数类型及说明lpszLocalName String,本地设备的名字lpszRemoteName String,指定一个字串缓冲区,用于装载设备的资源名称cbRemoteName Long,lpszRemoteName缓冲区的字符数量。
如缓冲区不够大,则设为需要的缓冲区长度3、FindFirstFileAfunction ulong FindFirstFileA(string lpFileName, REF s_WIN32_FIND_DATA lpFindFileData) Library "kernel32.dll"VB声明Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long说明根据文件名查找文件返回值Long,如执行成功,返回一个搜索句柄。
如果出错,返回一个INVALID_HANDLE_VALUE常数,一旦不再需要,应该用FindClose函数关闭这个句柄参数表参数类型及说明lpFileName String,欲搜索的文件名。
可包含通配符,并可包含一个路径或相对路径名lpFindFileData WIN32_FIND_DATA,这个结构用于装载与找到的文件有关的信息。
该结构可用于后续的搜索注解由这个函数返回的句柄可以作为一个参数用于FindNextFile函数。
这样一来,就可以方便的枚举出与lpFileName参数指定的文件名相符的所有文件4、FindClosefunction ulong FindClose(ulong hFindFile) Library "kernel32.dll"VB声明Declare Function FindClose Lib "kernel32" Alias "FindClose" (ByVal hFindFile As Long) As Long说明关闭由FindFirstFile函数创建的一个搜索句柄返回值Long,非零表示成功,零表示失败。
会设置GetLastError参数表参数类型及说明hFindFile Long,由FindFirstFile函数提供的搜索句柄5、CompareFileTimefunction ulong CompareFileTime( REF s_filetime lpFileTime1, REF s_filetime lpFileTime2) library "kernel32.dll" Alias for "CompareFileTime"VB声明Declare Function CompareFileTime Lib "kernel32" Alias "CompareFileTime" (lpFileTime1 As FILETIME, lpFileTime2 As FILETIME) As Long说明根据FILETIME结构的信息,对比两个文件的时间返回值Long,如两个时间相等,就返回零;如lpFileTime1小于lpFileTime2,返回-1;如lpFileTime2小于lpFileTime1,返回1参数表参数类型及说明lpFileTime1 FILETIME,参考FILETIMElpFileTime26、CopyFileAfunction ulong CopyFileA(string lpExistingFileName, string lpNewFileName, long bFailIfExists) library "kernel32.dll" Alias for "CopyFileA"VB声明Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long 说明复制文件。
与vb的filecopy命令相似返回值Long,非零表示成功,零表示失败。
会设置GetLastError参数表参数类型及说明lpExistingFileName String,源文件名lpNewFileName String,目标文件名bFailIfExists Long,如果设为TRUE(非零),那么一旦目标文件已经存在,则函数调用会失败。
否则目标文件被改写----------------------------------------------I say I am not hereBelieve or notI say I am in your mindSure or notI have no wings,But I fly with boasting and lying.2004-10-31 6:58:53hongjuan头衔:菜鸟协会会长等级:管理员威望:1文章:35158积分:44536魅力:34850现金:18265存款:11106门派:足彩协会住址:幸福之家21号注册:2003-12-31第 2 楼三、连接函数F_CONNECT_COPYSERVER返回路径global type f_connect_copyserver from function_ O B J E C Tend typeforward prototypesglobal function string f_connect_copyserver ()end prototypesglobal function string f_connect_copyserver ();STRING GS_COPYSERVER1STRING GS_COPYSERVER2STRING GS_COPYSERVER3STRING GS_COPYLOGINUSER1STRING GS_COPYLOGINUSER2STRING GS_COPYLOGINUSER3STRING GS_COPYLOGINPASS1STRING GS_COPYLOGINPASS2STRING GS_COPYLOGINPASS3GS_COPYSERVER1 = ProfileString("autodown.ini","downpath","COPYSERVER1","") GS_COPYSERVER2 = ProfileString("autodown.ini","downpath","COPYSERVER2","") GS_COPYSERVER3 = ProfileString("autodown.ini","downpath","COPYSERVER3","") GS_COPYLOGINUSER1 = ProfileString("autodown.ini","downpath","COPYLOGINUSER1","") GS_COPYLOGINUSER2 = ProfileString("autodown.ini","downpath","COPYLOGINUSER2","") GS_COPYLOGINUSER3 = ProfileString("autodown.ini","downpath","COPYLOGINUSER3","") GS_COPYLOGINPASS1 = ProfileString("autodown.ini","downpath","COPYLOGINPASS1","") GS_COPYLOGINPASS2 = ProfileString("autodown.ini","downpath","COPYLOGINPASS2","") GS_COPYLOGINPASS3 = ProfileString("autodown.ini","downpath","COPYLOGINPASS3","")s_netresource ss_netss_net.dwScope = 0ss_net.dwType = 0//ss_net.dwDisplayType = 0ss_net.dwUsage = 0ss_net.lpLocalName = ''//ss_net.lpRemoteName = GS_COPYSERVER1//ss_net.lpComment = ''ss_net.lpProvider = ''//long ll_retstring ls_pathls_path = ''ll_ret = WNetGetConnectionA('',GS_COPYSERVER1,255)if ll_ret <> 0 thenll_ret = WNetGetConnectionA('',GS_COPYSERVER2,255)if ll_ret <> 0 thenll_ret = WNetGetConnectionA('',GS_COPYSERVER3,255)if ll_ret = 0 thenreturn GS_COPYSERVER3end ifelsereturn GS_COPYSERVER2end ifelsereturn GS_COPYSERVER1end if//gl_handle,ll_ret = WNetAddConnection2A(ss_net,GS_COPYLOGINPASS1,GS_COPYLOGINUSER1,1) if ll_ret <> 0 thenss_net.dwScope = 0ss_net.dwType = 0//ss_net.dwDisplayType = 0ss_net.dwUsage = 0ss_net.lpLocalName = ''//ss_net.lpRemoteName = GS_COPYSERVER2//ss_net.lpComment = ''ss_net.lpProvider = ''//ll_ret = WNetAddConnection2A(ss_net,GS_COPYLOGINPASS2,GS_COPYLOGINUSER2,1) if ll_ret <> 0 thenss_net.dwScope = 0ss_net.dwType = 0//ss_net.dwDisplayType = 0ss_net.dwUsage = 0ss_net.lpLocalName = ''//ss_net.lpRemoteName = GS_COPYSERVER3//ss_net.lpComment = ''ss_net.lpProvider = ''//ll_ret = WNetAddConnection2A(ss_net,GS_COPYLOGINPASS3,GS_COPYLOGINUSER3,1) if ll_ret <> 0 then//messagebox('错误!','连接服务器错误!',stopsign!)return ls_pathend ifls_path = GS_COPYSERVER3elsels_path = GS_COPYSERVER2end ifelsels_path = GS_COPYSERVER1end ifif isnull(ls_path) then ls_path = ''//messagebox('',ls_path)return ls_pathend function---------------------------------------------- I say I am not hereBelieve or notI say I am in your mindSure or notI have no wings,But I fly with boasting and lying.2004-10-31 6:59:24hongjuan头衔:菜鸟协会会长等级:管理员威望:1文章:35158积分:44536魅力:34850现金:18265存款:11106门派:足彩协会住址:幸福之家21号注册:2003-12-31第 3 楼四、统计复制文件数量函数F_CONNECT_COPYCOUNT需要控件:LISTBOX(3个)返回值:需要下载的文件个数。