RunProgram und Ladezeiten

Für allgemeine Fragen zur Programmierung mit PureBasic.
Robert
Beiträge: 25
Registriert: 14.09.2004 23:24

RunProgram und Ladezeiten

Beitrag von Robert »

Kann man irgendwie feststellen, wann ein Programm, das mit RunProgram gestartet wurde, komplett fertig geladen ist?
Robert
Beiträge: 25
Registriert: 14.09.2004 23:24

Beitrag von Robert »

Hallo,

hier mal ein kurzes Beispiel zu der Frage:

Code: Alles auswählen

programm$ = "C:\Programme\Microsoft Office\Office10\winword.exe"

datei1$ = "c:\test\doc1.doc"
datei2$ = "c:\test\doc2.doc"
datei3$ = "c:\test\doc3.doc"

RunProgram(Programm$, datei1$,"",0)
RunProgram(Programm$, datei2$,"",0)
RunProgram(Programm$, datei3$,"",0)
Folgendes Problem tritt dabei auf: bei einem ersten Start von Word krachts beim zweiten Dokument. Fehler mit der Normal.dot. Ruft man das ganze dann nochmal auf, gehts natürlich ohne Probleme, weil Word dann schon mal geladen wurde.

Ein Delay macht in diesem Fall ja auch keinen Sinn, da sich die Ladezeit u.U. recht lange hinziehen kann. Ich hab auch mal das RunProgramEx von Rings probiert, wo mit CreateProcess gearbeitet wird, aber leider krachts auch da.

Hat jemand eine Idee wie man das lösen kann? Danke.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Und eine If-Abfrage ungleich NULL geht auch nicht? Also sollte das zweite
Runprogramm erst ausgeführt werden können, wenn die vorherige IF-Abfrage ungleich NULL ist, usw. ...

Zusätzlich könnte man auch noch folgende Fehler Prüfen:

Code: Alles auswählen

0 The operating system is out of memory or resources. 
ERROR_FILE_NOT_FOUND The specified file was not found. 
ERROR_PATH_NOT_FOUND The specified path was not found. 
ERROR_BAD_FORMAT The .exe file is invalid (non-Microsoft Win32 .exe or error in .exe image). 
SE_ERR_ACCESSDENIED The operating system denied access to the specified file. 
SE_ERR_ASSOCINCOMPLETE The file name association is incomplete or invalid. 
SE_ERR_DDEBUSY The Dynamic Data Exchange (DDE) transaction could not be completed because other DDE transactions were being processed. 
SE_ERR_DDEFAIL The DDE transaction failed. 
SE_ERR_DDETIMEOUT The DDE transaction could not be completed because the request timed out. 
SE_ERR_DLLNOTFOUND The specified dynamic-link library (DLL) was not found. 
SE_ERR_FNF The specified file was not found. 
SE_ERR_NOASSOC There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable. 
SE_ERR_OOM There was not enough memory to complete the operation. 
SE_ERR_PNF The specified path was not found. 
SE_ERR_SHARE A sharing violation occurred. 

Dann sollte es schon gehen.




Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Falko, su hast ihn falsch verstanden. Das Proggy (Word) wird ja gestartet nur läd Word am Anfang die "Normal.dot". Wenn das aber mehrere "Words" auf einmal machen gibts Probleme, desswegen will Robert warten bis Word die Datei geladen hat, was man aber warscheinlich nicht abfragen kann..
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Robert
Beiträge: 25
Registriert: 14.09.2004 23:24

Beitrag von Robert »

Hallo Falko, hallo Deeem2031,

sorry, hat ein bißchen gedauert. So wie es aussieht, kann man es wahrscheinlich wirklich nicht abfragen, wann ein Programm geladen und die übergebene Datei geöffnet parat steht. Interessieren würde es mich schon, aber rausbekommen hab ich's nicht. Dafür aber folgendes:
1. Wenn man wie im obigen Beispiel mehrere Dateien öffnen will, muß man den Befehl Shellexecute_ verwenden.

Code: Alles auswählen

Datei1$ = "c:\Test\doc1.doc"
Datei2$ = "c:\Test\doc2.doc"
Datei3$ = "c:\Test\doc3.doc"

