Estoy usando recursos para mi programa de actualización. Era un recurso de compilación con brcc32 que compilar el programa de actualización. Cuando el programa de actualización ejecuta su autocomprobación, compruebe todo y escriba o actualice con los nuevos. pero sobre este proceso tienes que escribir correctamente, eliminar privilegios en donde se ejecutan tus programas.
Estoy agregando un código de muestra a continuación.
archivo exe.rc
newprog RCDATA Application.exe
archivo makeres.bat
brcc32 exe.rc
archivo updater.dpr
{$R exe.res}
archivo de unidad y procedimientos
procedure ExtractRes(resname,fname,ext:string);
var
rStream:TResourceStream;
fStream:TFileStream;
fNamex:string;
begin
fNamex:=ExtractFilePath(Application.ExeName)+fname+'.'+ext;
if not fileExists(fnamex) then
begin
try
rStream:=tresourcestream.Create(hinstance,ResName,RT_rcDATA);
fStream := TFileStream.Create(fnamex, fmCreate);
fStream.CopyFrom(rStream, 0);
finally
rStream.Free;
fstream.Free;
end;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
apath:string;
begin
if Timer1.Enabled then
Timer1.Enabled:=false;
apath:=ExtractFilePath(Application.ExeName);
lblMesg.Caption:='Backup old version';
Application.ProcessMessages;
if FileExists(apath+'Application_old.bak') then
DeleteFile(apath+'Application_old.bak') ;
while FileExists(apath+'Application.exe') do
begin
RenameFile(apath + 'Application.exe', apath + 'Application_old.bak');
sleep(1);
if FileExists(apath+'Application.exe') then
begin
lblMesg.Caption:='It seems application still running. Waiting for end';
if FileExists(apath+'Application_old.bak') then
DeleteFile(apath+'Application_old.bak');
DeleteFile(apath+'Application.exe');
end;
Application.ProcessMessages;
end;
lblMesg.Caption:='Creating New Version..';
Application.ProcessMessages;
ExtractRes('Application','Application','exe');
lblMesg.Caption:='Running New Version...';
Application.ProcessMessages;
WinExec(pchar(apath+'Application.exe'),sw_show);
Application.ProcessMessages;
Halt;
end;
Creo que esto puede ayudar a su pregunta 1,2,3. Para 4 puedes extender el código.
¡Hola! 1, necesito extraer archivos a un directorio temporal y ejecutar mi programa allí. Algunos dlls deben estar en el mismo directorio que el programa y si el programa se ejecuta sin derechos de administrador, no puede usar el directorio base para la extracción de archivos. 2, Mi programa utiliza un dll para conectarse a la base de datos. Si trato de eliminar el dll después de desconectarlo, los componentes de DB todavía lo usan. Por lo tanto, tendría que llamar a un programa por separado solo para eliminar los archivos que causan todo tipo de problemas – Steve
entiendo. necesita elevación para vista y 7. pero para los usuarios limitados de xp standart debe indicarle al usuario que se ejecute como administrador. No sé xp solución, pero sé que tiene que ejecutar el proceso desde dentro de su código de nuevo con shellexecuteex. si lo busca en google, encontró buenos ejemplos. pero para elevación puedo enviar un proyecto de muestra. –
Así que aquí está la solución final y la suya es la más cercana: he decidido escribir mi propio programa extractor. Pasos: 1, el programa Extractor extrae archivos del recurso 2, el programa Extractor inicia el actualizador principal utilizando ShellExecuteEx 3, una vez que el programa de actualización finaliza, el programa extractor elimina los archivos de la carpeta temporal. Esta resultó ser la mejor solución en lugar de usar mierda de terceros. ¡Gracias! – Steve