Acrobat Reader abschießen



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


Anmelden zum Antworten