HTML-Help nicht doppelt starten und mit dem Programm beenden
Gast
23.05.2002 - 12:45: HTML-Help nicht doppelt starten und mit dem Programm beenden |
Hallo, Für mein Programm habe ich eine HTML-Hilfedatei erstellt, die mit der folgenden Befehlszeile über ein Menü aufgerufen werden kann: ShellExecute GetDesktopWindow(), "Open", "help.chm", "", App.Path, 1 Die Hilfe soll aber nicht doppelt gestartet werden können. Beim nochmaligen Aufruf soll die die laufende Instanz aktiviert werden. Außerdem soll die HTML-Hilfe mit dem Programm beendet werden. Wie kann ich das am besten lösen> Muss ich alles selbst programmieren oder sind diese Funktionen bereits im Viewer eingebunden und müssen nur über bestimmte Startparameter aktiviert werden> Gruß, Pawel
Thomas Schulz (M+)
23.05.2002 - 13:43: Re: HTML-Help nicht doppelt starten und mit dem Programm beenden |
Hallo Pawel, dass die Hilfe sich in mehreren Instanzen öffnet liegt an ShellExecute. Man sollte es zum Aufruf der Hilfe nicht verwenden, sondern nur mit der HTML Help API arbeiten. Ein kleines Beispiel wie die API in VB eingebunden wird kannst du bei mir downloaden. Auch dein zweites Problem wäre damit erledigt, denn die durch dein Programm aufgerufene Instanz der Hilfe wird beim Beenden deines Programmes automatisch mit geschlossen. Gruß Thomas
Gast
24.05.2002 - 02:18: Re: HTML-Help nicht doppelt starten und mit dem Programm beenden |
Hallo Thomas, Danke für die Schnelle Antwort! Jetzt rufe ich die Hilfedatei mit der folgenden Zeile: HTMLHelp 0, App.Path & "help.chm", 1, 0 Wie gewünscht, wird nun die laufende Instanz beim nochmaligen Start aktiviert und mit dem Programm beendet. In der Entwicklungsumgebung stürzt das Programm aber ab, wenn es beendet wird, bevor die Hilfedatei manuell geschlossen wurde! Kompiliert läuft aber alles bestens. Woran könnte das liegen> Gruß, Pawel
Thomas Schulz (M+)
24.05.2002 - 11:42: Re: HTML-Help nicht doppelt starten und mit dem Programm beenden |
Hallo Pawel, bei diesem Problem kann ich dir leider nicht helfen, dazu reichen meine beschränkten VB Kenntnisse (Hobby) nicht aus. Da müsstest du schon einen VB Profi kontaktieren, denn ich denke dass dieses Verhalten nicht unbedingt etwas mit der Hilfe zu tun hat. Der Grund warum dieses Verhalten auftritt kann mit Sicherheit mehrere Ursachen haben. Poste das Problem mal im VB Forum von Spotlight.de. Falls du das Problem löst, wäre es schön wenn du mir kurz mitteilen könntest woran es lag. Viele Grüße Thomas
Gast
25.05.2002 - 15:48: Problemlösung |
Hallo Thomas, Nach langer Suche, konnte ich keine brauchbaren Hinweise finden. Überall, selbst bei MSDN, wird HTML-Hilfe genauso aufgerufen, wie in Deinem Beispielprogramm. Wobei ich feststellen muss, dass sehr wenige sich mit dem Thema überhaupt beschäftigen! Noch mal das Problem zusammengefasst: Wird das Programm bei geöffneter Hilfe beendet stürzt es samt Entwicklungsumgebung ab. Kompiliertes Programm stürzt in diesem Fall auch ab, aber nur dann, wenn das Hilfefenster beim Beenden minimiert ist. Beim Absturz wird folgender Fehler gemeldet: Die Anweisung in "..." verweist auf Speicher in "...". Der Vorgang "read" konnte nicht auf dem Speicher durchgeführt werden. Klicken Sie auf "OK", um... Experimentell habe ich festgestellt, dass der Fehler nur unter Windows 2000 auftritt, nicht aber bei 98, ME oder XP. Das Problem kann leicht behoben werden, wenn man das Hilfefenster beim beenden mit dem eigenen Code schließt. Hardwareabhängig kann es passieren, dass das Hilfefenster erst nach dem Programmende geschlossen wird, in diesem Fall würde der Fehler auch auftreten. Daher sorgt die Funktion CloseHTMLHelp dafür, dass das Hilfefenster sicher geschlossen wird. Maximale Wartezeit beträgt 5 Sekunden, dann wird das Programm trotz des offenen Hilfefensters fortgesetzt, für den Fall dass es sich aufgehängt hat. _______________________
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Dim HTMLHelpHwnd As Long Const WM_SYSCOMMAND = &H112 Private Sub Command1_Click() HTMLHelpHwnd = HTMLHelp(0, App.Path & "help.chm", 1, 0) End Sub Private Sub Form_Unload(Cancel As Integer) CloseHTMLHelp End Sub Public Sub CloseHTMLHelp() If IsWindow(HTMLHelpHwnd) Then SendMessage HTMLHelpHwnd, WM_SYSCOMMAND, 61536, 0 T = Timer: Do DoEvents Loop Until IsWindow(HTMLHelpHwnd) = 0 Or Timer >= T + 5 End If End Sub _______________________ Gruß, Pawel
Thomas Schulz (M+)
26.05.2002 - 00:27: Re: Problemlösung |
Hallo Pawel, vielen Dank für deinen Hinweis. So können eventuell später einmal User profitieren, die mit einem ähnlichen Problem konfrontiert werden. Ich selber glaube, dass das Problem mit der Hilfe an sich gar nichts zu tun hat, sondern wie die Fehlermeldung es ausdrückt, es sich um ein Problem von Win 2000 mit Speicheradressen handelt. Über die o.g. Fehlermeldung wurde nämlich schon in mehreren Zusammenhängen bzw. über Probleme mit den verschiedensten Programmen berichtet. Viele Grüße und einen schönen Sonntag Thomas