5

当社は、Flare の下でヘルプ システムを HTML5 形式に移行しています。また、ヘルプ ページindex.html#CSHID=GettingStartedを起動するなど、トピックに直接アクセスするための URI コマンド ラインで Flare CSHID を使用して、ヘルプ システムへのトピック ベースのアクセスを追加しました。GettingStarted.html

私たちのアプリは C++ で記述されており、Win32ShellExecute()関数を利用して HTTP に関連付けられた既定のアプリケーションを生成し、ヘルプ システムを表示します。ShellExecute()次のように、ハッシュタグが指定されていない場合でも問題なく機能することがわかりました。

ShellExecute(NULL, _T("open"), _T("c:\\Help\\index.html"), NULL, NULL, SW_SHOWNORMAL);

この関数は、HTML ページの表示に関連付けられている既定のブラウザーを起動します。この場合、File:///プロトコル ハンドラーが開始され、ブラウザーが起動file:///c:/Help/index.htmlし、アドレス バーに が表示されます。

ただし、#トピックの情報を追加するShellExecute()と、ページを開くことができません

ShellExecute(NULL,_T("open"),_T("c:\\Help\\index.html#cshid=GettingStarted"),NULL,NULL,SW_SHOWNORMAL);

ブラウザがまったく開いた場合は、トピック IDfile:///c:/Help/index.htmなしで l に移動します。#cshid=GettingStarted

これは、File プロトコル ハンドラが を介して関与している場合にのみ問題になることに注意してくださいShellExecute()。ヘルプ システムが Web 上に存在し、Http または Https プロトコル ハンドラが関与している場合、すべてがうまく機能します。

一部のお客様はプライベート LAN を使用しており、常にインターネット アクセスに依存しているわけではないため、ヘルプ システムをアプリケーションと共に出荷する必要があります。

4

4 に答える 4

4

Microsoft の MSDN チームと何度かやり取りした後、彼らは ShellExecute() 呼び出しのソース コードを確認し、はい、ShellExecute() で File:/// ベースの URL を処理するときに、ShellExecute() 呼び出しが実行されると判断しました。デフォルトのブラウザを起動し、開く HTML ページを送信する前に、# と # の後に見つかったすべてのデータを取り除きます。MS のスタンスは、機能へのインジェクションを防ぐために意図的にこれを行うというものです。

解決策は、URL で # を検索して ShellExecute() 呼び出しを強化し、# が見つかった場合は、その URL を使用してデフォルトのブラウザーを手動で起動することでした。ここに疑似コードがあります

void WebDrive_ShellExecute(LPCTSTR szURL)
{
    if ( _tcschr(szURL,_T('#')) )
    {
        //
        //Get Default Browser from Registry, then launch it.
        //
        ::RegGetStr(HKCR,_T("HTTP\\Shell\\Open\\Command"),szBrowser);
        ::CreateProcess ( NULL, szBrowser + _T(" ") + szURL, NULL, NULL, FALSE, 0, NULL, NULL, &sui, &pi);
    }
    else
        ShellExecute(NULL,_T("open"),szURL,NULL,NULL,SW_SHOWNORMAL);
}

確かに、C++ コードにはもう少しありますが、この一般的な設計はうまくいきました。

于 2014-10-10T17:56:15.637 に答える
1

WebDrive のソリューションを試してみましたが、Windows 10 ではうまくいきませんでした。

デフォルトのブラウザ設定に関係なく、「HTTP\Shell\Open\Command」のデフォルト値は Internet Explorer のパスに設定されています。ただし、Internet Explorer の場合、そのソリューションは機能します。

Windows 10 で既定のブラウザー パスを取得するプロセスは少し異なります ( Windows の既定のブラウザー (スタート メニューの上部) を確認する方法) では、ブラウザーによっては解決策が機能することが保証されていません。たとえば、私にとっては Edge では機能しませんでした。

Edge で動作させるには、URL に「file:///」を追加する必要がありましたが、これにより、URL が ShellExecute() でも動作するようになります。したがって、少なくとも Windows 10 では、次のことだけを行う必要がありました。

ShellExecute(NULL,_T("open"),_T("file:///c:/Help/Default.html#cshid=1648"),NULL,NULL,NULL);

更新: 上記は数か月前に機能しなくなりました。ここで説明されているように、私が最終的に行ったことは、一時ファイルを通過することでした: https://forums.madcapsoftware.com/viewtopic.php?f=9&t=28376#p130613

于 2018-05-02T22:58:43.213 に答える