Autor Beitrag
TigerOnTour
Hält's aus hier
Beiträge: 3

Win2000 + WinXp pro + WinXP Home
D5 Prof
BeitragVerfasst: Mo 01.08.05 23:30 
Hallo,

ich bin neu hier im Forum daher erst mal einen Gruß an alle !

Und auch gleich eine Frage !

Ich muß durch ein externes Programm eine Datei konvertieren lassen und das Ergebniss dann wieder einlesen.

Das ganze klappt ( nur dank der Tipps hier aus dem Forum ) unter WinXP Pro und Win2000 auch ganz gut.

Nur bei WinXP Home habe ich keinen Erfolg, das externe Programm wird zwar aufgerufen aber keine Ausgabedatei erzeugt. Es werden als Parameter die Quell und die Zieldatei übergeben.
Das ganze funktioniert mit der Commandozeile auch unter XPHome ohne Probleme.

Ich habe schon alle Varianten von CreateProzess und ShellExecute die ich hier im Forum gefunden habe durch!

Kennt jemand das Problem mit WinXP Home, und kann mir helfen?

Gibt es da eventuell Unterschiede in der API ?

Bin für jeden Tipp dankbar !

Gruß !
Manfred
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 02.08.05 00:30 
"Hier mit begrüße ich sie zu einer neuen Runde der Quizz Show 'Rate den Code' auf www.delphi-forum.de. Wie immer leitet sie durch die Show ihr Quizzmaster Luuuuuu-uuuuuckiiiiieeeeee."

"Das Delphi-Forum hat mal wieder nicht mit Preisen gespart. Wer zu erst den exakten, nicht funktionierenden Code hier postet, bekommt eine aufblasbare Waschmaschine. Wer als erster funktionierenden Code postet, muss leider ausscheiden, da da dies wohl nicht Sinn des Postings des Kandidaten war."

"Ja wer wagt es als erster? Wer ist der mutige erste Poster? Wer hat die Glaskugel?"

"Ein paar Tipps wurden ja schon gegeben: Shellexecute und CreateProcess. Wie genau diese Funktionen implementiert wurden, wurde natürlich verschwiegen, wir wollen es ja nicht zu einfach machen! Gelle? ;)"

"Also los, haut in die Tasten, lasst eure Debugger glühen."

"Einsendeschluss ist bis der erste Moderator hier auftaucht und die Kameras im Studio hier ausknippst."
TigerOnTour Threadstarter
Hält's aus hier
Beiträge: 3

Win2000 + WinXp pro + WinXP Home
D5 Prof
BeitragVerfasst: Di 02.08.05 07:55 
Sorry !

Ich hatte gedacht ich erzeuge nur unnötig Text da ich ja schon alle, wie auch geschrieben, Varianten von CreateProzess und ShellExecute die ich hier im Forum gepostet wurden, durch habe und der Code auch im Prinzip funktioniert !
Beide Codes funktionieren unter Win2000 und WinXP Pro. nur halt nicht unter XPHome, dort erzeugt das aufgerufene Programm keine Ausgabedatei.

Also hier die Nachlieferung!

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
  E := Appdir+'axe2itn.exe';
  S := Appdir+'axe.axe';
  D := Appdir+'axe.tmp';
  Ok := false;
  FileCopy(Opendialog.FileName,S);
  //Delay(CopyDelay);
  if FindFirst(E, faAnyFile, sr) = 0 then
    begin
    //ShellExecute_AndWait('open',Appdir+'axe2itn.exe',' '+S+' '+D,AppDir,SW_HIDE,true);
     FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
     StartupInfo.cb := Sizeof(TStartupInfo);
     StartupInfo.dwFlags := STARTF_USESHOWWINDOW OR STARTF_USESTDHANDLES;
     StartupInfo.wShowWindow:=SW_HIDE;
     if CreateProcess(PChar(E),                // Anwendungsname
                      PChar(' '+S+' '+D), // Parameter
                      nil,                  // Security
                      nil,                  // Security
                      true,
                      CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or
                      NORMAL_PRIORITY_CLASS,// Priorität
                      nil,                  // Environment
                      PChar(AppDir),        // Verzeichnis
                      StartupInfo,
                      ProcessInfo)
     then
      begin
       WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
       CloseHandle(ProcessInfo.hProcess);
       Ok := true;
      end else MessageDLG('Fehler bei der Ausführung des externen Programms',mtError, [mbAbort], 0);}
    end
    else MessageDLG('Externes Programm nicht gefunden',mtError, [mbAbort], 0);


