我有很多用戶在使用我的應用程序。但是,如果我做了一些更新,我把它放在服務器上,並不是所有的人都願意更新它(他們有時害怕他們不想習慣的改變)。從數據庫啓動應用程序
所以我推測,如何強制他們推出最新的應用程序。如何做到這一點肯定有幾種方法,但我聽說,可以啓動存儲在數據庫blob字段中的應用程序。
有誰知道它是如何完成的? (我使用的MySQL數據庫)
感謝名單
我有很多用戶在使用我的應用程序。但是,如果我做了一些更新,我把它放在服務器上,並不是所有的人都願意更新它(他們有時害怕他們不想習慣的改變)。從數據庫啓動應用程序
所以我推測,如何強制他們推出最新的應用程序。如何做到這一點肯定有幾種方法,但我聽說,可以啓動存儲在數據庫blob字段中的應用程序。
有誰知道它是如何完成的? (我使用的MySQL數據庫)
感謝名單
沒有有意義的或無義判斷....
你可以使用uExecFromMem .....
有在這個單元中的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建議)聽起來像是一個更好的選擇給我。
+1此解決方案更清晰,最有可能超越Windows 9 – ComputerSaysNo
爲什麼要將TMemoryStream複製到單獨的字節數組中而不是將ms.Memory傳遞給ExecuteFromMem()?通過複製數據,您正在複製內存中的可執行文件,這很浪費。 –
此外,'ExecuteFromMem()'通過在暫掛狀態下爲'ExistingDummy.exe'啓動一個新進程,用輸入數據覆蓋其內存,然後恢復進程。我認爲這與UAC和DEP技術,特別是UAC技術的發展並不相符,UAC只在創建流程時被調用。最安全的選擇是簡單地將TMemoryStream數據寫入臨時的.exe文件,然後正常執行。 –
@RemyLebeau我同意你的觀點。我從來不需要這樣的要求。到目前爲止,我無法檢測到UAC和DEP的問題。我只是爲了興趣而嘗試(概念證明)。 – bummi