ShellExecute wird nicht richtig ausgeführt

tombe

Erfahrenes Mitglied
Hallo,
ich habe für mein Programm eine HTML Datei als Hilfedatei erstellt. Innerhalb dieser Datei gibt es verschiedene Anker.

Wenn ich nun über ShellExecute die Hilfe ohne Angabe eines Ankers aufrufe, wird der Browser gestartet und die Datei angezeigt. So bald ich aber eine bestimmte Stelle aufrufen will, wird die Datei nicht angezeigt (Ergebnis von ShellExecute = 5).

Hier mal der Code dazu :

Code:
pfad$ = App.Path & "\Hilfe\hilfe.html"
If ActiveControl.Tag = "anmeldung" Then
    pfad$ = pfad$ & "#anmeldung"
    Result = ShellExecute(Me.hwnd, "Open", pfad$, "", App.Path, 1)
ElseIf ActiveControl.Tag = "abfrage" Then
    pfad$ = pfad$ & "#abfrage"
    Result = ShellExecute(Me.hwnd, "Open", pfad$, "", App.Path, 1)
ElseIf ActiveControl.Tag = "bewerten" Then
    pfad$ = pfad$ & "#abfrageergebnis"
    Result = ShellExecute(Me.hwnd, "Open", pfad$, "", App.Path, 1)
Else: Result = ShellExecute(Me.hwnd, "Open", pfad$, "", App.Path, 1)
End If

Wenn ich mir den Inhalt der Variablen pfad$ im Direktfenster anzeigen lasse und dann in den Browser kopiere, klappt es. Die Angaben in der Variablen sind also richtig.

Kann mir von euch einer sagen wo hier der Fehler liegen könnte

Gruß Thomas
 
Kann das jetzt nicht testen, hätte aber einen anderen Lösungsansatz:

Wieso baust du in dein Projekt nicht eine Form mit einem WebBrowser-Control ein? Damit kannst du die Hilfe-Datei in dem Control über die Navigate-Funktion aufrufen, erstens sollte das problemlos funktionieren und zweitens hast du die Hilfe (zumindestens den Aufruf) in dein Programm integriert. Wäre doch eine effektive Lösung, oder?


Der Doc!
 
Hi Doc,

also der Aufruf (ShellExecute) der Hilfedatei ist ja im Programm integriert. Nur eben das Verweisziel macht hier Probleme.

Ich werde Deinen Vorschlag mal umsetzten, mal sehn ob ich damit die entsprechende Stelle(n) anspringen kann.

Thomas
 
So, ein bißchen getestet, hier das Ergebnis.

Das Problem ist, dass ShellExecute beim starten der lokalen Datei nicht weiß, dass der letzte Teil ein Anker ist. Daher wird die Datei nicht gefunden und auch nicht gestartet. Der Browser erkennt den Anker, daher macht er im Browser keine Probleme.

Abhilfe bringt ein Workaround, du müsstest die iexplore.exe (alternativ die mozilla.exe) starten und die Datei inkl. Pfad und Anker als Argument übergeben. Dann würde der Anker richtig angesprungen werden. Sähe dann so aus:
Visual Basic:
Result = ShellExecute(hwnd, "Open", "c:\progra~1\intern~1\iexplore.exe", "c:\test.htm#anker", "", 1)
Vielleicht gibts auch einen Schalter, der das Laden einer Ankerseite auf die herkömmliche Art erlaubt, ich kenn aber keinen. Vom oa Vorschlag (Integrieren des Controls) abgesehen ist das die einzige Variante, die mir einfällt.


Der Doc!
 
Hallo,

warum setzt Du nicht den HTMLHelpWorkshop von Microsoft ein? Den kannst Du kostenlos bei Microsoft herunterladen (http://www.microsoft.com/downloads/...4-c8a6-452f-9aa0-d597d16580cc&DisplayLang=en).

Damit erzeugst Du professionelle CHM-Dateien, die dann mit entsprechenden API-Funktionen aufgerufen werden können.
Code:
Option Explicit

Private Declare Function HtmlHelp Lib "hhctrl.ocx" Alias "HtmlHelpA" (ByVal hwndCaller As Long, ByVal pszFile As String, ByVal uCommand As Long, ByVal dwData As Long) As Long
Private Declare Function HtmlHelpTopic Lib "hhctrl.ocx" Alias "HtmlHelpA" (ByVal hwnd As Long, ByVal lpHelpFile As String, ByVal wCommand As Long, ByVal dwData As String) As Long

Private Const HH_DISPLAY_TOPIC = &H0


Public Sub ShowHelp(Optional ByVal sTopicFile As String)

  Dim sHelpFile As String
  
  ' Pfad zur HTML-Hilfe
  sHelpFile = App.HelpFile

  If sTopicFile = "" Then
    ' Startseite anzeigen
    HtmlHelp 0, sHelpFile, HH_DISPLAY_TOPIC, ByVal 0&
  Else
    ' belibiege Seite anzeigen
    HtmlHelpTopic 0, sHelpFile, HH_DISPLAY_TOPIC, sTopicFile + ".htm"
  End If
End Sub

Die Funktion rufst Du dann entweder mit "CALL ShowHelp("")" auf, dann wird die Hauptseite angezeigt, oder mit z.B. "CALL ShowHelp("HelpSiteX")" (dann würde direkt die HTML-Seite mit dem Namen "HelpSiteX"" in der CHM-Datei aufgerufen.

Da in CHM-Dateien jede Menge interne und externe Links, Bilder usw. eingebaut werden können, ist man sehr flexibel. Außerdem kann mit dem Help-Workshop auch ein eigener Index oder auch Volltextsuche integriert werden.

Ich hoffe, Dir damit geholfen zu haben.
Viele Grüße
Ronald
 
Hi ronaldh,

das hört sich auch sehr interessant an. Werde mir das mal genauer durchlesen.

Gruß Thomas
 
Zurück