*.chmヘルプファイルをメニューのヘルプから表示させるには

解決


紅輝  2010-07-28 07:30:06  No: 71832

VisualStudio2008 C++ ネーティブコードでプログラムしています。
自作ソフトのヘルプファイルをHTML Help Workshopで作りつつあります。
メニュー→ヘルプ→ヘルプ目次検索をクリックすると作られるOnHelpUsing()関数内に、ShellExecuteW()とかHtmlHelp()等を使って、コンパイルされた*.chmファイルを別ウインドウで表示させたいのですが、どのように書けば好いのか見当がつきません。
1)ヘルプファイルを表示させるのに皆さんはどのようになさっておられますか?
2)OSはXP(SP3)ですが、*.chmファイルはwindow 7でもサポートされているのでしょうか?  HTML Help workshopは古いのでしょうか?


aetos  2010-07-30 04:39:25  No: 71833

ShellExecute や HtmlHelp といった関数を使えばよいという情報はどこで得ましたか?  そこにはサンプルは掲載してありませんでしたか?

以下にリファレンスがあります。
これを読んでみて、具体的にどこがわからないか、改めて質問してみてください。

ShellExecute
http://msdn.microsoft.com/en-us/library/bb762153.aspx

HtmlHelp
http://msdn.microsoft.com/en-us/library/ms670172.aspx

HtmlHelp に関しては、VB ですが日本語の資料もあります。
http://msdn.microsoft.com/ja-jp/library/cc343994.aspx

> OSはXP(SP3)ですが、*.chmファイルはwindow 7でもサポートされているのでしょうか?  HTML Help workshopは古いのでしょうか?

サポートされています。7 でも現役というか、最新と言うか…CHM が唯一の選択肢です。


紅輝  2010-07-30 06:53:24  No: 71834

aetosさんアドバイス有難うございます。
HtmlHelpを使うのが本筋のようですね。でもVS2010のC++は見つけました。
http://msdn.microsoft.com/ja-jp/library/4ak3a4ce.aspx
virtual void HtmlHelp(
   DWORD_PTR dwData,
   UINT nCmd = 0x000F 
);

DWORD_PTR dwDataはUNIT nCmdによって変わるらしいのですが、uCommandパラメーターを読むと、
http://msdn.microsoft.com/ja-jp/library/ms670080(en-us,VS.85).aspx
では1.4SKDとなって、
HtmlHelp(
         hwnd,
         "cat.chm",
         HH_DISPLAY_INDEX,
         (DWORD)"meow") ;
となっています。
VS2008では4つものパラメーターは受け付けてくれません。1.4SKDはC++6.0などのように古いのでしょうか?
試行錯誤していますが、旨く行きません。
ご教授よろしくお願いいたします。


aetos  2010-07-30 08:52:18  No: 71835

MFCをご利用ですか?
引数の数が違うのは、Visual C++ のバージョンによるものではなく、MFC を使っているかいないかの違いです。


紅輝  2010-07-30 17:16:53  No: 71836

MFCアプリケーションを選択しています。マネージアプリケーションでは有りません。MSDNのライブラリーを読むときは、マネージコード向きではないことを確認するのですが、このHtmlHelpの説明に関しては、探し方が悪いのか
この点もはっきりつかめていません。
*.chmファイルの作り方は、インターネット上で詳しく説明されていますので、割と簡単に作っていっているのですが、これをメニューのヘルプに新規に追加した「ヘルプ検索と目次」などのところをクリックすると発生するイベント******View::OnHelpUsing()内に、*.chmファイルを開くプログラムを色々と試しながら書き込んでいますが、旨く行かず困っています。
よろしくお願いいたします。


tetrapod  2010-07-30 18:44:09  No: 71837

CWnd::HtmlHelp
http://msdn.microsoft.com/en-us/library/xtwk15xt.aspx

::HtmlHelp
http://msdn.microsoft.com/en-us/library/ms670172.aspx

っつことですがな。この両者の違いは理解できてる?


紅輝  2010-07-30 21:48:45  No: 71838

Visual Studio 2008ではありませんが、2010とほぼ同じなのでこちらの方かなと思いますが、この説明のuCommandを開いてみるとSDK1.4の画面に変わってしまいます。  
そんなことで、2個の因数と4個の因数に違いが有るのは判りますが、2個の因数の方の使い方がサッパリ判っては居りません。また
DWORD_PTR dwDataはポインタですよね。  これもどうすれば好いのかも判っていません。
メニューのヘルプの所をクリックすると、***.chmファイルが開いてくれればそれだけで、好いのですがね。


ryo  2010-07-30 22:10:16  No: 71839

まとめると、質問内容は

「MFCの「HtmlHelp(CWnd::HtmlHelp or CWinApp::HtmlHelp)」を使いたいが
その使い方(第一引数、第二引数をどう書くのか?)がわからない」

ということかな?


紅輝  2010-07-30 22:33:04  No: 71840

