| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 826 人关注过本帖
标题:给你的程序添加自动升级功能竟如此简单
只看楼主 加入收藏
sych
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:646
专家分:761
注 册:2019-10-11
收藏
 问题点数:0 回复次数:15 
给你的程序添加自动升级功能竟如此简单
只需要在你的程序最前面添加一句"=程序自动升级()",你的程序就拥有了自动升级的功能,当然幕后你需要及时把升级的程序上传到服务器,供下载更新使用
代码非常粗糙,请建言献策完善它
PROCEDURE 程序自动升级
Declare Long InternetGetConnectedStateEx In "wininet.dll" Long @, String@, Long, Long
DECLARE INTEGER URLDownloadToFile IN urlmon.dll    INTEGER pCaller, STRING szURL,STRING szFileName, INTEGER dwReserved,INTEGER lpfnCB
Declare Integer WinExec in kernel32 string, integer
LOCAL inifile,cRemoteFileini,cRemoteFileexe,selfname,lcCMD,Install,nname,cLocalFile,cRemoteFile,nResult,aa,sjmcm,nResult
mmver="0.00"  &&版本号,可以隐式存在,但必须有且递增
inifile="softini.ini"  &&这个文件名称请保证唯一且固定(临时文件夹下),用于存放升级文件信息
cRemoteFileini = "http://****/update.ini"  &&文件升级信息下载地址,包含升级文件特征信息。内容(版本号(4))
cRemoteFileexe = "http://****/******.exe"  &&升级文件下载地址,目前只是升级主程序
selfname=_GetAllProcessID()
IF file(addbs(sys(2023))+inifile)
    lcCMD = 'taskkill /f /im '+JUSTFNAME(FILETOSTR(addbs(sys(2023))+inifile))
    oWsh = CreateObject("wscript.shell")
    oWsh.Run(lcCMD, 0, .T.)
    ERASE (filetostr(addbs(sys(2023))+inifile))
    STRTOFILE(FILETOSTR(selfname),filetostr(addbs(sys(2023))+inifile))
    STRTOFILE(selfname,addbs(sys(2023))+inifile+"_")
    MESSAGEBOX("升级完成,马上重启软件",64+4096,"温馨提示",5000)
    lcCMD=filetostr(addbs(sys(2023))+inifile)
    ERASE (addbs(sys(2023))+inifile)
    winexec(lccmd,5)
    quit
endif
IF file(addbs(sys(2023))+inifile+"_")
    lcCMD = 'taskkill /f /im '+JUSTFNAME(FILETOSTR(addbs(sys(2023))+inifile+"_"))
    oWsh = CreateObject("wscript.shell")
    oWsh.Run(lcCMD, 0, .T.)
    ERASE (filetostr(addbs(sys(2023))+inifile+"_"))
    ERASE (addbs(sys(2023))+inifile+"_")
endif
Install = 0
nName = SPACE(513)
If InternetGetConnectedStateEx(@Install, @nName, 512, 0) > 0  &&网络已连接
    cLocalFile = ADDBS(SYS(2023))+SYS(3)+TRANSFORM(GetCurrentProcessId())+".ini" &&本地文件名
    cRemoteFile = cRemoteFileini
    nResult = URLDownloadToFile(0, cRemoteFile, cLocalFile, 0,0)
    IF nResult = 0
        aa=fiLEtostr(cLocalFile)
        ERASE (cLocalFile)
        IF aa>mmver
            MESSAGEBOX("软件有新版本,为了数据安全请及时升级"+CHR(13)+CHR(10)+"现在准备升级...",64+4096,"温馨提示")
            sjmcm= ADDBS(SYS(2023))+SYS(3)+TRANSFORM(GetCurrentProcessId())+".exe" &&本地文件名
            cRemoteFile = cRemoteFileexe
            nResult = URLDownloadToFile(0, cRemoteFile, sjmcm, 0,0)
            IF nResult = 0
                ERASE (addbs(sys(2023))+inifile)
                STRTOFILE(selfname,addbs(sys(2023))+inifile)
                winexec(sjmcm,0)
            else
                MESSAGEBOX("文件下载失败",64,"温馨提示")
            endif
            quit
        endif
    ENDIF
ENDIF
RETURN

