Programm verlinken

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Programm verlinken

Beitrag von Aphadias »

Moin...
ich habe da mal so ein Problem und verstehe nicht genau warum. Ich möchte mein Programm mit einer Fremden exe verlinken. Das externe Programm soll mit einem Button aus meinem Programm gestartet werden.

Code: Alles auswählen

ShellExecute(Handle, 'open', PChar('C:\ICD10\ICD10Win.exe'), nil, nil, SW_SHOWNORMAL)


Das Programm alleine funktioniert. Aber sobald ich es mit dem Button starte ploppt ein Fenster auf und sagt mir:"Schwerer Datenbank fehler! Installieren sie das Programm neu."

Aber warum? :shock:

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Programm verlinken

Beitrag von Warf »

Ich rate einfach mal ins Blaue, das Programm wird in der Falschen Umgebung (Working directory) geöffnet, versuche es einfach mit TProcess, ist eh besser

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Programm verlinken

Beitrag von Mathias »

Dies könnte weiter helfen:

Code: Alles auswählen

chdir('C:\ICD10\');
SysUtils.ExecuteProcess(UTF8ToSys('ICD10Win.exe'), '', []);


ExecuteProcess wäre auch noch eine Alternative, ansonsten bist du Windows gebunden.
Auch das gebastel mit PChar kann man sich da sparen,

http://wiki.freepascal.org/Executing_Ex ... uteProcess
Zuletzt geändert von Mathias am Mi 12. Jul 2017, 18:50, insgesamt 2-mal geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Programm verlinken

Beitrag von Aphadias »

Danke Ihr beiden erst mal.. habe mich erst mal für die 2. variante entschieden und die funktioniert... aber die andere könnte später noch interessantert werden für mich

aber Mathias wieso funktioniert das jetzt nur weil man den Pfad vorher schon angibt?

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Programm verlinken

Beitrag von wp_xyz »

Aphadias hat geschrieben:wieso funktioniert das jetzt nur weil man den Pfad vorher schon angibt?

Ich kenne ICD10Win nicht, aber ich könnte mir vorstellen, dass es auf Dateien zugreifen will, die im eigenen Verzeichnis erwartet werden. Diese werden nicht gefunden, wenn du das Programm aus deinem Projekt-Verzeichnis heraus startest. Das zweite nil in deinem Aufruf zeigt auf das Arbeitsverzeichnis des Prozesses: wenn du hier C:\ICD10 einträgst, müsste auch dein ursprünglicher Aufruf funktionieren, also ohne ChDir - es könnte ja sein, dass dein Programm selbst in seinem eigenen Arbeitsverzeichnisses bleiben muss.

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Programm verlinken

Beitrag von marcov »

Nutze https://www.freepascal.org/docs-html/fc ... indir.html um ein Programm in einer bestimmte Ordner zu starten

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Programm verlinken

Beitrag von Aphadias »

@wp_xyz

stimmt das ist mir sogar einleuchtend.

@marcov

schaue ich mir nachher mal an... aber was bringt mir das für vorteile?

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Programm verlinken

Beitrag von wp_xyz »

RunCommand ist plattformunabhängig, ShellExecute nur für Windows.

Siehe: http://wiki.freepascal.org/Executing_External_Programs

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Programm verlinken

Beitrag von Warf »

Die Lösung von Mathias würde ich nicht nehmen, denn das chDir kann dir einiges zerschießen, falls du selbst relative Pfade verwendest, außerdem ist es Windows only, und ShellExecute ist sehr hässlich, und man vergisst schnell wie der Aufruf nochmal funktioniert, alles in allem sehr unübersichtlich.

Die Lösung von marcov führt einen TProcess intern aus, ohne das du selbst mit dem TProcess in Berührung kommst. Allerdings ist diese Funktion eigentlich gedacht um einen Rückgabewert aus dem STDOut des zu Startenden Programmes zu lesen (was mit TProcess einen ganz schönen overhead verursacht), und wird daher blockieren bis die Ausführung des zu startenden Programmes beendet wurde. Daher wenn du nicht willst das dein Programm solange hängen bleibt, ist das wohl nicht die richtige Lösung. Außerdem ist das Arbeiten mit TProcess für das simple ausführen, ohne STDOut lesen, nicht viel komplizierter (siehe unten)

Falls du willst das dein Programm das andere Programm nur startet, und dann weiterarbeitet, dann solltest du auf TProcess oder TAsyncProcess (gethreaded, kümmert sich darum das die Aktionen durch events threadsafe sind) verwenden.

Wenn du jetzt einfach ein Programm starten willst, ohne im weiteren Verlauf darauf zuzugreifen (STD In/Out verwenden, status überprüfen, priorität verändern, oder vorzeitig beenden) würde schon so etwas reichen (führt explorer.exe im Verzeichnis C:\ aus):

Code: Alles auswählen

  with TProcess.Create(nil) do
  try
    Executable:='explorer.exe';
    CurrentDirectory:='C:\ '; // leer eingefügt da sonst das forum Code-Highlight probleme macht
    Execute;
  finally
    Free;
  end;

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Programm verlinken

Beitrag von Mathias »

Die Lösung von Mathias würde ich nicht nehmen, denn das chDir kann dir einiges zerschießen, falls du selbst relative Pfade verwendest, außerdem ist es Windows only,

Seit wann ist chdir nur für Windows ?

Der ursprüngliche Pfad kann man sichern.

Code: Alles auswählen

  pfadalt := GetCurrentDir;
  chdir('neuer_Pfad');
 
// Mache irgendwas.
 
  chdir(pfadalt);
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Programm verlinken

Beitrag von Warf »

Mathias hat geschrieben:
Die Lösung von Mathias würde ich nicht nehmen, denn das chDir kann dir einiges zerschießen, falls du selbst relative Pfade verwendest, außerdem ist es Windows only,

Seit wann ist chdir nur für Windows ?

Der ursprüngliche Pfad kann man sichern.

Code: Alles auswählen

  pfadalt := GetCurrentDir;
  chdir('neuer_Pfad');
 
// Mache irgendwas.
 
  chdir(pfadalt);


Nicht chDir, sondern ShellExecute ist Windows only.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Programm verlinken

Beitrag von Mathias »

Nicht chDir, sondern ShellExecute ist Windows only.


Ich habe das falsche kopiert. :oops:

Ich meinte ExecuteProcess wie im Link.
Bei ShellExecute hast du recht, dies ist Müll.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Programm verlinken

Beitrag von Aphadias »

@Warf ich wollte gerade ebend das mit Tprocess probieren... bei mir kommt eine fehlermeldung das er es nicht kennt

EDIT: habe vergessen oben Process mit einzufügen

EDIT: habe es mal mit dem TProcess probiert... er meckert dann rum das es ein Fehler beim Execute gibt... also das er es nicht ausführen kann

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Programm verlinken

Beitrag von Warf »

Du musst bei Executable den vollen Pfad angeben, explorer.exe funktioniert ohne Pfad, da es sich im Suchpfad von Windows befindet, das hätte ich dazu schreiben sollen

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Programm verlinken

Beitrag von Aphadias »

ich hatte es jetzt so verstanden (vllt weil ich es auch im englischen noch mal nachgelesen habe und mein englisch nicht so gut ist) das

Code: Alles auswählen

CurrentDirectory:='C:\ ';
dort der Pfad eingegeben wird und das andere nur die exe... gehe ich jetzt dort nur das laufwerk ein oder bei beiden den pfad bis zur exe?

Antworten