Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi programmstart überwachen (https://www.delphipraxis.net/106836-programmstart-ueberwachen.html)

PhilmacFlLy 17. Jan 2008 15:01


programmstart überwachen
 
Nunja ich hab ein Programm programmiert (glaub man kaum :D) das installer in verschiedenen Sprachen startet.
Jetzt möchte ich aber überprüfen ob die Datei wirklich gestaret wurde bzw. ob sie beschädigt is wie kann ich das machen?

achja ich starte das ganze so
Delphi-Quellcode:
ShellExecute(Handle, 'open', PChar(pfads), nil, nil, SW_NORMAL);
vorher wird der Pfad aus einer Ini Datei ausgelesen

Matze 17. Jan 2008 15:12

Re: programmstart überwachen
 
Hallo, herzlich Willkommen!

Einen erfolgreichen Start kannst du so überprüfen:

Delphi-Quellcode:
if ShellExecute(...) > 32 then
  // erfolgreich
else
  // nicht erfolgreich
Die genauen Rückgabewerte findest du beispielsweise hier oder im MSDN: MSDN-Library durchsuchenShellExecute.

Grüße

DP-Maintenance 17. Jan 2008 15:13

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Sonstige Fragen zu Delphi" nach "Windows API / MS.NET Framework API" verschoben.

PhilmacFlLy 17. Jan 2008 15:17

Re: programmstart überwachen
 
ok danke

PhilmacFlLy 17. Jan 2008 15:59

Re: programmstart überwachen
 
noch eine frage muss ich das so schreiben
Delphi-Quellcode:
    begin ShellExecute(Handle, 'open', PChar(pfade), nil, nil, SW_NORMAL);
          if
            ShellExecute(Handle, 'open', PChar(pfads), nil, nil, SW_NORMAL) < 33
          then
            Application.MessageBox('File is not avaliable or destoryed', 'Error', MB_OK)
          else
            application.Terminate
        end
oder so

Delphi-Quellcode:
if
            ShellExecute(Handle, 'open', PChar(pfads), nil, nil, SW_NORMAL) < 33
          then
            Application.MessageBox('File is not avaliable or destoryed', 'Error', MB_OK)
          else
            application.Terminate
        end

DeddyH 17. Jan 2008 16:01

Re: programmstart überwachen
 
Nimm die 2. Variante, sonst wird das Programm ja 2 mal gestartet :mrgreen:

PhilmacFlLy 17. Jan 2008 17:13

Re: programmstart überwachen
 
Das problem is nur er startet die datei dann nicht soner bringt nur ne fehler meldung

DeddyH 17. Jan 2008 17:52

Re: programmstart überwachen
 
Versuch es mal so:
Delphi-Quellcode:
procedure TForm1.btnStartClick(Sender: TObject);
var iSuccess: Integer;
begin
  iSuccess := ShellExecute(Handle,'open',PChar('C:\windows\dideldum.exe'),nil,nil,SW_SHOWDEFAULT);
  if iSuccess < 33 then
    MessageBox(Handle,PChar(SysErrorMessage(iSuccess)),'Fehler',MB_OK or MB_ICONERROR);
end;

PhilmacFlLy 17. Jan 2008 18:05

Re: programmstart überwachen
 
Mir is grad auf gefallen es geht trotzdem so
Delphi-Quellcode:
          begin ShellExecute(Handle, 'open', PChar(pfadg), nil, nil, SW_NORMAL);
            if
              ShellExecute(Handle, 'open', PChar(pfads), nil, nil, SW_NORMAL) > 32
            then
              Application.MessageBox('Datei ist nicht vorhanden oder beschädigt', 'Fehler', MB_OK)
            else
              Application.Terminate
            end
ich hatte nur Apllication.Terminate und Mesage Box verdreht

sry :wall:

PhilmacFlLy 17. Jan 2008 18:09

Re: programmstart überwachen
 
ich weiss nicht was heute los is es geht trotzdem nicht jetzt probier ichs mal nach deddy
edit: geht auch nicht ermacht einfach weiter
edit2: Da hat was mit der zahl nicht gestimmt ich hab jetzt iSuccess < 34 und jetzt gehts

DeddyH 17. Jan 2008 18:28

Re: programmstart überwachen
 
Das wundert mich ein wenig.
Zitat:

Zitat von Win32-SDK
If the function fails, the return value is an error value that is less than or equal to 32.

Das heißt für mich, alles ab einschließlich 33 ist ein Erfolg :gruebel:

PhilmacFlLy 17. Jan 2008 18:37

Re: programmstart überwachen
 
ka aber jetzt gehts

himitsu 17. Jan 2008 19:32

Re: programmstart überwachen
 
Zitat:

Zitat von DeddyH
Das heißt für mich, alles ab einschließlich 33 ist ein Erfolg :gruebel:

genau, bis 32 sind es alles verschiedene Fehlercodes und darüber isses ein erfolgreicher Info-Statuscode

DeddyH 17. Jan 2008 19:34

Re: programmstart überwachen
 
So hab ich das auch verstanden. Wieso musste er also die Abfrage ändern? 33 hieße doch: Programm gestartet, alles OK. Vielleicht zeigt uns der TE mal seinen aktuellen Code, da ist bestimmt ein Fehler im Detail ;)

