Delphi 从数据库启动应用程序
我有很多用户在使用我的应用程序。但是,如果我在服务器上进行一些更新,并不是所有人都愿意更新(他们有时害怕自己不想习惯的更改) 因此我推测,如何迫使他们推出最新的应用程序。当然有几种方法可以做到这一点,但我听说,可以启动存储在数据库blob字段中的应用程序 有人知道怎样才能做到吗?(我正在使用MySQL数据库)Delphi 从数据库启动应用程序,delphi,Delphi,我有很多用户在使用我的应用程序。但是,如果我在服务器上进行一些更新,并不是所有人都愿意更新(他们有时害怕自己不想习惯的更改) 因此我推测,如何迫使他们推出最新的应用程序。当然有几种方法可以做到这一点,但我听说,可以启动存储在数据库blob字段中的应用程序 有人知道怎样才能做到吗?(我正在使用MySQL数据库) thanx没有对有意义或无意义进行判断…. 您可以使用…… 此单元中有一个Memoryleak,可通过添加以下内容来修复: ResumeThread(PI.hThread); Re
thanx没有对有意义或无意义进行判断….
您可以使用……
此单元中有一个Memoryleak,可通过添加以下内容来修复:
ResumeThread(PI.hThread);
Result := PI.hThread;
FreeMem(pFile); // added here
end;
使用TBlobField的调用示例如下
var
ms:TMemoryStream;
begin
ms:=TMemoryStream.Create;
try
TBlobField(YouDBBlobField).SaveToStream(ms);
ms.Position := 0;
ExecuteFromMem(Application.ExeName,'',ms.Memory); // pointing to an existing executable
finally
ms.Free;
end;
end;
我的建议是使用图书馆 您可以有一个小的主可执行文件(某种类型的“启动器”),它除了启动外部
.dll
字段之外什么也不做。就像内核在运行时加载模块一样(想想Windows或Linux是如何工作的)
然后下载.dll的更新版本,停止并卸载旧版本,然后加载并初始化新版本
当然,您的代码必须是“干净的”,每个.dll都有正确的启动和关闭功能
但我怀疑它比ExecuteFromMem()
更不容易出错。在这方面,对我来说,加载并执行.exe
文件(正如Remy建议的那样)是一个更好的选择。为什么要将TMemoryStream
复制到一个单独的字节数组中,而不是将ms.Memory
传递到ExecuteFromMem()
?通过复制数据,您正在复制内存中的可执行文件,这是一种浪费。此外,ExecuteFromMem()
的工作原理是,在挂起状态下为ExistingDummy.exe
启动一个新进程,用输入数据覆盖其内存,然后恢复该进程。我认为UAC和DEP技术不能很好地发挥这一作用,尤其是UAC,它只在流程创建时调用。最安全的选择是简单地将TMemoryStream
数据写入一个临时.exe
文件,然后正常执行。@RemyLebeau我在这两点上都同意你的观点。我从来不需要这样的要求。到目前为止,我无法检测到UAC和DEP的问题。我只是为了兴趣(概念证明)而尝试。@bummi如何在XE4中使用该单元。。它也是64位兼容的吗?@user2665920我不希望它能与64位兼容。正如上面的评论所提到的,我只是出于兴趣而尝试,也许是雷米的命令。。。将TMemoryStream数据写入一个临时的.exe文件,然后正常执行它。
将更有用。+1此解决方案更干净,最有可能在windows 9之外工作