none
Kann ich in VBA festellen oib ich in 64 oder 32Bit bin ?

    Frage

  • Ich muss über VBA-Code ein Kommandozeilenprogramm aufrufen, nämlich "pdftk", welches einem Bericht/Dokument - als PDF exportiert - verschiedene Informationen in den benutzerdefinierten Eigenschaften hinzufügt.

    Das funktioniert im Prinzip mit dem Shell-Befehl.

    Leider wartet dieser Befehl offenbar nicht, bis das Shell-Programm fertig, sondern kehrt sofort zurück, d.h. die Weiterverarbeitung der korrigierten PDF-Datei (Versand per Mail, archivieren) scheitert, weil die Datei noch gar nicht fertig ist.

    Für 32-Bit ist das Problem im Grunde mit ShellAndWait (Code im Internet verfügbar) gelöst;

    das ganze funktioniert aber NUR unter 32-Bit. Für 64-Bit scheint es sowas nicht zu geben.

    Meine Recherchen haben bisher kein funktionierendes ShellAndWait für 64-Bit VBA ergeben.

    Mein momentaner Work-around ist eine Art Sleep-Funktion, die den Code für einige Sekunden beschäftigt.

    Ist aber unbefriedigend.

    ERSTES Problem: Ich möchte herausfinden ob Access als 32-Bit oder 64-Bit ausgeführt wird und den entsürechenden Code aufrufen

    ZWEITES Problem: Hat jemand die ultimative Methode parat für mein "Problem" ?

    Sonntag, 30. August 2015 09:53

Alle Antworten

  • Hi,
    hast Du mal versucht, das WindowsHandle der Anwendung zu prüfen? Oder nutze WaitForSingleObject. Siehe dazu hier.


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks

    Sonntag, 30. August 2015 10:21
  • Ja, dieser Code scheitert bei mir, weil ich immer den falschen Handle habe.

    Ich rufe ja kein Notepad mit eigenem Fenster auf, sondern die Shell und die wiederum pdftk.exe

    Deshlab habe ich diese Methode ad acta gelegt.

    Sonntag, 30. August 2015 13:06
  • Hallo,
     
    NicoNi wrote:
     
    > [...]
    > Für 32-Bit ist das Problem im Grunde mit ShellAndWait (Code im Internet
    > verfügbar) gelöst;
    >
    > das ganze funktioniert aber NUR unter 32-Bit. Für 64-Bit scheint es
    > sowas nicht zu geben.
    >
    > Meine Recherchen haben bisher kein funktionierendes ShellAndWait für
    > 64-Bit VBA ergeben.
     
    Naja, das einzige, was an der 32-bit-Variante geändert werden muss sind
    die Deklarationen der Funktionen, sie sind um PtrSafe zu ergänzen. Dann
    klappts auch mit 64-bit VBA ;-)
     
    Private Declare PtrSafe Function WaitForSingleObject Lib "kernel32" (ByVal _
        hHandle As Long, ByVal dwMilliseconds As Long) As Long
       
    Private Declare PtrSafe Function CreateProcessA Lib "kernel32" (ByVal _
        lpApplicationName As Long, ByVal lpCommandLine As String, ByVal _
        lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
        ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
        ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
        lpStartupInfo As STARTUPINFO, lpProcessInformation As _
        PROCESS_INFORMATION) As Long
       
    Private Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal _
        hObject As Long) As Long
     
    Gruss - Peter
     
    --
     

    Sonntag, 30. August 2015 22:21
    Moderator
  • ERSTES Problem: Ich möchte herausfinden ob Access als 32-Bit oder 64-Bit ausgeführt wird und den entsürechenden Code aufrufen

    ZWEITES Problem: Hat jemand die ultimative Methode parat für mein "Problem" ?

    Hallo!

    Für erstens gibt's die leicht irreführend benamste Compiler-Konstante "Win64", letzteres hat Peter Döring schon erläutert. Eine Zusammenfassung mit Beispielcode für beide Aspekte findest du hier:

    https://msdn.microsoft.com/en-us/library/office/gg264421.aspx


    cu
    Karl
    Access FAQ (de/it): donkarl.com
    Access Lobby: AccessDevelopers.org

    Montag, 31. August 2015 13:52