HtmlHelp mit MFC
-
Ich bin dabei, ein vorher nur mit WinAPI geschriebenes Programm mit der MFC umzusetzen. Da gibt es jetzt ein Problem mit dem Aufruf einer chm-Datei durch HtmlHelp.
Bei simpler WinAPI gibt es dafür ja folgende Form:
HWND WINAPI HtmlHelpA(HWND hwndCaller, LPCSTR pszFile, UINT uCommand, DWORD_PTR dwData);Mit der habe ich vorher gearbeitet. Die MFC hat jetzt sowas:
virtual void CWinApp::HtmlHelp(DWORD_PTR dwData, UINT nCmd = 0x000F);In vielen Tutorials für HtmlHelp unter MFC im Internet sehe ich, dass da einfach wieder die obere Form benutzt wird. Mache ich derzeit auch so. Aber irgendwie wirkt das nicht optimal, wenn doch eine Methode dafür bereitgestellt wird. Zwei Probleme habe ich jedoch, wenn ich die MFC-Form benutzen möchte.
1. - Welche Datei wird aufgerufen? Soweit ich erfahren habe, wird die Member-Variable m_pszHelpFilePath des Objekts benutzt? Hatte aber noch keine Gelegenheit, das zu testen, denn:
2. - Es gibt einen Absturz bei der Sache. Ich rufe das ganze mit HtmlHelp(NULL, HH_DISPLAY_TOPIC) auf, nachdem ich m_pszHelpFilePath gesetzt habe. Im Prinzip sind alle Parameter nur aus dem nachweislich korrekten Aufruf der ersten Sorte rüberkopiert. Trotzdem kein Erfolg.
Was kann man denn hier trotzdem noch falsch machen, bzw. wie funktioniert die MFC-Variante der Funktion?
-
Du hast doch den Source Code.
CWinApp::HtmlHelp ruft nur die HtlmHelp Funktion Deines CMainWnd auf.
Diese ruft wiederum AfxHtmlHelp auf. Mit
AfxHtmlHelp(pWnd->m_hWnd, pApp->m_pszHelpFilePath, nCmd, dwData)!Diese Funktion ist ein Wrapper für ::HtmlHelp
Wo stürzt Dien Programm ab?
-
Wo gibt's denn den Quellcode dafür?
Was mein Programm betrifft:
void CTHNExporterMFCApp::OnOpenHelp() { char filePath[300] = "Some file path..."; m_pszHelpFilePath = filePath; HtmlHelp(NULL, HH_DISPLAY_TOPIC); // Crash genau an dieser Stelle //::HtmlHelp(NULL, m_pszHelpFilePath, HH_DISPLAY_TOPIC, NULL); // dieser Aufruf funktioniert (<- kein Fehler des FilePath-Strings) }
-
David Schneider schrieb:
Wo gibt's denn den Quellcode dafür?
Du musst Ihn einfach installieren

-
Ich bin stark verwirrt. Bitte um Erklärung.

Was das konkrete Problem anbetrifft: Eine Idee, warum das hier nicht geht, der direkte Aufruf aber schon?
-
David Schneider schrieb:
Wo gibt's denn den Quellcode dafür?
Was mein Programm betrifft:
void CTHNExporterMFCApp::OnOpenHelp() { char filePath[300] = "Some file path..."; m_pszHelpFilePath = filePath; HtmlHelp(NULL, HH_DISPLAY_TOPIC); // Crash genau an dieser Stelle //::HtmlHelp(NULL, m_pszHelpFilePath, HH_DISPLAY_TOPIC, NULL); // dieser Aufruf funktioniert (<- kein Fehler des FilePath-Strings) }Dein Code ist für die Füsse.
m_pszHelpFilePath wird ungeültig, wenn die Funktion verlassen wird.
Verwende strdup oder Speicher den Pfad vernünftigerweise in Deine InitInstance in die entsprechenden Vaiablen.
-
David Schneider schrieb:
Ich bin stark verwirrt. Bitte um Erklärung.

? Warum. Bei der Installation von VS kannst Du auswählen was Du von VC++ installieren willst. Und AFAIk ist der Source per default nicht aktiviert. Also Setup nochmals aufrufen und bei VC++ *alles* auswählen!
Bzgl. deinem Problem: Martin hat ja schon was gesagt.
Auch solltest Du in Konstruktor Deiner Klasse "EnableHtmlHelp()" aufrufen!
-
Das hatte ich schon als mögliche Ursache in Betreacht gezogen. Aber HtmlHelp wird doch in meiner Methode aufgerufen, also müsste auch m_pszHelpFilePath an dieser Stelle eigentlich noch gültig sein, weil filePath noch nicht aus dem lokalen Scope gegangen ist. Es hilft auch nichts, _strdup zu benutzen. Derselbe Crash passiert trotzdem immer noch.
EDIT: Mit "EnableHtmlHelp()" funktioniert es jetzt. Schönen Dank.
Das mit dem Quellcode wusste ich gar nicht mehr. Ist schon 'ne Weile her, dass ich Visual Studio installiert habe.