Hallo,
wie ist es möglich, mit einer EAGLE-ULP eine Windows Programm zu
starten?
Dass es möglich ist, weiß ich, z.B. wird per ULP LTSpice gestartet.
Aber leider verstehe ich die ULP nicht richtig, da sie sehr komplex
aufgebaut ist (automatisch Verzeichnisse durchsuchen, etc.).
Mir ist das Programm und der Pfad bekannt.
Die EAGLE-Hilfe und Onkel Gugel konnten mir nicht helfen.
Die ULP-Funktion heißt system(). Meine EAGLE-Hilfe (7.7) hat eine recht
ausführliche Beschreibung unter
1
User Language -> Builtins -> Builtin Functions -> Miscellaneous Functions -> system()
Suchmaschinen liefern mit "man system" die Beschreibung der
Unix-Funktion. Die Unterschiede zu Windows sind minimal und werden in
der EAGLE-Hilfe erklärt.
Ich habe ein wenig herumprobiert und diverse Internetforen- und hinweise
besucht.
Ich habe einen Teilerfolg :(
Ich kann mit der ULP alle Programme öffnen, die auf Laufwerk C liegen
(Ausprobiert z.B. Notepad).
Aber kein Programm, das auf einem anderen Laufwerk liegt.
Ich habe die EAGLE-Dateien (Projekte, Librariues, ULPs, usw.) auf einem
separaten Laufwerk - bei mir P:/ - und das Programm, dass ich starten
möchte liegt ebenfalls auf Laufwerk P.
Wenn ich folgendes Programm ausführe: kommt eine Fehlermeldung:
DerBefehl"P:\" ist entweder falsch geschrieben oder
2
konnte nicht gefunden werden.
Ist das programm auf Laufwerk C, wird es ausgeführt.
Wenn ich im offenen DOS-Fenster auf Laufwerk P wechsele, wird dieses
ebenfalls angezeigt.
Ich bin ratlos.
Hinweis:
Die Doppel-Backslash sind nötig, weil diese Angabe im String ein
Sonderzeichen ist. Der Pfad wird richtig übergeben (Kontrolle des Pfads
in einem Text-Dialogfeld war erfolgreich)
Ich habe auch schon probiert "start" einzufügen:
1
sprintf(sCmd,"cmd.exe /c start \"%s\"",sDatei);
Dann passiert ebenfalls nichts. Das Fenster geht im Hintergrund auf und
zu, aber das Programm wird nicht ausgeführt.
Das würde gehen, aber auf diese Datei müssen mehrere Personen im
Netzwerk Zugriff haben, daher ist auch alles auf dem Netzlaufwerk
abgelegt und zu finden.
Balthasar schrieb:> Das würde gehen, aber auf diese Datei müssen mehrere Personen im> Netzwerk Zugriff haben, daher ist auch alles auf dem Netzlaufwerk> abgelegt und zu finden.
Mein Vorschlag (quick and dirty), einen Batch indirekt über einen Batch
aufrufen. Macht die Übergabe vielleicht etwas einfacher.
1
#usage "syscall test via internal generated cmd file"
2
"usage: simply RUN the ulp"
3
4
stringsPath="Z:\\Temp-proj\\EagleSysCalls\\";
5
stringsUlpBatchName="UlpBatch.cmd";
6
stringsUlpFullPath,sCmdLine;
7
8
stringsExternalBatch="Batch2call.cmd";//batch must exist, put external commands in there
Eagle_Layouter schrieb:> @Balesi> Soll bzw. wird dein ULP aus dem Script- oder Boardeditor gestartet?
Hab ich aus einem Schaltplan getestet, sollte aber egal sein.
Wenn du den Kontext brauchst machst du das mit
P: ist ein Netzlaufwerlsbuchstabe. Setz mal statt dem gemappten
Laufwerksbuchstaben den UNC-Pfad ein. Bin ich ja mal gespannt...
aus "P:" wird dann "\\servername\wichtige_ordner\" usw
(wie man jetzt doppelbackslashes da ordentlich als Zeichen einfügt, weis
sich nicht, sollte aber jetzt das kleinere Problem sein.)
@Balesi
habe wie du auch mal etwas 'rumgespielt'. ;)
mein lösungansatz sieht wie folgt aus.
A) Scriptdatei für ein Symbol in der Menüleiste (hier im Board-Editor),
welches das ULP aufruft. Vereinfacht die Sache etwas. Das ständige
Schreiben in der Kommandozeile ist ja auch nicht der Bringer.
1
BRD:
2
MENU '[D:\!BACKUP\EAGLE_WINDOWS\PNG\tmp.png] Open application : RUN D:\!BACKUP\EAGLE_WINDOWS\ULP\tmp.ulp;'
Äxl (geloescht) schrieb:> Setz mal statt dem gemappten> Laufwerksbuchstaben den UNC-Pfad ein.
While most command line utilities do fully support UNC paths, they
cannot be set as the current directory. Launching a batch file from a
UNC path will implicitly run CMD.exe with that UNC path, this will often
return the error: path is an invalid current directory path. UNC paths
are not supported. Defaulting to Windows directory.
https://ss64.com/nt/cmd.html
Die Parameterübergabe ist unter windows leider etwas komplex.
Hier mal nur der Teil für "quote" characters:
>If /C or /K is specified, then the remainder of the command line is>interpreted as a command and the following logic is used to process quote>(") characters:>> 1. If all of the following conditions are met, then quote characters on>the command line are preserved:>- No /S switch (Strip quotes)> - Exactly two quote characters> - No special characters between the two quote characters, where special is one
of: & < >( ) @ ^ |
> - There are one or more whitespace characters between the the two quote >characters> - The string between the two quote characters is the name of an executable file.https://ss64.com/nt/syntax-cmd.html
Dazu kommen noch die Restriktionen des ulp system() calls.
Meiner einer ist der Meinung das es besser ist einen batch zu erzeugen
und den zu starten.
X4U schrieb:>> @Balesi>> Soll bzw. wird dein ULP aus dem Script- oder Boardeditor gestartet?>> Hab ich aus einem Schaltplan getestet, sollte aber egal sein.
Sorry für mein fehlposting.
Hallo,
Eagle_Layouter schrieb:> @Balesi> und hat es (etwas) genützt?
Nein, hat es nicht!
Ich habe viel probiert und auch weiter gegoogelt, aber leider mit nur
einem bescheidenen Ergebnis.
Ich habe eine ulp geschrieben, die eine cmd-Datei erzeugt. (Dank an X$U)
Das klappt auch alles, aber die Ausführung der cmd-Datei klappt nicht
und erzeugt immer die gleiche Fehlermeldung.
Das kuriose an der Sache ist:
Klicke ich auf die erzeugte Datei kommt die besagte Fehlermeldung.
Kopiere ich den Inhalt der cmd-Datei (bzw. schneide den Inhalt komplett
aus) und füge den Inhalt des Zwischenspeichers in eine leere oder in die
selbe(!) Datei wieder ein, kann ich die Datei aufrufen und diese wird
auch ausgeführt.
Kurz: ich bin einen Schritt weiterr, aber mein Ziel erreiche ich nicht.
:(