FUNCTION _GetAllProcessID ()
local CurrentProcessid,lcTitle,th32ProcessID,dwsize,szexefile
DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
DECLARE Long GetModuleFileNameEx IN PsApi  Long hProcess, Long hModule, String @ lpExename, Long dwSize
DECLARE Long OpenProcess IN WIN32API Long dwDesiredAccess, Long bInheritHandle, Long dwProcessId
Declare Integer GetCurrentProcessId In kernel32.Dll
CurrentProcessid=GetCurrentProcessid()
lcTitle = bintoc(296,"4rs") + REPLI(CHR(0),292)
th32ProcessID = OpenProcess( 0x10 + 0x400, 0, CurrentProcessid)
dwSize = 260
szExeFile = REPLICATE( CHR(0), dwSize )
IF ( th32ProcessID>0 )
    dwSize = GetModuleFileNameEx( th32ProcessID, 0, @szExeFile, dwSize )
    CloseHandle( th32ProcessID )
endif
szExeFile = STREXTRACT(szExeFile,"",CHR(0))
RETURN szexefile
搜索更多相关主题的帖子: IF ERASE INTEGER 升级 Long 
2026-08-02 06:31
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:USA
等 级:贵宾
威 望:67
帖 子:2723
专家分:4967
注 册:2012-2-29
收藏
得分:0 
2026-08-02 06:58
sych
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:646
专家分:761
注 册:2019-10-11
收藏
得分:0 
chfs-windows-x86-3.1.rar (2.8 MB)

没条件的可以在自己的局域网内测试,chfs-windows-x86-3.1.exe是一个单文件的文件管理型服务器,双击运行后界面如图
图片附件: 游客没有浏览图片的权限,请 登录注册
,如果需要下载文件,浏览器地址栏输入下面地址即可
http://192.168.159.105/webdav/文件名
2026-08-02 07:22
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:USA
等 级:贵宾
威 望:67
帖 子:2723
专家分:4967
注 册:2012-2-29
收藏
得分:0 
回复 3楼 sych
2026-08-02 09:09
foxfans
Rank: 5Rank: 5
等 级:贵宾
威 望:15
帖 子:186
专家分:392
注 册:2021-10-23
收藏
得分:0 
升级脚本部分可以让AI优化一下,很多应用会把wscript.shell禁用,建议优先用API,以 自毁.exe为例
1.保持 自毁.exe 正在运行,完成自身句柄删除(不退出)。
2.完成下载仍为 自毁.exe,这时原程序还在运行,但是原先文件句柄没了,可以直接原名下载。
3.启动新下载的 自毁.exe,原先被删除的进程就可以退出。
这样就可以无感,无更名直接完成替换。
大概步骤:
1.GetModuleFileName(NULL, @cPath, xxx) -> cPath
2.CreateFile(cPath, 0x00010000.....)  配合SetFileInformationByHandle() -> 删除正在运行时的文件句柄关联
图片附件: 游客没有浏览图片的权限,请 登录注册

自毁.rar (71.67 KB)



[此贴子已经被作者于2026-8-5 08:58编辑过]

2026-08-02 10:10
sych
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:646
专家分:761
注 册:2019-10-11
收藏
得分:0 
我的代码都是抄的,你代码不公布出来我没法抄呀
2026-08-02 10:42
sych
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:646
专家分:761
注 册:2019-10-11
收藏
得分:0 
原来是用的这个,后来嫌麻烦就直接taskkill了
TerminateProcess(hprocess,   0)
2026-08-02 10:45
sych
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:646
专家分:761
注 册:2019-10-11
收藏
得分:0 
完成自身句柄删除是不是程序正在执行,文件也可以被覆盖,不会提示正在占用?
2026-08-02 11:08
foxfans
Rank: 5Rank: 5
等 级:贵宾
威 望:15
帖 子:186
专家分:392
注 册:2021-10-23
收藏
得分:0 
回复 8楼 sych
对的,删除自身,进程名还在,但是指向的原文件位置实际已经没了,你可以通过任务管理器进程列表(打开文件位置)观察,实际进程在运行,原始文件找不到了,这时候你可以替换新的EXE到原来的位置,然后想干嘛都行…………,网上搜下,自毁就应该有大量类似的代码。


[此贴子已经被作者于2026-8-2 11:21编辑过]

2026-08-02 11:15
sych
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:646
专家分:761
注 册:2019-10-11
收藏
得分:0 
搞不定,超出了我的能力范围
2026-08-02 22:13
快速回复:给你的程序添加自动升级功能竟如此简单
数据加载中...
 
   
关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019666 second(s), 10 queries.
Copyright©2004-2026, BCCN.NET, All Rights Reserved