himitsu 17. Jan 2008 19:40

Re: programmstart überwachen
 
Zitat:

Zitat von DeddyH
Wieso musste er also die Abfrage ändern? 33 hieße doch: Programm gestartet, alles OK. Vielleicht zeigt uns der TE mal seinen aktuellen Code, da ist bestimmt ein Fehler im Detail ;)

so stimmst's
Delphi-Quellcode:
if ShellExecute(33) > 32 then {ok}
aber ich vermute jetzt einfach mal sowas wie ;)
Delphi-Quellcode:
if ShellExecute(33) < 34 then {ok}
oder ähnlich, was zwar bei Erfolg geht, aber im Fehlerfall auch einen Erfolg meldet

DeddyH 17. Jan 2008 19:43

Re: programmstart überwachen
 
In #8 hatte ich doch einen Ansatz gepostet, evtl. hat er da etwas "verschlimmbessert" :D

P.S.: Was ist plötzlich mit diesem Thread los, der ist zumindest bei mir plötzlich auf die Schmalspur geraten. :cyclops:

PhilmacFlLy 18. Jan 2008 07:33

Re: programmstart überwachen
 
Zwar glaub ich nicht das ihr den wikrlich sehen wollt weil das iste ine ieziges Cahos aber bitte
Delphi-Quellcode:
unit Starter;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ImgList, ExtCtrls, ComCtrls, StdCtrls, ShellAPI, jpeg, IniFiles;

type
  THaupt = class(TForm)
    Image1: TImage;
    rbgerman: TRadioButton;
    Image3: TImage;
    rbenglish: TRadioButton;
    Image4: TImage;
    rbspanish: TRadioButton;
    Image5: TImage;
    rbjapanese: TRadioButton;
    Image6: TImage;
    rbrussian: TRadioButton;
    bttclose: TButton;
    bttcontinue: TButton;
    Image2: TImage;
    procedure Image2DblClick(Sender: TObject);
    procedure rbrussianClick(Sender: TObject);
    procedure rbjapaneseClick(Sender: TObject);
    procedure rbspanishClick(Sender: TObject);
    procedure rbenglishClick(Sender: TObject);
    procedure rbgermanClick(Sender: TObject);
    procedure bttcloseClick(Sender: TObject);
    procedure bttcontinueClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Haupt: THaupt;
  pfads, pfadj, pfadg, pfade, pfadr: String;

implementation

uses PassWord;

{$R *.dfm}

procedure THaupt.bttcloseClick(Sender: TObject);
begin
application.Terminate;
end;

procedure THaupt.bttcontinueClick(Sender: TObject);
var ini: TIniFile;
    iSuccess: Integer;
begin
  ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+ 'Einstellungen.ini');
  pfads := ExtractFilePath(ParamStr(0)) + ini.ReadString('Pfad','Spanisch','Nichts eingetragen');
  pfade := ExtractFilePath(ParamStr(0)) + ini.ReadString('Pfad','Englisch','Nichts eingetragen');
  pfadr := ExtractFilePath(ParamStr(0)) + ini.ReadString('Pfad','Russisch','Nichts eingetragen');
  pfadg := ExtractFilePath(ParamStr(0)) + ini.ReadString('Pfad','Deutsch','Nichts eingetragen');
  pfadj := ExtractFilePath(ParamStr(0)) + ini.ReadString('Pfad','Japanisch','Nichts eingetragen');
  ini.free;
    if rbspanish.Checked = true
    then
      begin iSuccess := ShellExecute(Handle, 'open', PChar(pfads), nil, nil, SW_NORMAL);
        if
          iSuccess < 34
        then
          MessageBox(Handle,PChar(SysErrorMessage(iSuccess)),'Fehler',MB_OK or MB_ICONERROR)
        else
          application.Terminate
      end
    else
      if rbenglish.Checked = true
      then
        begin iSuccess := ShellExecute(Handle, 'open', PChar(pfade), nil, nil, SW_NORMAL);
          if
            iSuccess < 34
          then
            MessageBox(Handle,PChar(SysErrorMessage(iSuccess)),'Fehler',MB_OK or MB_ICONERROR)
          else
            application.Terminate
        end
      else
        if rbgerman.Checked = true
        then
          begin iSuccess := ShellExecute(Handle, 'open', PChar(pfadg), nil, nil, SW_NORMAL);
            if
              iSuccess < 34
            then
              MessageBox(Handle,PChar(SysErrorMessage(iSuccess)),'Fehler',MB_OK or MB_ICONERROR)
            else
              Application.Terminate
            end
        else
          if rbjapanese.Checked = true
          then
            begin iSuccess := ShellExecute(Handle, 'open', PChar(pfadj), nil, nil, SW_NORMAL);
              if
                iSuccess < 34
              then
                MessageBox(Handle,PChar(SysErrorMessage(iSuccess)),'Fehler',MB_OK or MB_ICONERROR)
              else
                application.Terminate
              end
          else
              if rbrussian.Checked = true
              then
                begin iSuccess := ShellExecute(Handle, 'open', PChar(pfadr), nil, nil, SW_NORMAL);
                  if
                   iSuccess < 34
                  then
                    MessageBox(Handle,PChar(SysErrorMessage(iSuccess)),'Fehler',MB_OK or MB_ICONERROR)
                  else
                    application.Terminate
                end

