Zum Inhalt springen

Auf externes Programm warten...


Filou

Empfohlene Beiträge

Hi! Hab folgendes Problem:

Mein Programm öffnet Micorsoft Word zum scannen von Dokumenten. Der Benutzer speichert diese in ein Verzeichnis. Dann soll mein Programm das Dokument aus dem Vezeichnis holen und weiter damit arbeiten.

Nur woher weiß mein Programm, dass der User die Datei gespeichert und Word beendet hat? Ich wollte es mit einer MessageBox machen. Also dass man erst die MessageBox schließt bevor das Programm weiterläuft.

Leider drängt sich die MessageBox vor Word. D.H. wenn man nicht in die Taskleiste schaut bekommt man gar nicht mit, dass Word aufgeganegen ist weil die MessageBox und mein Programm dann im Vordergrund ist.

Gibts da nicht eine schönere Lösung wie man das machen könnte?

Habt Ihr ne Idee wie man das lösen könnte?

Gruß, Filou

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mit WaitForSingleObject könntest du zumindest warten bis Word geschlossen wird. Aber ob er gespeichert hat weißt du so nicht..

Das wäre toll!! Ob er gespeichert hat oder nicht weiß ich dan, wenn das Verzeichnis leer ist.

Was für ein Handle muss ich in der Funktion angeben? Wie funktioniert das genau? Woher weiß ich welches Handle Word hat?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Morgen Leutz :)

Ich habe es jetzt mit WaitForSingleObject versucht.

Das Programm läuft, es bekommt nur noch nicht mit dass Word geschlossen wurde...

Ich habs so gemacht:


DWORD WINAPI test;

HWND hWnd;


//Dokumentenvorlage zum Scannen öffnen

	ShellExecute(hWnd,"open",m_DBSettings.m_DefaultDocPath + "\\Vorlage\\Scannen.dot",NULL,NULL,SW_SHOWNOACTIVATE);

	test = WaitForSingleObject(hWnd, 10000);

	while (test != 0x00000000L)

		{

		test = WaitForSingleObject(hWnd, 10000);

		}

Es soll so lange warten bis Word beendet ist.

Gruß, Filou

Link zu diesem Kommentar
Auf anderen Seiten teilen

Auch wenn es vielleicht nicht so guter Programmierstil ist:


System([Pfad zur Exe] [Parameter]);

Danach wird meines Wissens auf jedenfall solang gewartet bis das Programm beendet wurde...

Kann mich aber auch irren.

'System' : nichtdeklarierter Bezeichner

Kann es auch nicht in der MSDN finden. Nur als C#.

Bist Du Dir sicher dass es das gibt?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das funktioniert irgendwie nicht. Da geht nur die Eingabeaufforderung auf. Aber öffnet mein Dokument nicht. Wenn ich den selben Pfad in die Eingabeaufforderung schreibe dauerts nen Moment und dann geht es aber auf.

Vielleicht könnt Ihr mir nochmal bei WaitForSingleObject helfen??

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für den Tip!

