TU:适用于您项目的简易更新库

我讨厌那些不会自动更新的应用程序。真的。这是一个可以自动为您完成所有工作的库。您需要一个能够运行PHP的Web服务器来存储更新,仅此而已!

特征:

完整或差异更新

静默更新

每件压缩

分离的数据库

Web服务器准备

您需要一个不错的PHP版本。我自己的服务器运行PHP7.3,但是该脚本将在旧版本中运行。它使用SQLite3创建数据库,您可以对其进行编辑以支持MySql或其他任何方式。

编辑tu.php以更改数据库名称和默认的管理员用户名+密码。

将tu.php上传到您的服务器。

转到tu.php?admin。有一个简单的管理面板,可用于管理项目。要创建项目,请指定名称和上传密码。

创建后,管理面板会生成一个GUID,该GUID将放置在Windows应用程序中以引用该项目。

PHP管理面板

管理员面板显示:

真空数据库选项

拆分数据库的选项。拆分数据库在其外部具有文件数据,因此SQLite3数据库不会增长。

如果拆分,则选择再次加入数据库。

项目列表,其中包含以下文件:

名称

ID

尺寸

直接链接

压缩/解压缩选项

直接下载次数

补丁数

支票数量

上载后将重置最后的统计信息。

Windows应用程序

包括tu.hpp

实例化TU::TU对象:

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)123复制代码类型:[cpp]

参数:

由tu.php管理面板创建的唯一项目GUID

主机名

PHP脚本的路径

SSL的true/false

可选端口(如果使用0、80或443)

InternetConnect()功能标志

服务器的可选用户名/密码

上载密码(如果您打算上载文件)

之后,使用AddFiles()member添加该库将引用的文件。每个文件都有一个本地路径和一个远程ID(guid):

vector<tuple<wstring, string>> tux;auto a = L"m.docx";
tux.emplace_back(make_tuple<wstring,
string>(forward<wstring>(a), string("A44BC1B3-D919-4835-A7D8-FC633EB7B7EC")));auto b = L"m.pdf";
tux.emplace_back(make_tuple<wstring,
string>(forward<wstring>(b), string("A44BC1B3-D919-4835-A7D8-FC633EB7B7ED")));
tu.AddFiles(tux);123456789复制代码类型:[cpp]

还AddSelf()可以自动添加您自己的可执行文件。

将更新上传到您的服务器

HRESULT Upload
  (std::function<HRESULT(size_t sent, size_t total, void*)> func = nullptr,void* lp = 0);

HRESULT hr = tu.Upload();1234复制代码类型:[cpp]

它使用我不错的REST库与PHP脚本通信,并使用ZipUtils压缩要上传的数据,仅此而已。通常,您不会从您的应用中调用此功能,因为它需要上传密码,并且您不希望其他人通过嗅探连接来学习该密码。通常,您将使用单独的“上载器”。该函数将所有项目压缩到一个ZIP文件中,并将其发送到tu.php。

github仓库有一个示例“uploader”,它从XML配置上传项目。

该函数接受一个可选的回调,只要您正在上传文件,该回调便会重复调用。E_FAIL从中返回以停止上传。

查询更新

HRESULT Check();
HRESULT hr = tu.Check();12复制代码类型:[cpp]

返回S_OK是否所有检查的文件都是最新的,或者S_FALSE是否有任何文件需要更新。

更新中

HRESULT DownloadFull(std::function<HRESULT
  (unsigned long long, unsigned long long, void*)> func = nullptr, void* lp = 0);12复制代码类型:[cpp]

自动下载所有需要下载的文件并更新它们。通过将当前文件移动到.OLD文件中,创建一个新目标,然后将OLD文件标记为要删除,此功能还可以与正在使用的文件(例如您自己的应用程序)一起使用。这样,您可以用几行代码轻松地进行自我更新,而您的用户将永远不会注意到它:下次启动应用程序时,更新将在那里。

差异检查

通常,由于一个简单的错误,您只需要重新编译即可,但是您的EXE已经是10MB。当所有不同的只是文件的一小部分时,重新下载整个文件是否可惜?

在这里,我出色的DIFF库发挥了作用。实际上,TU::Upload()不仅将您的数据上传到服务器,而且还会为每个项目计算一个签名并上传。现在您可以检查:

HRESULT CheckWithSigs(std::function<HRESULT
  (unsigned long long, unsigned long long, void*)> func = nullptr, void* lp = 0);12复制代码类型:[cpp]

此功能类似于simpleCheck(),但它也下载需要更新的文件的签名。返回此函数后S_FALSE,您就知道需要更新,请致电:

HRESULT DownloadDiff(std::function<HRESULT
  (unsigned long long, unsigned long long, void*)> func = nullptr, void* lp = 0);12复制代码类型:[cpp]

此函数的行为与完全相同Download(),但是它仅请求从服务器更改的部分,而不是整个下载。因此,使用该DIFF库将更快地更新文件。好消息是,它以差异方式而不是增量方式工作。这意味着,无论本地项目有多旧,该函数都会计算它的不同部分并向服务器请求。当然,如果本地项目不存在,该功能将完全重新下载它。

一次性

void OneOff(const char* r,bool RunNow = false,HICON hIc = LoadIcon(0,IDI_INFORMATION),bool NoDiff = false);1复制代码类型:[cpp]

允许单个EXE在具有Icon支持和下载对话框的一行中检查,下载和更新自身。一行更新!

(0)

相关推荐