Die auskommentierte Zeile mit ShellExecute_AndWait habe ich auf SwissDelphi gefunden zeigt aber das gleiche Ergebniss, keine Funktion unter XPHome. Hier der Code der Funktion
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
function TForm1.ShellExecute_AndWait(Operation, FileName, Parameter, Directory: string;
  Show: Word; bWait: Boolean): Longint;
var
  bOK: Boolean;
  Info: TShellExecuteInfo;
{
  ****** Parameters ******
  Operation:

  edit  Launches an editor and opens the document for editing.
  explore Explores the folder specified by lpFile.
  find Initiates a search starting from the specified directory.
  open Opens the file, folder specified by the lpFile parameter.
  print Prints the document file specified by lpFile.
  properties Displays the file or folder's properties.

  FileName:

  Specifies the name of the file or object on which
  ShellExecuteEx will perform the action specified by the lpVerb parameter.

  Parameter:

  String that contains the application parameters.
  The parameters must be separated by spaces.

  Directory:

  specifies the name of the working directory.
  If this member is not specified, the current directory is used as the working directory.

  Show:

  Flags that specify how an application is to be shown when it is opened.
  It can be one of the SW_ values

  bWait:

  If true, the function waits for the process to terminate
}

begin
  FillChar(Info, SizeOf(Info), Chr(0));
  Info.cbSize := SizeOf(Info);
  Info.fMask := SEE_MASK_NOCLOSEPROCESS;
  Info.lpVerb := PChar(Operation);
  Info.lpFile := PChar(FileName);
  Info.lpParameters := PChar(Parameter);
  Info.lpDirectory := PChar(Directory);
  Info.nShow := Show;
  bOK := Boolean(ShellExecuteEx(@Info));
  if bOK then
  begin
    if bWait then
    begin
      while
        WaitForSingleObject(Info.hProcess, 100) = WAIT_TIMEOUT
        do Application.ProcessMessages;
      bOK := GetExitCodeProcess(Info.hProcess, DWORD(Result));
    end
    else
      Result := 0;
  end;
  if not bOK then Result := -1;
end;


Gruß !

Manfred

Moderiert von user profile iconAXMD: Code- durch Delphi-Tags ersetzt.
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Di 02.08.05 08:38 
Bei mir unter XP Home funktioniert CreatProcess und so tadellos. Hier mal die Prozedur mit der ich arbeite (Sie funktioniert auch unter Win95 ;) ):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
var Beenden: Boolean=false;

procedure ExecuteFile(const AFilename: String; AParameter: String; AWait: Boolean);
var
  si: TStartupInfo;
  pi: TProcessInformation;
begin
 FillChar(si, SizeOf(si), 0);
 with si do
  begin
   cb:=SizeOf(si);
   dwFlags:=STARTF_USESHOWWINDOW;
   wShowWindow:=SW_NORMAL;
  end;
 FillChar(pi, SizeOf(pi), 0);
 if CreateProcess(PChar(AFilename), PChar(AParameter), nilnil, False,
                  CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or
                  NORMAL_PRIORITY_CLASS, nilnil, si, pi) then
 try
  if AWait then
   while (not Beenden) and(WaitForSingleObject(pi.hProcess, 50)<>Wait_Object_0) do
    begin
     Application.ProcessMessages
    end
 finally
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread)
 end
end;
TigerOnTour Threadstarter
Hält's aus hier
Beiträge: 3

Win2000 + WinXp pro + WinXP Home
D5 Prof
BeitragVerfasst: Di 02.08.05 22:30 
Hallo Heiko,

Danke für den Code.

Ich habe den Code eben getestet.
Gleiches Ergebnis wie mit den andern Codes. Win2000, WinXP pro = Ok.
WinXP Home nix ist, Datei wird nicht erzeugt.
Ist aber gut anzuwenden daher auf jeden Fall schon mal was dazu gelernt.

Kann ich eventuell an den Systemeintellungen von XP Home was drehen, gibt es da eine mögliche Fehlerquelle ?

Wenn die Ausführung des Programms in der Comandozeile nicht fünktionieren würde, könnte es ja an dem aufgerufenen Programm liege, aber da geht auch unter XP Home alles wie erwartet.
Alle Tests wurden mit Admin Privs. geführt.

Bin echt ratlos. :?: :?
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Mi 03.08.05 09:25 
Ich schick der per PN mal ein Link zu einem Programm, wo du mir mal das Ergebnis sagen sollst (also ob es dort funktioniert).