Programm verlinken

Programm verlinken

Beitragvon Aphadias » 11. Jul 2017, 16:21 Programm verlinken

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:
Aphadias
 
Beiträge: 107
Registriert: 28. Okt 2015, 18:28

Beitragvon Warf » 11. Jul 2017, 18:33 Re: Programm verlinken

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
Warf
 
Beiträge: 671
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Mathias » 11. Jul 2017, 19:55 Re: Programm verlinken

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 12. Jul 2017, 17:50, insgesamt 2-mal geändert.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3386
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Aphadias » 12. Jul 2017, 07:45 Re: Programm verlinken

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?
Aphadias
 
Beiträge: 107
Registriert: 28. Okt 2015, 18:28

Beitragvon wp_xyz » 12. Jul 2017, 08:15 Re: Programm verlinken

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.
wp_xyz
 
Beiträge: 2363
Registriert: 8. Apr 2011, 08:01

Beitragvon marcov » 12. Jul 2017, 10:05 Re: Programm verlinken

Nutze https://www.freepascal.org/docs-html/fc ... indir.html um ein Programm in einer bestimmte Ordner zu starten
marcov
 
Beiträge: 1005
Registriert: 5. Aug 2008, 08:37
Wohnort: Eindhoven (Niederlande)
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk) | 
CPU-Target: 32/64,PPC(+64), ARM
Nach oben

Beitragvon Aphadias » 12. Jul 2017, 14:42 Re: Programm verlinken

@wp_xyz

stimmt das ist mir sogar einleuchtend.

@marcov

schaue ich mir nachher mal an... aber was bringt mir das für vorteile?
Aphadias
 
Beiträge: 107
Registriert: 28. Okt 2015, 18:28

Beitragvon wp_xyz » 12. Jul 2017, 15:35 Re: Programm verlinken

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

Siehe: http://wiki.freepascal.org/Executing_External_Programs
wp_xyz
 
Beiträge: 2363
Registriert: 8. Apr 2011, 08:01

Beitragvon Warf » 12. Jul 2017, 16:18 Re: Programm verlinken

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;
Warf
 
Beiträge: 671
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Mathias » 12. Jul 2017, 16:42 Re: Programm verlinken

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3386
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 12. Jul 2017, 17:37 Re: Programm verlinken

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.
Warf
 
Beiträge: 671
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Mathias » 12. Jul 2017, 17:52 Re: Programm verlinken

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3386
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Aphadias » 13. Jul 2017, 15:47 Re: Programm verlinken

@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
Aphadias
 
Beiträge: 107
Registriert: 28. Okt 2015, 18:28

Beitragvon Warf » 13. Jul 2017, 17:34 Re: Programm verlinken

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
Warf
 
Beiträge: 671
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Aphadias » 14. Jul 2017, 13:52 Re: Programm verlinken

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?
Aphadias
 
Beiträge: 107
Registriert: 28. Okt 2015, 18:28

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Windows



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried