Problem beim öffnen einer *.pdf Datei

Hallo zusammen!

Benötige mal wieder ein bissel Hilfe.

Aus meinem Programm möchte ich eine pdf Datei öffnen. Das hat auch bis vorgestern gefunzt. Nun habe ich das Update 8.1 von Adobe Reader geladen und seither geht es nicht mehr. Der Reader wird gefunden und geöffnet. Dann erscheint ein Hinweisfenster: „Es ist ein Fehler aufgetreten.Datei kann nicht gefunden werden“.
Die Datei hat ihren Ort aber nicht verlassen und wenn ich dort im Ordner einen Doppelklick drauf mache, öffnet sich der Reader mit der Datei.
Warum also nicht mehr aus VB ?

Danke Marcus

Hallo Marcel,

poste doch mal den Source, wie du das PDF Document öffnest.
Hellsehen koennen wir nicht :s

MfG Alex

Hallo Alex!

Zuerst habe ich die API Function eingebunden, und der Aufruf zum öffnen lautet:

ShellExecute(Formname.hwnd, „open“, „AcroRD32.exe“, App.Path & „\Ordner\Datei.pdf“, „“, 1)

Wie schon geschrieben, bis vorgestern hat alles gefunzt. Nur als ich das INet verlassen habe, hatte ich ein Update drauf 8.1. Und nach der Installation geht es nicht mehr.Der Reader öffnet sich aber noch vom Programm her, „nur“ die Datei findet er nicht.
Danke Marcus

Hallo Alex!

Hallo Marcus,

Zuerst habe ich die API Function eingebunden, und der Aufruf
zum öffnen lautet:

Ok, die API ist schon einmal gut :smile:

ShellExecute(Formname.hwnd, „open“, „AcroRD32.exe“, App.Path &
„\Ordner\Datei.pdf“, „“, 1)

Warum so umstaendlich?

dim sFile as String
sFile=IIF(right(app.path,1)="\",app.path & "Ordner\Datei.pdf",app.path & "\Ordner}Datei.pdf")
if dir(sFile)"" then ShellExecute(Formname.hwnd, "Open", sfile,"","",1)

Du musst schauen, je nachdem, wo app.path ist, bekommst du am Ende ein Backslash oder nicht :smile: Von daher Fix die Prüfung ob \ am ende ist oder nicht. Auch ist es ratsam zu prüfen ob das File existiert!
Desweiteren, hast du einmal geschaut, ob der Acrobat Reader auch wirklich so heisst? Was ist wenn das File auf anderen Rechnern anders heisst, weil eine andere Version vorliegt?
Um das Problem zu umgehen, koennte man mit der API FindFirstFile arbeiten. Aber warum mit Kanonen auf Spatzen schiessen?
Üvergeben wir der API ShellExecute einfach den Filenamen mit dem Commando Open, so öffnet VB das File mit dem Verknuepften Program, was ja schliesslich der Acrobat Reader ist :smile:

Nun kannst du anhand des Rueckgabewertes noch prüfen ob der Aufruf erfolgreich war. Wenn nicht dann ggfls. weitere Schritte einleiten, wie zum Bsp. Öffnen mit Dialog anzeigen :smile:

MfG Alex

Wie schon geschrieben, bis vorgestern hat alles gefunzt. Nur
als ich das INet verlassen habe, hatte ich ein Update drauf
8.1. Und nach der Installation geht es nicht mehr.Der Reader
öffnet sich aber noch vom Programm her, „nur“ die Datei findet
er nicht.
Danke Marcus

Hallo Alex!

Danke erst mal für die Antwort. Ich habe es noch nie so versucht. Habe deinen Code mal bei mir eingeschrieben,

dim sFile as String
sFile=IIF(right(app.path,1)="",app.path &
„Ordner\Datei.pdf“,app.path & „\Ordner}Datei.pdf“)
if dir(sFile)"" then ShellExecute(Formname.hwnd,
„Open“, sfile,"","",1)

aber so klappt es nicht. Entweder kommt Syndaxfehler oder er erwartet „=“, dann hat er was zu meckern das der Type nicht stimmen würde. Ich hätte nie gedacht das das finden einer Datei sooooooo viel Ärger machen kann.
Danke Marcus

Hallo Alex!

Hallo Marcus,

Danke erst mal für die Antwort. Ich habe es noch nie so
versucht. Habe deinen Code mal bei mir eingeschrieben,

Nichts zu danken :smile:
Und es gibt ein erstes male *zwinker*

dim sFile as String
sFile=IIF(right(app.path,1)="",app.path &
„Ordner\Datei.pdf“,app.path & „\Ordner}Datei.pdf“)
if dir(sFile)"" then ShellExecute(Formname.hwnd,
„Open“, sfile,"","",1)

aber so klappt es nicht. Entweder kommt Syndaxfehler oder er
erwartet „=“, dann hat er was zu meckern das der Type nicht
stimmen würde. Ich hätte nie gedacht das das finden einer
Datei sooooooo viel Ärger machen kann.

Owei Asche auf mein Haupt. Nunja passiert wenn man es net testet :s
Also wo die Fehlermeldung herkommen soll das die Typen net stimmen, ist mir fraglich.
Die Sache mit dem = , das ist meine Schuld :s

Wenn du eine API oder eine Sub aufrufst, ohne das Schluesselwort CALL so darfst du die Klammern nicht mitschreiben :s
Genauso ist es wenn du eine Function aufrufst!
Du darfst dann die Klammernnur schreiben,wenn du den Rueckgabewert einer Variablen zuweist :smile:
Duj haettest den Source eigentlich nur wiefolgt abaendern muessen

dim sFile as String
sFile=IIF(right(app.path,1)="\",app.path & "Ordner\Datei.pdf",app.path & "\Ordner}Datei.pdf")
if dir(sFile)"" then **ShellExecute Formname.hwnd,"Open", sfile,"","",1**

Aber ich hatte gerade mal Zeit. Vor einiger Zeit hatte ich hier mal eineRoutine gepostet, wie man Files Öffnet.
Diese ist arg flexibel. Ich habe sie mal um einiges weiter erweitert :smile:

Aber eine Erklärung dazu kommt später. Hier erst einmal die Function

Option Explicit

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long



Public Function LaunchDocument(ByRef Filename As String, \_
ByVal ParentForm As Form, \_
Optional ByVal ShowOpenWithDialog As Boolean = True, \_
Optional ByVal WindowStyle As VBA.VbAppWinStyle = vbNormalFocus) As Boolean
Dim lSuccess As Long
Dim hWndParent As Long
LaunchDocument = False
If Not ParentForm Is Nothing Then hWndParent = ParentForm.hwnd
lSuccess = ShellExecute(hWndParent, "Open", Filename, \_
vbNullString, vbNullString, \_
WindowStyle)
Select Case lSuccess
Case 2 'Datei nicht gefunden
Case 3 ' Pfad wurde nicht gefunden
Case 5 'Zugriff verweigert
Case 11 'Keine Win32 Anwendung
Case 26 'Sharing Verletzung
Case 27 'Datei Assoziation ist unvollstaendig
Case 28 'DDE Zeitlimit wurde erreicht
Case 29 'DDE Vorgang gescheitert
Case 30 'DDE ist nciht bereit
Case 31 ' Keine verknüpfte Anwendung
' Falls ShowOpenWithDialog = True, wird der Dialog
' "Öffnen mit" für diese Datei angezeigt:
If ShowOpenWithDialog Then Shell "RunDLL32 shell32.dll,OpenAs\_RunDLL " & Filename ' Die Auswahlmöglichkeit wird als Erfolg gewertet: LaunchDocument = True End If Case Else ' ShellExecute war erfolglos. ' Boolean-Standardwert False zurückgeben
LaunchDocument = True
Case 32
Case Is \> 32 ' Aufruf erfolgreich
LaunchDocument = True
End Select
End Function

