2013-01-08 103 views
5

我有很多用戶在使用我的應用程序。但是,如果我做了一些更新,我把它放在服務器上,並不是所有的人都願意更新它(他們有時害怕他們不想習慣的改變)。從數據庫啓動應用程序

所以我推測,如何強制他們推出最新的應用程序。如何做到這一點肯定有幾種方法,但我聽說,可以啓動存儲在數據庫blob字段中的應用程序。

有誰知道它是如何完成的? (我使用的MySQL數據庫)

感謝名單

回答

6

沒有有意義的或無義判斷....
你可以使用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; 
+2

爲什麼要將TMemoryStream複製到單獨的字節數組中而不是將ms.Memory傳遞給ExecuteFromMem()?通過複製數據,您正在複製內存中的可執行文件,這很浪費。 –

+4

此外,'ExecuteFromMem()'通過在暫掛狀態下爲'ExistingDummy.exe'啓動一個新進程,用輸入數據覆蓋其內存,然後恢復進程。我認爲這與UAC和DEP技術,特別是UAC技術的發展並不相符,UAC只在創建流程時被調用。最安全的選擇是簡單地將TMemoryStream數據寫入臨時的.exe文件,然後正常執行。 –

+0

@RemyLebeau我同意你的觀點。我從來不需要這樣的要求。到目前爲止,我無法檢測到UAC和DEP的問題。我只是爲了興趣而嘗試(概念證明)。 – bummi

2

我的建議是使用庫。

你可以有一個小的主要可執行文件(某種「啓動器」),除了啓動外部.dll字段外,它不會做任何事情。就像內核可以在運行時加載模塊(考慮Windows或Linux的工作方式)。

然後,您下載.dll的更新版本,停止並卸載舊版本,然後加載並初始化新版本。

當然,您的代碼必須是「乾淨的」,每個.dll都有適當的啓動和關閉功能。

但我懷疑它會比ExecuteFromMem()更不容易出錯。在這方面,良好的舊加載+ .exe文件的執行(如Remy建議)聽起來像是一個更好的選擇給我。

+0

+1此解決方案更清晰,最有可能超越Windows 9 – ComputerSaysNo

相關問題