Forum: Platinen EAGLE ULP um Windows Programm zu starten


von Balesi (Gast)


Lesenswert?

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.

von system() (Gast)


Lesenswert?

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.

von Balesi (Gast)


Lesenswert?

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:
1
string sCmd;
2
string sDatei = "P:\\Unterordner1\\EAGLE\\scr\\update_eagle_lbr.cmd";
3
sprintf(sCmd, "cmd.exe /c \"%s\"", sDatei);
4
system(sCmd);

Die Fehlermeldung lautet (im DOS-Fenster):
1
Der Befehl "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.

von W.P. K. (elektronik24)


Lesenswert?

und wenn Du Dir eine passende Batch Datei auf C:\ legst und diese 
startest?

von Balthasar (Gast)


Lesenswert?

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.

von X4U (Gast)


Lesenswert?

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
string sPath = "Z:\\Temp-proj\\EagleSysCalls\\";
5
string sUlpBatchName = "UlpBatch.cmd";
6
string sUlpFullPath, sCmdLine;
7
8
string sExternalBatch = "Batch2call.cmd";  //batch must exist, put external commands in there
9
10
11
// Generate own batch with command line inside
12
sprintf( sUlpFullPath, "%s%s", sPath, sUlpBatchName );
13
sprintf( sCmdLine, "cmd.exe /c \"%s%s\"", sPath, sExternalBatch);
14
15
output( sUlpFullPath, "w")
16
printf(sCmdLine);
17
18
19
// Run own batch
20
system(sUlpFullPath);

von Eagle_Layouter (Gast)


Lesenswert?

@Balesi
Soll bzw. wird dein ULP aus dem Script- oder Boardeditor gestartet?

von X4U (Gast)


Lesenswert?

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

1
if (board) {         // oder (library) | (schematic) 
2
3
4
5
}

von Äxl (geloescht) (Gast)


Lesenswert?

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.)

von Thomas H. (eagle_layouter)


Lesenswert?

@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;'

B) das ULP selbst
1
#require 5.1001
2
3
// CONFIG
4
string programPath_WIN = "C:/Windows/Notepad.exe";
5
string OS_SYSTEM = strlwr(" " + OS_SIGNATURE);
6
string FileExists[];
7
8
if (strrstr(OS_SYSTEM, "window") > 0)
9
{
10
if (fileglob(FileExists, programPath_WIN) > 0)
11
  system("cmd.exe /c START \"\" \"" + programPath_WIN);
12
else
13
  dlgMessageBox("File path issue, incorrect path: " + programPath_WIN);
14
}

Eventuell funzt es ja bei dir auch oder dient als Idee.

von X4U (Gast)


Lesenswert?

Ä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.

von Eagle_Layouter (Gast)


Lesenswert?

@Balesi
und hat es (etwas) genützt?

von Balesi (Gast)


Lesenswert?

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. 
:(

von Eagle_Layouter (Gast)


Lesenswert?

Ist da jetzt schon mehr an Funktionalität dazu gekommen oder geht es 
immer noch darum, nur ein (Windows-)Programm via ULP zu starten?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.