Du rufst einfach die Function auf. Als Rueckgabewert erhaelst du True oder False!
True -> Aufruf efolgreich
False -> Aufruf fehlgeschlagen

Als Parameter, wird folgendes Verlangt

Filename-> Erforderlich, Verlangt das File was geöffnet werden soll
ParentForm -> Die Form aus der die Function aufgerufen wird
Optionale Parameter
Das bedeutet sie muessen nicht angegeben werden! Wenn du sie weglaesst so werden die angegebenen StandardWerte genommen!

ShowOpenWithDialog:
Ist die zu öffnende Datei mit keiner Anwendung verknuepft so wird bei Angabe von TRUE der ÖFFNEN MIT Dialog angezeigt! Standartwert ist TRUE

WindowStyle ->Gibt an ob das öffnende File Maximiert, Minimiert, Normal etc gestart werden soll! Hierzu ist eine VB APPWINSTYLE Variable nötig. Du bekommst aber eine Auswahl der Möglichkeiten angezeigt, wenn du den Parameter eingeben willst! Standartwert hier ist Normal!

Nun siehst du in der Function noch die Select Case Anweisung! Die API SHellExecute gibt dir einen Wert zurueck. Ich habe dir alle möglichen Rueckgabewerte notiert, mit einen Vermerk wann sie auftreten. Hier könntest du noch eine bestimmte MEssage ausgeben oder den Fehler abfangen. Die Function die ich dir da getippselt habe, ist nur als Ansatz und du kannst sie deinen Beduerfnissen noch anpassen :smile:

So das waere eigentlich alles. Nun noch ein Paar mögliche Aufrufe!

Dim vRet As Boolean
 'hier ein paar Variante
 vRet = LaunchDocument("DeinFile.DieExtension", Me)
 vRet = LaunchDocument("DeinFile.DieExtension", Me, False)
 vRet = LaunchDocument("DeinFile.DieExtension", Me, , vbMaximizedFocus)
 vRet = LaunchDocument("DeinFile.DieExtension", Me, False, vbNormalNoFocus)
 'Und die Auswertung
 If vRet Then
 MsgBox "File erfolgreich geöffnet", vbInformation
 Else
 MsgBox "Fehler beim öffnen des File's!", vbCritical
 End If

So diesmal habe ich es auch getestet und es klappt soweit auch alles :smile:

MfG Alex

Danke Marcus

Hallo Alex!
Vielen Dank für deinen Tip es hat alles funktioniert und du hast mir sehr damit geholfen. Den letzten Teil des Codes habe ich mir erst einmal abgespeichert und werde ihn mir mal näher anschauen.
Endschuldige bitte,das ich nicht gleich geantwortet habe, aber meine Frau bekommt immer einen ganz besonderen Glanz in die Augen, wenn ich daheim vor dem Rechner sitze. :-o oder so :frowning:
Danke Marcus
Ps.: Ein Sternchen ist dir sicher

Hallo Alex!

Hallo Marcus,

Vielen Dank für deinen Tip es hat alles funktioniert und du
hast mir sehr damit geholfen. Den letzten Teil des Codes habe
ich mir erst einmal abgespeichert und werde ihn mir mal näher
anschauen.

Nichts zu danken :smile:
Der Code ansich ist eigentlich simple und leicht zu verstehen :smile:
Solltest du da noch fragen haben, so einfach her damit *zwinker*

Endschuldige bitte,das ich nicht gleich geantwortet habe, aber
meine Frau bekommt immer einen ganz besonderen Glanz in die
Augen, wenn ich daheim vor dem Rechner sitze. :-o oder so :frowning:

*feix* das kenne ich irgendwo her :s Somal ich gerade dabei bin auf VB9 umzusteigen, was eherlich gesagt nicht gerade einfach ist, wenn man VB 6 drinnen hat :s und ich da etliche Stunden am PC verbringe nur um was simples zu schaffen :s

Nunja, Frau muss arbeiten und ich hab noch nen bissl frei. Da geht das schon :smiley:

Danke Marcus

MfG Alex