ryoさん
その通りです。
サッパリ判らず、困っています。  
今のところ、私のアプリのユーザーはHTMLファイルのヘルプを読んでいますが、結構複雑なアプリを開発中ですから、もっと判りやすく説明するためにHelp workshopを使って****.chmファイルを作りつつあります。50ページぐらいになりそうですが、丁度半分ぐらいまで出来てきています。
よろしくお願いいたします。


tetrapod  2010-07-30 22:33:34  No: 71841

正直、先に挙げた MSDN 解説ページを丁寧に追っていけば簡単なはずなんだが。

CWnd::HtmlHelp や CWinApp::HtmlHelp (引数2個の HtmlHelp)は、その中で
::HtmlHelp (引数4個)を呼び出している、ということを理解できているかな?
CWinApp::HtmlHelp の nCmd は、そのまま ::HtmlHelp の uCommand に渡されている。
CWinApp::HtmlHelp の dwData も同様 ::HtmlHelp の dwData に渡されている。
なので MFC の解説ページから SDK の解説ページに飛ぶのは当たり前。
dwData や uCommand に何を指定すればよいかは SDK の ::HtmlHelp 解説をきっちり読めばいい。

CWinApp::HtmlHelp の解説ページ中の Reference 部も重要。

# ここまでの発言を拝見するに読んでいないと判断するしかない。


紅輝  2010-07-30 22:46:15  No: 71842

引数2個の方は引数4個を呼び出しているとは全く判っていませんでした。
terapodさんの説明をゆっくり読んで、SDKの解説とにらめっこして見ます。
でも、英語は皆さん並に理解しているつもりですが、この手の解説はニガテですわ。


tetrapod  2010-07-31 00:25:09  No: 71843

細かい解説は省略するので自分で納得いくまで MSDN 読むべし。

MFC ダイアログベースアプリでボタンから CWnd::HtmlHelp を呼ぶ例
void CHogeDlg::OnBnClickedHtmlHelp() {
    HtmlHelp(0, HH_DISPLAY_TOPIC); // CWnd::HtmlHelp を呼んでいる
}

Help ファイルのファイル名とかは初期化時点で指定してやる必要がある。
BOOL CHogeApp::InitInstance() {
    ...
    EnableHtmlHelp();
// m_pszHelpFilePath の扱い方は CWinApp 解説ページに注意がある
    free((void*)m_pszHelpFilePath);
// インストール先から chm ファイルを特定する必要がある
    m_pszHelpFilePath=_tcsdup(chmfile);
    ...
}

CWnd::HtmlHelp を使うとヘルプウィンドウがアプリケーションウィンドウの上に来るので
両方を並べて使うことが出来ず、俺的には不便な気がする。
オーバーラップ関係を持たせずに使うのであれば ::HtmlHelp を直接使う。


紅輝  2010-07-31 05:14:02  No: 71844

皆さんから発破をかけていただきながら勉強してきましたが、どうしても旨く行きません。
そんな中、tetrapodさんの例は大いに参考になりましたが、最後の一行が大変気になりまして、::HtmlHelpに挑戦しました。
1)HtmlHelp.libをリンカ→入力→追加の依存ファイルに追加しました。
2)onHelpUsing()内に
hwnd = ::HtmlHelp(NULL,_T("DSCW.chm"),HH_DISPLAY_TOPIC, NULL);
と書いてみましたが、最初のHWNDのNULLがunusuallとなって旨く行きません。m_hWndとかGetDeskとpWindow()等も試しましたが、旨く行かず。
ここのところ、どのように書けば好いでしょうかお教え戴ければ幸いです。
3)なお、インターネットであれこれ調べて、HtmlHelpの初期化をinitialUpdateに、そして終了処理もdestroyに書き込みました。


tetrapod  2010-07-31 08:04:27  No: 71845

俺んとこでは ::GetDesktopWindow() でうまくいったけど・・・
まさか CWnd::GetDesktopWindow を使っていたりしない?
もしそうなら C++ の勉強が足らない感がひしひし伝わってくるので要精進かな。

DSCW.chm のように「フルパス」でないファイル名を指定するとうまくいかない場合あり。
実用に供する際には要修正。


ryo  2010-07-31 10:42:37  No: 71846

1:処理を記述している関数全体のソースの提示

2:chmファイルはそもそも開けるのか。

3:chmファイルはどこに置いているのか?
VS2005あたりから(2003未経験なので)、
デフォルトの設定のままプロジェクトを作製した場合
デバッガ起動時のカレントディレクトリは、
exeのある場所(\debug)ではなく、vcprojファイルのある場所になる
よって、exeと同じ場所にchmファイルをおいてもパスが通らない


紅輝  2010-07-31 20:38:17  No: 71847

terapodさん、ご指摘どおり::をGetDesktopWindow()の前に付けたらOKでした。
hwnd = ::HtmlHelp(::GetDesktopWindow(),(LPCWSTR)_T("DSCW.chm"), HH_DISPLAY_INDEX, NULL);
::は何のおまじないかサッパリ判っていません。HI
ryoさん、ご指摘どおりchmファイルをデバッグ中に作っていると思える場所にコピーしたところヘルプファイルが表示できました。
皆さん、お騒がせいたしました。有難うございました。
これで、ヘルプファイル残り半分作成に熱が入ります。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加