2008-09-21 2 views
2

몇 년 동안 ShellExecute() API를 사용하여 내 응용 프로그램 내에서 기본 웹 브라우저를 시작했습니다. 이와 같이 :Google 크롬이 ShellExecute()를 위반 했습니까?

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

Google이 Chrome 브라우저를 출시한지 2 주 전까지 만해도 괜찮 았습니다. 이제 컴퓨터에 Chrome이 설치된 경우 ShellExecute API는 더 이상 웹 페이지를 열지 않습니다.

이 문제를 해결하는 방법을 아직 알지 못했습니까? (Chrome을 감지하고 사용자에게 Chrome의 결함을 알리는 메시지가 표시되지 않는 경우)

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

+0

FWIW, 내 컴퓨터에서 Chrome이 기본 브라우저로 설정된 상태에서 완벽하게 작동합니다. 너는 * 고장난 기계에 다른 것이 설치되어 있는지보고 싶을 수도있다 ... – Shog9

+0

내 컴퓨터에서는 작동하지 않지만, .htm 관련 응용 프로그램을 시작하는 트릭이 있으면 작동하기 때문에 나는 행복하다. 감사! –

+0

WinExec은 실제로 현재 Windows afaik의 모든 방법으로 x64에 남아 있으며 테스트를 마쳤습니다. 나는 그들이 그것을 제거 할 좋은 이유가 있다고 생각하지 않습니다, 그래서 그것을 남겨 두었습니다. –

답변

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; 
} 
+0

나는 여기에서 전제가 가장 효과적이라고 여기는 것에 동의 할 수있다 - 나는 그러한 실험을 결정하기 위해 약간의 실험을해야했다. ShellExecute가 실패하면 다시 실패합니다. .HTM 처리기 대신 HTTP 프로토콜로 폴백 할 수 있지만 ShellExecute *가 수행해야하는 작업이므로 폴 더를 수행하도록 코드를 변경하면 2 차 오류가 발생할 가능성이 높습니다. 또 다른 문제가 있습니다. NT 6+의 승격 된 프로세스에서 브라우저를 시작하면 브라우저 자체가 상승되었습니다.이것은 바람직하지 않은 상태입니다. 이 문제를 해결할 수있는 방법이 있지만 그 주제는 –

0

에서 ShellExecute는 시스템의 소수에 실패의보고를들은 후, 나는 세르게이 코르닐로프에 의해 주어진 예제와 비슷한 기능을 구현했습니다. 이것은 약 1 년 전이었습니다. 동일한 전제 - .HTM 파일 처리기를 직접 HKCR 조회합니다.

그러나 일부 사용자에게는 '편집'대신 '.htm'파일을 열어 등록하는 편집자 (예 : UltraEdit)가있는 것으로 나타났습니다. 따라서 인 경우 ShellExecute가 실패하면이 보조 메서드도 실패합니다. 쉘 연관이 잘못 지시하면 편집기가 열립니다.

따라서 사용자는 HTTP 처리기 대신 또는 적어도 HTML 처리기를 사용해야합니다.

관련 문제