end;

procedure THaupt.rbgermanClick(Sender: TObject);
begin
 bttcontinue.Enabled := true;
 bttcontinue.Caption := 'Weiter';
 bttclose.Caption := 'Schließen';
end;

procedure THaupt.rbenglishClick(Sender: TObject);
begin
  bttcontinue.Enabled := true;
  bttcontinue.Caption := 'Continue';
  bttclose.Caption := 'Close';
end;

procedure THaupt.rbspanishClick(Sender: TObject);
begin
  bttcontinue.Enabled := true;
  bttcontinue.Caption := 'Ulterior';
  bttclose.Caption := 'Concluir';
end;

procedure THaupt.rbjapaneseClick(Sender: TObject);
begin
 bttcontinue.Enabled := true;
end;

procedure THaupt.rbrussianClick(Sender: TObject);
begin
 bttcontinue.Enabled := true;
end;


procedure THaupt.Image2DblClick(Sender: TObject);
begin
 PasswordDlg.showmodal;
end;

end.
Und sag jetzt bloß nix wegen den If then else schleifen mir is das mit case einfach nicht mehr eingefallen wie das zu machen ist. Achja und es funktioniert auch im Fehlerfall (d.h. Er bringt ne Fehlermeldung)

DeddyH 18. Jan 2008 08:10

Re: programmstart überwachen
 
Das sieht soweit OK aus, da verwundert es mich schon, dass die 33 nicht funktioniert.

[edit] Wäre hier eine RadioGroup nicht angebrachter als ein Haufen CheckBoxen? Außerdem fände ich es so übersichtlicher:
Delphi-Quellcode:
var ini: TIniFile;
    iSuccess: Integer;
    sPfad: string;
begin
  sPfad := '';
  ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+ 'Einstellungen.ini');
  if rbspanish.Checked then
    sPfad := ini.ReadString('Pfad','Spanisch','Nichts eingetragen')
  else if rbenglish.Checked then
    sPfad := ini.ReadString('Pfad','Englisch','Nichts eingetragen')
  else if rbgerman.Checked then
    sPfad := ini.ReadString('Pfad','Deutsch','Nichts eingetragen')
  else if rbjapanese.Checked then
    sPfad := ini.ReadString('Pfad','Japanisch','Nichts eingetragen')
  else if rbrussian.Checked then
    sPfad := ini.ReadString('Pfad','Russisch','Nichts eingetragen');
  ini.free;
  if sPfad <> '' then
    begin
      iSuccess := ShellExecute(Handle, 'open', PChar(sPfad), nil, nil, SW_NORMAL);
      if iSuccess < 33 then
        MessageBox(Handle,PChar(SysErrorMessage(iSuccess)),'Fehler',MB_OK or MB_ICONERROR)
      else
        application.Terminate
    end;
end;
[/edit]

[edit2] Was soll eigentlich passieren, wenn Du "Nichts eingetragen" erhältst? [/edit2]

PhilmacFlLy 18. Jan 2008 13:21

Re: programmstart überwachen
 
[edit2] Was soll eigentlich passieren, wenn Du "Nichts eingetragen" erhältst? [/edit2][/quote]

?? was meinst du damit ?

DeddyH 18. Jan 2008 13:27

Re: programmstart überwachen
 
Angenommen, die CheckBox rbSpanish ist aktiv, in der Ini gibt es aber keinen Eintrag dazu. Dann gibt das ReadString "Nichts eingetragen" zurück ;)

PhilmacFlLy 18. Jan 2008 13:41

Re: programmstart überwachen
 
Das passiert nicht weil die Einstellungs.ini mitgleifert wird.

DeddyH 18. Jan 2008 13:43

Re: programmstart überwachen
 
Eine Ini lässt sich auch im Editor bearbeiten.

PhilmacFlLy 18. Jan 2008 14:10

Re: programmstart überwachen
 
ich weiss aber das programm kommt auf ne CD

DeddyH 18. Jan 2008 14:13

Re: programmstart überwachen
 
Na gut, es ist Dein Programm, sag aber später nicht, ich hätte Dich nicht darauf hingewiesen ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz