在软件开发过程中,更新是一个不可或缺的环节。然而,手动更新软件往往耗时且容易出错。幸运的是,现在有了一种自动化更新库,可以为自动完成所有更新工作。只需要一个能够运行PHP的Web服务器来存储更新,其余的都由库来处理。
这个库提供了以下功能:
需要一个能够运行PHP的服务器。服务器运行的是PHP 7.3版本,但脚本也可以在旧版本上运行。它使用SQLite3来创建数据库,可以编辑它以支持MySQL或其他数据库。
编辑 tu.php
文件以更改数据库名称和默认管理员用户名及密码。
将 tu.php
上传到服务器。
访问 tu.php?admin
。这里有一个简单的管理面板,允许管理项目。创建项目时,需要指定一个名称和一个上传密码。
创建后,管理面板会生成一个GUID,这个GUID需要放在Windows应用程序中以引用该项目。
管理员面板显示以下内容:
上传后,最后统计数据会重置。
包含 tu.hpp
文件。
实例化一个 TU::TU
对象:
C++ TU(const char* prjg, const wchar_t* host, const wchar_t* path, bool SSL = false, unsigned short Port = 0, DWORD flg = 0, const wchar_t* un = 0, const wchar_t* pwd = 0, const wchar_t* uploadpwd = 0);
参数:
tu.php
管理面板创建的唯一项目GUID之后,使用 AddFiles()
成员函数添加将由库引用的文件。每个文件都有一个本地路径和一个远程ID(guid):
C++ vector> tux;
auto a = L"m.docx";
tux.emplace_back(make_tuple(forward(a), string("A44BC1B3-D919-4835-A7D8-FC633EB7B7EC")));
auto b = L"m.pdf";
tux.emplace_back(make_tuple(forward(b), string("A44BC1B3-D919-4835-A7D8-FC633EB7B7ED")));
tu.AddFiles(tux);
还有 AddSelf()
用于自动添加自己的可执行文件。
C++ HRESULT Upload(std::function
这个函数使用REST库与PHP脚本通信,并使用ZipUtils将数据压缩上传。就是这样。
通常,不会从应用程序中调用这个函数,因为它需要上传密码,不希望其他人通过嗅探连接来了解该密码。通常,会使用一个单独的“上传器”。该函数将所有项目压缩到一个ZIP文件并发送到 tu.php
。
GitHub仓库有一个示例“上传器”,它从XML配置中上传项目。该函数接受一个可选的回调,只要文件正在上传,就会反复调用。如果返回 E_FAIL
,则停止上传。
C++ HRESULT Check();
HRESULT hr = tu.Check();
如果所有检查的文件都是最新的,则返回 S_OK
;如果任何文件需要更新,则返回 S_FALSE
。
C++ HRESULT DownloadFull(std::function
自动下载所有需要下载的文件并更新它们。这个函数也适用于正在使用的文件(例如自己的应用程序),通过将当前文件移动到一个.OLD文件中,创建一个新的目标,然后标记OLD文件以删除。这样,可以轻松地用几行代码进行自更新,用户将永远不会注意到:下次应用程序启动时,更新就会在那里。
很多时候,只需要因为一个简单的错误而重新编译,但EXE已经10MB了。如果所有不同的只是文件的一小部分,那么重新下载整个文件是不是很可惜?
在这里,DIFF库就大显身手了。实际上,TU::Upload()
不仅将数据上传到服务器,还计算每个项目的签名并上传。现在可以检查:
C++ HRESULT CheckWithSigs(std::function func = nullptr, void* lp = 0);
这个函数与简单的 Check()
类似,但它还下载了需要更新的文件的签名。在此函数返回 S_FALSE
后,就知道需要更新了,然后调用:
C++ HRESULT DownloadDiff(std::function func = nullptr, void* lp = 0);
这个函数的行为与 Download()
完全相同,但它只请求服务器上的更改部分,而不是整个下载。因此,使用DIFF库将更快地更新文件。好处是它是差异性的,而不是增量的。这意味着,无论本地项目有多旧,该函数都会计算它的不同部分并从服务器请求。当然,如果本地项目不存在,该函数将重新下载整个项目。
void OneOff(const char* r, bool RunNow = false, HICON hIc = LoadIcon(0, IDI_INFORMATION), bool NoDiff = false);
允许单个EXE在一行中检查、下载和更新自己,支持图标和下载对话框。一行更新!