문제

수년 동안 저는 ShellExecute() API를 사용하여 애플리케이션 내에서 기본 웹 브라우저를 시작했습니다.이와 같이:

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

Google이 Chrome 브라우저를 출시한 몇 주 전까지는 잘 작동했습니다.이제 컴퓨터에 Chrome이 설치되어 있으면 ShellExecute API가 더 이상 웹페이지를 열지 않습니다.

이 문제를 해결하는 방법을 아직 알아낸 사람이 있나요?(Chrome을 감지하고 사용자에게 Chrome의 잘못임을 알리는 메시지를 표시하는 데 부족합니까?)

편집하다:Sergey가 제공한 코드가 작동하는 것 같아서 "the" 답변으로 수락했습니다.단, WinExec 호출이 마음에 들지 않습니다.MSDN에서는 WinExec이 16비트 응용 프로그램과의 호환성을 위해서만 제공된다고 읽습니다.IOW, 모든 서비스 팩에서 작동이 중지될 수 있습니다.시도해 보지는 않았지만 Windows x64에서는 16비트 응용 프로그램을 전혀 지원하지 않기 때문에 이미 작동이 중지되어도 놀라지 않을 것입니다.따라서 WinExec 대신 Sergey의 코드처럼 레지스트리에서 가져온 경로와 URL을 인수로 사용하여 ShellExecute를 사용하겠습니다.감사해요!

도움이 되었습니까?

해결책

다음은 모든 브라우저에서 작동하는 코드입니다.비결은 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;
}

다른 팁

소수의 시스템에서 ShellExecute가 실패했다는 보고를 듣고 Sergey Kornilov가 제공한 예와 유사한 기능을 구현했습니다.이것은 약 1년 전의 일이었습니다.동일한 전제 - .HTM 파일 처리기의 직접 HKCR 조회를 수행합니다.

그러나 일부 사용자에게는 편집자가 있는 것으로 나타났습니다(예:UltraEdit)는 .htm 파일을 '열기' 위해 자신을 등록합니다('편집'하는 대신).따라서, 만약에 ShellExecute가 실패하면 이 보조 방법도 실패합니다.쉘 연결이 잘못 지시한 대로 편집기가 열립니다.

따라서 사용자는 대신 HTTP 핸들러를 사용하거나 적어도 HTML 핸들러보다 우선적으로 사용해야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top