2

何年もの間、アプリケーション内からデフォルトの Web ブラウザを起動するために ShellExecute() API を使用してきました。このような:

ShellExecute( hwnd, _T("open"), 
    _T("http://www.winability.com/home/"), 
    NULL, NULL, SW_NORMAL );

Google が Chrome ブラウザをリリースした数週間前までは、問題なく動作していました。現在、Chrome がコンピューターにインストールされている場合、ShellExecute API は Web ページを開かなくなりました。

この問題を解決する方法をまだ見つけた人はいますか? (Chrome を検出して、Chrome のせいだとユーザーに伝えるメッセージを表示するまでは?)

編集:セルゲイによって提供されたコードは機能しているように見えるので、「その」答えとして受け入れました。WinExec の呼び出しが気に入らないことを除けば、MSDN によると、WinExec は 16 ビット アプリケーションとの互換性のためにのみ提供されているとのことです。IOW、サービス パックで動作しなくなる可能性があります。私は試していませんが、16 ビット アプリケーションをまったくサポートしていないため、Windows x64 で既に動作しなくなっていても驚かないでしょう。そこで、WinExec の代わりに、Sergey のコードのようにレジストリからパスを取得し、URL を引数として、ShellExecute を使用します。ありがとう!

4

2 に答える 2

4

これは、すべてのブラウザで機能するコードです。秘訣は、ShellExecuteが失敗した場合にWinExecを呼び出すことです。

HINSTANCE GotoURL(LPCTSTR url, int showcmd)
{
    TCHAR key[MAX_PATH + MAX_PATH];

    // First try ShellExecute()
    HINSTANCE result = 0;

    CString strURL = url;

    if ( strURL.Find(".htm") <0 && strURL.Find("http") <0 )
        result = ShellExecute(NULL, _T("open"), url, NULL, NULL, showcmd);

    // If it failed, get the .htm regkey and lookup the program
    if ((UINT)result <= HINSTANCE_ERROR) {

        if (GetRegKey(HKEY_CLASSES_ROOT, _T(".htm"), key) == ERROR_SUCCESS) {
            lstrcat(key, _T("\\shell\\open\\command"));

            if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS) {
                TCHAR *pos;
                pos = _tcsstr(key, _T("\"%1\""));
                if (pos == NULL) {                     // No quotes found
                    pos = strstr(key, _T("%1"));       // Check for %1, without quotes
                    if (pos == NULL)                   // No parameter at all...
                        pos = key+lstrlen(key)-1;
                    else
                        *pos = '\0';                   // Remove the parameter
                }
                else
                    *pos = '\0';                       // Remove the parameter

                lstrcat(pos, _T(" \""));
                lstrcat(pos, url);
                lstrcat(pos, _T("\""));
                result = (HINSTANCE) WinExec(key,showcmd);
            }
        }
    }

    return result;
}
于 2008-09-21T21:17:31.803 に答える
0

少数のシステムで ShellExecute が失敗したという報告を聞いた後、Sergey Kornilov の例に似た機能を実装しました。これは約1年前のことです。同じ前提 - .HTM ファイル ハンドラーの直接 HKCR ルックアップを実行します。

ただし、.htm ファイルを (「編集」するのではなく) 「開く」ように登録するエディター (UltraEdit など) を使用しているユーザーもいます。したがって、ShellExecuteが失敗すると、この 2 番目のメソッドも失敗します。シェルの関連付けが誤って指示するように、エディターを開きます。

したがって、ユーザーは代わりに HTTP ハンドラーを使用するか、少なくとも HTML ハンドラーを優先して使用する必要があります。

于 2012-07-14T08:51:55.237 に答える