6
votes

Programme Delphi Auto-extraite

J'écris un programme de mise à jour dans Delphi7 qui sera exécuté une fois, mais nécessite de nombreux fichiers à exécuter.

Qu'est-ce que j'aimerais avoir la réalisation:

  1. Utilisateur exécute EXE
  2. EXE Déballez les fichiers, exécute le mises à jour
  3. Si le programme de mise à jour détecte et erreur, invite l'utilisateur à envoyer un journal e-mail
  4. Une fois que le programme de mise à jour est exécuté, les fichiers temporaires sont supprimés (certains de ces fichiers sont des DLL utilisées par le programme Updater, de sorte que le programme de mise à jour doit être fermé avant que les fichiers puissent être supprimés)

    Quelqu'un peut-il recommander une bonne solution? J'ai pensé à utiliser Inno Setup (trop compliqué pour une tâche aussi simple) ou à l'aide d'un fichier zip auto-extractible (mais comment supprimer les fichiers par la suite)?

    Merci!


0 commentaires

3 Réponses :


12
votes

Personnellement, j'utiliserais Inno Configuration, car il convient très bien pour ce type de tâche. Suppression de fichiers est très facile à l'aide d'événements de script et d'exécution de votre Supprimer dans le cadre de l'étape Post Installer.


9 commentaires

En fait, Inno Setup est conçu pour faire exactement ce que vous avez décrit dans votre question. Bien sûr, il y a d'autres façons de faire ce que vous avez demandé.


+1. Qu'est-ce qui ne veut pas aimer sur Inno? Il est écrit à Delphes, au cas où cela aide. Et il fait à peu près tout ce dont vous avez besoin. S'il y a d'autres fonctionnalités que vous ne pouvez pas accomplir sur des scripts WIHT (qui peuvent faire des lots), vous pouvez écrire une DLL ou un exe et l'appeler pour plus de choses.


1, je ne veux pas afficher de dialogues innovantes (bienvenue à installer, bla, bla) 2, si le programme affiche un message d'erreur, il y aura deux boutons de la barre des tâches, un par Inno et une par mon application - Confusion de l'utilisateur . Ceci est un non-go.


Vous pouvez utiliser les paramètres de ligne de commande / b> / supressgboxes / Suppressmsgboxes pour masquer les boîtes de dialogue Inno Configuration. Bit.ly/dr0eoj


Avoir les dialogues est utile si vous devez marcher manuellement un utilisateur en exécutant la mise à jour. L'écriture de DLL d'addition utilisant Delphi est extrêmement simple. Enfin, Inno Setup est bien testé par une très grande communauté.


Oui mais je ne peux pas dire à mon utilisateur d'exécuter le programme de mise à jour avec / Tryssiilent ou / SuppressmsgBox!


Skamradt - J'utilise Inno, je pense juste que ce n'est pas la solution parfaite pour cette tâche ...


Gardez à l'esprit que vous devrez très probablement élever votre application de correctif pour apporter des modifications à vos fichiers existants. Sous Windows 7 (avec Paramètres standard) Les extracteurs automatiques de Zip n'exécuteront pas de scripts à moins qu'ils ne soient exécutés en tant qu'administrateur.


J'ai décidé d'écrire mon propre extracteur. Voir la réponse ci-dessous. Inno est bon et je l'utilise comme un installateur pour mon programme principal, mais pas pour cette tâche!



2
votes

J'utilise la ressource pour mon programme de mise à jour. Je compile une ressource avec le programme BRCC32 que Compiler Updater. Lorsque le programme de mise à jour s'exécutez, vérifiez tout et écrire ou mettre à jour avec de nouveaux. Mais à propos de ce processus, vous devez écrire, supprimez les privilèges sur l'endroit où vos programmes sont exécutés.

J'ajoute un exemple de code à ci-dessous. p>

fichier EXE.RC P>

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;


3 commentaires

Salut! 1, j'ai besoin d'extraire des fichiers dans un répertoire temporaire et d'exécuter mon programme là-bas. Certaines DLL doivent figurer dans le même répertoire avec le programme et si le programme est exécuté sans droits d'administrateur, il ne peut pas utiliser le répertoire de base pour l'extraction de fichiers. 2, mon programme utilise une DLL pour se connecter à la base de données. Si j'essaie de supprimer la DLL après avoir été déconnecté, il est toujours utilisé par les composants de la DB. Ainsi, j'aurais besoin d'appeler un programme distinct pour supprimer les fichiers causant toutes sortes de problèmes.


je comprend. Vous avez besoin d'une altitude pour Vista et 7. Mais pour les utilisateurs de XP Standart Limited, vous devez inviter l'utilisateur à exécuter en tant qu'administrateur. Je ne connais pas XP Soliton, mais je sais que vous devez exécuter à nouveau le processus de votre code avec ShellexecuteEx. Si vous Google, vous avez trouvé de bons exemples. Mais pour l'élévation, je peux envoyer un exemple de projet.


Voici donc la solution finale et la vôtre est la plus proche: j'ai décidé d'écrire mon propre programme d'extracteur. Étapes: 1, le programme Extractor extrait des fichiers de la ressource 2, Programme Extractor lance le point de vue principal à l'aide de ShellexecuTex 3, une fois que le programme de mise à jour est terminé, le programme Extractor supprime des fichiers à partir du dossier Temp. Cela s'est avéré être la meilleure solution au lieu d'utiliser des conneries tierces. Merci!



0
votes

Peut-être pas une réponse Delphi, mais si vous achetez une licence pour winrar Vous pouvez utiliser l'intégu simple Fonctionnalité de configuration (vous compressez au fichier SFX et le script est stocké dans un fichier de commentaires)

Très facile à utiliser, peut nettoyer après elle-même et compresse gentiment!


0 commentaires