Aber ich verzweifle!!! :(

ich bekomms einfach net hin! :beagolisc :( :( :( :(

	DWORD WINAPI test;

	HWND hWnd;


	//Dokumentenvorlage zum Scannen öffnen

	LPSHELLEXECUTEINFO lpExecInfo;

	lpExecInfo->hwnd = hWnd;

	lpExecInfo->lpDirectory = m_DBSettings.m_DefaultDocPath + "\\Vorlage\\";

	lpExecInfo->lpFile = "scannen.dot";

	lpExecInfo->nShow = SW_SHOWMAXIMIZED;


	ShellExecuteEx(lpExecInfo);

	test = WaitForSingleObject(lpExecInfo->hwnd, 10000);


	while (test != WAIT_ABANDONED)

		{

		test = WaitForSingleObject(lpExecInfo->hwnd, 10000);

		}

Link zu diesem Kommentar
Auf anderen Seiten teilen

	LPSHELLEXECUTEINFO lpExecInfo;
lpExecInfo->hwnd = hWnd;[/code]

Man sieht es dem Typen nicht direkt an, aber LPSHELLEXECUTEINFO ist ein Zeiger - das erkennst du an dem LP. Du schreibst also hier über einen uninitialisierten Zeiger irgendwo im Speicher herum. Du musst ein SHELLEXECUTEINFO-Objekt anlegen und dessen Adresse übergeben. Außerdem musst du die Struktur mit {0} initialisieren, sonst stehen in den Membern, die du nicht zuweist, willkürliche Werte. Den cbSize-Member musst du auf sizeof SHELLEXECUTEINFO setzen.

Auf Fensterhandle kann man nicht warten. Das [b]Prozess[/b]handle, auf das du warten kannst, steht im hProcess-Member, wenn du bei fMask SEE_MASK_NOCLOSEPROCESS setzt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Man sieht es dem Typen nicht direkt an, aber LPSHELLEXECUTEINFO ist ein Zeiger - das erkennst du an dem LP. Du schreibst also hier über einen uninitialisierten Zeiger irgendwo im Speicher herum. Du musst ein SHELLEXECUTEINFO-Objekt anlegen und dessen Adresse übergeben. Außerdem musst du die Struktur mit {0} initialisieren, sonst stehen in den Membern, die du nicht zuweist, willkürliche Werte. Den cbSize-Member musst du auf sizeof SHELLEXECUTEINFO setzen.

Auf Fensterhandle kann man nicht warten. Das Prozesshandle, auf das du warten kannst, steht im hProcess-Member, wenn du bei fMask SEE_MASK_NOCLOSEPROCESS setzt.

Danke für die ausführliche erklärung.

Aber ganz kapiert hab ichs noch nicht. Schau mal:

	SHELLEXECUTEINFO *lpExecInfo;

	//Dokumentenvorlage zum Scannen öffnen

	lpExecInfo->cbSize = sizeof(SHELLEXECUTEINFO);

	lpExecInfo->dwHotKey=0;

	lpExecInfo->fMask=0;

	lpExecInfo->hIcon=0;

	lpExecInfo->hInstApp=0;

	lpExecInfo->hkeyClass=0;

	lpExecInfo->hMonitor=0;

	lpExecInfo->hProcess=0;

	lpExecInfo->lpClass=0;

	lpExecInfo->lpIDList=0;

	lpExecInfo->lpParameters=0;

	lpExecInfo->lpVerb=0;


	lpExecInfo->hwnd = hWnd;

	lpExecInfo->lpDirectory = m_DBSettings.m_DefaultDocPath + "\\Vorlage\\";

	lpExecInfo->lpFile = "scannen.dot";

	lpExecInfo->nShow = SW_SHOWMAXIMIZED;


	ShellExecuteEx(lpExecInfo);
So lässt es sich kompilieren, läuft aber neicht. Ich hatte Dein Post so vertanden:
SHELLEXECUTEINFO *LPSHELLEXECUTEINFO;

*LPSHELLEXECUTEINFO lpExecInfo;

Aber das lässt sich nicht kompilieren. :rolleyes: *seuftz*

ICH HASSE POINTER!!!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die ausführliche erklärung.

Aber ganz kapiert hab ichs noch nicht. Schau mal:

	SHELLEXECUTEINFO *lpExecInfo;
//Dokumentenvorlage zum Scannen öffnen
lpExecInfo->cbSize = sizeof(SHELLEXECUTEINFO);[/code] Gleiches Problem wie vorher: Uninitialisierter Zeiger.
[code]SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof SHELLEXECUTEINFO;
usw...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dankeschön!!! :e@sy

Das öffnen klappt jetzt!!

Allerdings seht in meinem hProcess immer das selbe drin. Egal ob ich Word schließe oder nicht.

Der Inhalt ist immer 4294967295.

Was sitmmt da nicht?

	ShellExecuteEx(&lpExecInfo);

	test = WaitForSingleObject(lpExecInfo.hProcess, 2000);


	//Warten bis Word beendet ist.

	while (test != WAIT_OBJECT_0)

		{

		test = WaitForSingleObject(lpExecInfo.hProcess, 2000);

		}

Link zu diesem Kommentar
Auf anderen Seiten teilen

..........:floet:

Ok *in die ecke stell und schäm*

aber es geht immer noch nicht. da steht immernoch die selbe zahl in test.

	DWORD WINAPI test;

	HWND hWnd;

	CString csPfad = m_DBSettings.m_DefaultDocPath + "\\Vorlage\\";


	//Struktur zum Öffnen mit ShellExecuteEx

	SHELLEXECUTEINFO lpExecInfo = {0};

	lpExecInfo.hProcess = hWnd;

	lpExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;

	lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);

	lpExecInfo.lpDirectory = csPfad;

	lpExecInfo.lpFile = "scannen.dot";

	lpExecInfo.nShow = SW_SHOWMAXIMIZED;



	ShellExecuteEx(&lpExecInfo);

	test = WaitForSingleObject(lpExecInfo.hProcess, INFINITE );


	//Warten bis Word beendet ist.

	while (test != WAIT_OBJECT_0)

		{

		test = WaitForSingleObject(lpExecInfo.hProcess, INFINITE );

		}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Läuft Word möglicherweise schon? Ein Prozesshandle bekommst du nur, wenn durch ShellExecuteEx auch wirklich ein Prozess gestartet wird.

Was gibt ShellExecuteEx zurück?

Was steht in lpExecInfo.hProcess?

Was gibt WaitForSingleObject zurück?

Ok, Du hast es wieder mal auf Anhieb erraten!

Also es ist so. Ich verwende Office 2003 und da läuft Word als Prozess im Hintergrund wenn Outlook aktiv ist. Also wird der Prozess niemals wirklich beendet. Selbst wenn ich Outlook schließe, Word öffne und dann wieder beende läuft der prozess weiter im Hintergrund.

Erst wenn ich den Prozess im Taskmanager abwürge läuft mein Programm dann weiter. Also tut mein Programm im Grunde das, was es soll... Nur Word nicht...

Was ein Sch*** :(

Was nun? Hast Du noche ine Idee?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...