ShellExecute_(0, "open", Datei1$, 0, 0, #SW_SHOWNORMAL)
ShellExecute_(0, "open", Datei2$, 0, 0, #SW_SHOWNORMAL)
ShellExecute_(0, "open", Datei3$, 0, 0, #SW_SHOWNORMAL)
Das läuft einwandfrei, der Befehl regelt das Open irgendwie intern und es gibt keinerlei Probleme. Ein Programm muß man nicht angeben, das sucht sich der Befehl selbst.

2. Will man mehrere Dokumente mit einem anderen Programm öffnen, als wie in der Dateiverknüpfung angegeben, übergibt man diese am besten auf einmal an das Programm. Hier kann man jetzt auch RunProgram verwenden.
Beispiel: Html-Dateien in Word bearbeiten, obwohl dem IE zugeordnet.

Code: Alles auswählen

programm$ = "C:\Programme\Microsoft Office\Office10\winword.exe"

Datei1$ = "c:\Test\html1.html"
Datei2$ = "c:\Test\html2.html"
Datei3$ = "c:\Test\html3.html"
Datei$ = chr(34) + datei1$ + chr(34) + " " + chr(34) + datei2$ + chr(34) + " " + chr(34) + datei3$ + Chr(34)

RunProgram(Programm$(i),Datei$,"",0)
Bei gleichem Pfad geht auch:

Code: Alles auswählen

programm$ = "C:\Programme\Microsoft Office\Office10\winword.exe"

Path$ = "c:\Test\"
Datei1$ = "html1.html"
Datei2$ = "html2.html"
Datei3$ = "html3.html"
Datei$ = chr(34) + datei1$ + chr(34) + " " + chr(34) + datei2$ + chr(34) + " " + chr(34) + datei3$ + Chr(34)

RunProgram(Programm$,Datei$,Path$,0)
Auch hier gibt's jetzt keine Probleme mehr. Die Dateien werden alle in einem String übergeben - was natürlich auch gleich der "Nachteil" hierbei ist. Denn die meisten Programme arbeiten in der Regel mit einer Commandline-Länge von max. 2048 Byte. Man kann also nicht unendlich viele Dateien auf einmal damit laden. Word z.B. läßt mit dieser Methode nur max. 10 Dateien zu.
Vielleicht kann's ja jemand brauchen.

Gruß Robert
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

Wenn das Programm (hier Word) keine Rückmeldung gibt, ist es nahezu unmöglich rauszufinden, ob alles fertig geladen wird.

Das System kann dir höchstens sagen, ob das Programm jetzt vollständig in speicher ist und es gestartet wird. Was danach kommt, geht das OS nicht mehr so wirklich was an (außer das Programm greift wieder auf OS-Routinen zu).
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Robert
Beiträge: 25
Registriert: 14.09.2004 23:24

Beitrag von Robert »

Das mit "jetzt vollständig im Speicher ist" klingt gut. Kann man das irgendwie feststellen?

Und eine Rückmeldung vom Programm - kann man vielleicht mit SendMessage_ eine Reaktion auslösen?
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

Robert hat geschrieben:Das mit "jetzt vollständig im Speicher ist" klingt gut.
Wird dir in Falle von Word nicht helfen, weil erst nach diesen Zeitpunkt die "normal.dot" geöffnet wird...
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Man könnte ja den Pfad zur normal.dot rausfinden und abfragen ob man sie benutzen darf und dann so lange warten bis das so ist. Ich weiß zwar nicht wie man das abfragt ohne die Datei zu öffnen, aber man kanns ja versuchen.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Robert
Beiträge: 25
Registriert: 14.09.2004 23:24

Beitrag von Robert »

qGPI, stimmt, da hast du recht. Spätestens da ist Ende der Fahnenstange.

@Deem231, dein Vorschlag könnte für Word klappen ...

Aber summa summarum glaube ich, daß die Lösung mit ShellExecute_ von Beispiel 1 die beste ist. Hab ich mittlerweile eingebaut und dreht wunderbar, egal mit welchem Programm.

Danke euch. Gruß Robert
Antworten