Acrobat Reader abschießen
-
Servus,
Archivsoftware, läuft stand-alone von einer CD-ROM. Zur Anzeige der PDFs (fertige
und selbst erstellte) verwende ich den Acrobat Reader (es gingen natürlich auch andere,
je nachsem was der Kunde halt hat).Über eine Auswahlliste wird das anzuzeigende PDF mit ShellExecute dem Reader
untergeschoben. Das PDF wird im Windows-Temp zur Anzeige abgelegt.Problem: Will der Benutzer ein anderes PDF mit dem Reader ansehen, muß ich entweder
ihm unterschiedliche Namen geben oder vorher den Reader beenden.Variante 1: Unterschiedliche Namen: Ich mülle das temp zu, der Benutzer hat viele
nette Reader-Fensterchen herumliegen die er alle wieder schließen muß.Variante 2: Der User muß den Reader beenden weil sonst die temp-Datei gesperrt ist.
Ich würde bei V2 gerne aus meinem Programm den Reader flachlegen, geht das irgendwie ?
(Programm: Watcom C, win32s)
-
hey,
du könntest beispielsweise den prozess mittels CreateProcess starten. - über die PROCESS_INFORMATION struct die CreateProcess füllt, bekommst du die pid des prozesses. - dadurch kannst du nachdem du dir rechte per OpenProcess gegeben hast und den Exit code per GetExitCodeProcess bekommen hast per TerminateProcess den prozess killen. - ich habe dazu mal eben ein kleines testapp gemacht (sicherlich nicht besonders sauber, für die demonstrationszwecke sollte es aber reichen :))
lg
#include <windows.h> #include <iostream> #include <conio.h> int main() { PROCESS_INFORMATION pinfo; STARTUPINFO sinfo; DWORD dwExitCode; HANDLE hProcess; ZeroMemory(&pinfo, sizeof(pinfo)); ZeroMemory(&sinfo, sizeof(sinfo)); if (!CreateProcess(0,"C:\\lala.exe", 0, 0, false, 0, 0, 0, &sinfo, &pinfo )) { printf("CreateProcess failed! Error: %d\n", GetLastError()); } else { getch(); if(!(hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_TERMINATE, false, pinfo.dwProcessId))) { printf("OpenProcess failed! Error: %d\n", GetLastError()); } else { if (!GetExitCodeProcess(hProcess, &dwExitCode)) { printf("GetExitCodeProcess failed! Error: %d\n", GetLastError()); }else { if (!TerminateProcess(hProcess, dwExitCode)) printf("TerminateProcess failed! Error: %d\n", GetLastError()); else printf("Process killed!"); } } } getch(); return 0; }
-
Merci, das probiere ich gleich mal aus :xmas1:
-
Servus und vielen Dank !
Hat prima funktioniert bis ich versucht habe, dem AR auch noch
eine PDF-Datei unterzuschieben. Er zeigt sie zwar an, aber bei
TerminateProcess() bekomme ich 'ne 5 "Zugriff verweigert". *grrr*In pdfreader stehen Pfad und exe des Acrobats.
Die ProzessID stimmt, an der Struktur habe ich eigentlich nichts
geändert:static PROCESS_INFORMATION pinfo; static STARTUPINFO sinfo; static char file[256], buf[256]; OpenReader() { ZeroMemory( &pinfo, sizeof( pinfo)); ZeroMemory( &sinfo, sizeof( sinfo)); GetTempPath( sizeof( buf), buf); sprintf( file, "acrord32.exe %scdrom.pdf", buf); JA( "\nReader Open %s with %s", pdfreader, file); if ( ! CreateProcess( pdfreader, file, 0, 0, FALSE, 0, 0, 0, &sinfo, &pinfo )) { JA( " CreateProcess failed! Error: %d\n", GetLastError( )); } } CloseReader() { DWORD dwExitCode; HANDLE hProcess = NULL; JA( "Reader Close"); if ( ! pinfo.dwProcessId){ JAC( " inaktiv"); return; } if( ! ( hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_TERMINATE, FALSE, pinfo.dwProcessId))) { JA( " OpenProcess failed! Error: %d %s\n", GetLastError(), GetErrMessage()); } else { if ( ! GetExitCodeProcess( hProcess, &dwExitCode)) { JA( " GetExitCodeProcess failed! Error: %d %s\n", GetLastError(), GetErrMessage()); } else { if ( ! TerminateProcess( hProcess, dwExitCode)) JA( " TerminateProcess failed! Error: %d %s\n", GetLastError(), GetErrMessage()); else JA( " Process killed!"); } } }JA() schreibt mir ein Laufzeitprotokoll. Der Ablauf beim Neu-Laden
eines PDF ist:CloseReader(); das PDF neu erstellen (gleicher Filename in temp OpenReader();
-
Gefunden *kopfklatsch* ... :xmas2:
-
Nur falls auch mal jemand so etwas vorhat:
TerminateProcess() ist anscheinend eine der eher betulichen Funktionen.
Die Funktion kommt offensichtlich zurück bevor der abgeschossene Prozess
wirklich beendet ist und alle Ressourcen freigegeben sind.Das ergibt einen kleinen Klimmzug, wenn man unmittelbar darauf eine neue
Datei zur Anzeige vorbereitet.BronX, nochmal vielen Dank für die Anregung !
-
Hallo,
Scheppertreiber schrieb:
TerminateProcess() ist anscheinend eine der eher betulichen Funktionen.
So ist es, wie auch hier:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-253809.html
schon erklärt und beobachtet.
MfG,
Probe-Nutzer
-
Interessant ...
Ich habe ewig nichts mehr mit Windows gemacht, die letzte Zeit nur CGI, JS und HTML/CSS.
Man muß sich erst wieder "reindenken". Na ja, Danke nochmal an Alle !Sachma, in dem Artikel ist etwas von CloseHandle() erwähnt, muß ich das hProcess noch
explizit schließen ?
-
Jo musst du machen ! Sowas steht aber eig. auch in der Doku.
-
Ok, aktuell so:
#include "start.h" static PROCESS_INFORMATION pinfo; static STARTUPINFO sinfo; static char file[256], buf[256]; OpenReader() { char *p; ZeroMemory( &pinfo, sizeof( pinfo)); ZeroMemory( &sinfo, sizeof( sinfo)); GetTempPath( sizeof( buf), buf); if ((p = strrchr( pdfreader, '\\')) != NULL){ ++p; } else { p = pdfreader; } sprintf( file, "%s %scdrom.pdf", p, buf); JA( "\nReader Open '%s' with '%s'", pdfreader, file); if ( ! CreateProcess( pdfreader, file, 0, 0, FALSE, 0, 0, 0, &sinfo, &pinfo)) { JAC( " CreateProcess failed! Error: %d\n", GetLastError()); } else { JAC( " gestartet :-)"); } } CloseReader() { DWORD dwExitCode; HANDLE hProcess; JA( "Reader Close"); if ( ! pinfo.dwProcessId){ JAC( " inaktiv"); return; } if( ( hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_TERMINATE, FALSE, pinfo.dwProcessId)) == NULL) { JA( " OpenProcess failed! Error: %d %s\n", GetLastError(), GetErrMessage()); } else { if ( ! GetExitCodeProcess( hProcess, &dwExitCode)) { JA( " GetExitCodeProcess failed! Error: %d %s\n", GetLastError(), GetErrMessage()); } else { if ( ! TerminateProcess( hProcess, dwExitCode)) JA( " TerminateProcess failed! Error: %d %s\n", GetLastError(), GetErrMessage()); else JA( " Process killed!"); } if ( ! CloseHandle( hProcess)) JA( " CloseHandle failed! Error: %d %s\n", GetLastError(), GetErrMessage()); } }Ich habe das HANDLE von OpenProcess verwendet. In pinfo sind auch noch 2 Handles, eins
für den Prozess und eins für den Thread. Die HANDLE von OpenProcess und pinfo sind nicht
gleich. Mache ich das korrekt ?In dem Blog steht:
You did remember to CloseHandle the handles returned in the PROCESS_INFORMATION structure that you passed to the CreateProcess function, didn't you?)
Sind damit pinfo.hProcess und pinfo.hThread gemeint ?
-
Scheppertreiber schrieb:
TerminateProcess() ist anscheinend eine der eher betulichen Funktionen.
Die Funktion kommt offensichtlich zurück bevor der abgeschossene Prozess
wirklich beendet ist und alle Ressourcen freigegeben sind.Hilfe lesen bildet:
TerminateProcess initiates termination and returns immediately.
Deswegen mit WaitForSingleObject auf die Signalisierung des Prozesses warten.
Allerdings frage ich mich, ob du dein Konzept nicht überdenken solltest:
The TerminateProcess function is used to unconditionally cause a process to exit. The state of global data maintained by dynamic-link libraries (DLLs) may be compromised if TerminateProcess is used rather than ExitProcess.
-
Allerdings frage ich mich, ob du dein Konzept nicht überdenken solltest:
Gerne.
Aufgabe ist: Dem Acrobat Reader ein neu erstellte Datei unterzuschieben damit er sie
anzeigt. Vorzugsweise mit einem Dateinamen damit nicht der ganze Bildschirm zugemüllt
wird.Es gibt zwar von Adobe eine lib zum Einbinden, Adobe hat aber auf mittlerweile recht viele
Anfragen nicht einmal reagiert.