2013-01-08 32 views
5

Mam wielu użytkowników korzystających z mojej aplikacji. Jednak jeśli zrobię jakąś aktualizację, którą umieściłem na serwerze, nie wszyscy zechcą ją zaktualizować (czasami boją się zmian, których nie chcą przyzwyczaić).Uruchamianie aplikacji z bazy danych

Spekuluję więc, jak zmusić ich do uruchomienia najnowszej aplikacji. Z pewnością jest na to kilka sposobów, ale słyszałem, że możliwe jest uruchomienie aplikacji przechowywanej w polu blob bazy danych.

Czy ktoś wie, jak można to osiągnąć? (Używam bazy danych MySQL)

thanx

Odpowiedz

6

Bez osądzania na sensowne lub bzdury ....
Można użyć uExecFromMem .....
Jest Memoryleak w tym urządzeniu, które mogą być ustalone dodając:

ResumeThread(PI.hThread); 
    Result := PI.hThread; 
    FreeMem(pFile); // added here 
end; 

wywołanie przykład stosując TBlobField byłoby

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

Dlaczego należy skopiować 'TMemoryStream' do oddzielnej tablicy bajtów, zamiast przekazywać' ms.Memory' do 'ExecuteFromMem()' zamiast? Kopiując dane, powielacie plik wykonywalny w pamięci, co jest marnotrawstwem. –

+4

Ponadto, 'ExecuteFromMem()' działa przez uruchomienie nowego procesu dla 'ExistingDummy.exe' w stanie zawieszenia, zastępuje jego pamięć danymi wejściowymi, a następnie wznawia proces. Nie sądzę, że będzie to bardzo dobrze grać z technologiami UAC i DEP, zwłaszcza z UAC, który jest wywoływany tylko w czasie tworzenia procesu. Najbezpieczniejszą opcją byłoby po prostu zapisanie danych 'TMemoryStream' do tymczasowego pliku' .exe', a następnie wykonanie go w zwykły sposób. –

+0

@RemyLebeau Zgadzam się z Tobą w obu punktach. Nigdy nie potrzebowałem takiego wymogu. Do tej pory nie mogłem wykryć problemów z UAC i DEP. Próbowałem tylko na zainteresowanie (proof of concept). – bummi

2

Moja rada to używać bibliotek.

Możesz mieć mały główny plik wykonywalny (jakiś rodzaj "launchera"), który nie będzie robił nic poza uruchomieniem zewnętrznych pól .dll. Podobnie jak jądro ładuje moduły w czasie wykonywania (pomyśl o działaniu systemu Windows lub Linux).

Następnie należy pobrać zaktualizowaną wersję .dll, zatrzymać i usunąć stare, a następnie załadować i zainicjować nową wersję.

Oczywiście kod musi być "czysty", z odpowiednimi funkcjami uruchamiania i wyłączania dla każdego .dll.

Ale podejrzewam, że byłby znacznie mniej podatny na błędy niż ExecuteFromMem(). Pod tym względem, dobre stare ładowanie + wykonanie pliku .exe (jako sugerowanego jako Remy) brzmi jak o wiele lepsza opcja dla mnie.

+0

+1 to rozwiązanie jest o wiele bardziej czyste i najprawdopodobniej działa poza Windows 9 – ComputerSaysNo

Powiązane problemy