Seite 1 von 1

RunProgram und Ladezeiten

Verfasst: 18.10.2004 21:20
von Robert
Kann man irgendwie feststellen, wann ein Programm, das mit RunProgram gestartet wurde, komplett fertig geladen ist?

Verfasst: 19.10.2004 18:46
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.

Verfasst: 19.10.2004 22:56
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

Verfasst: 19.10.2004 23:00
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..

Verfasst: 21.10.2004 18:04
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

Verfasst: 21.10.2004 21:08
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).

Verfasst: 21.10.2004 22:35
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?

Verfasst: 22.10.2004 19:23
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...

Verfasst: 22.10.2004 19:26
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.

Verfasst: 22.10.2004 22:15
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