2014-10-10 6 views
2

Наша компания переносит наши справочные системы в формат HTML5 под Flare. Мы также добавили доступ к тематическим разделам в справочные системы, используя Flare CSHID в командной строке URI для прямого доступа к теме, например index.html # CSHID = GettingStarted для запуска справочной страницы GettingStarted.html.Ошибка ShellExecute для локальных URL-адресов html или файлов

Наши приложения написаны на C++ и используют функцию Win32 ShellExecute(), чтобы вызвать приложение по умолчанию, связанное с HTTP, для отображения справочной системы. Мы заметили, что ShellExecute() работает отлично, если не задано значение хэштега, например

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

Эта функция запустит браузер по умолчанию, связанный с просмотром HTML-страниц, и в этом случае обработчик протокола File: /// запустится, браузер запустится, и вы увидите файл: /// c:/Help /index.html в адресной строке.

Однако, как только вы добавляете информацию # в теме, ShellExecute() не удается открыть страницу с

ShellExecute (NULL, _T ("открыто"), _ T ("C: \ Help \ index.html # cshid = GettingStarted "), NULL, NULL, SW_SHOWNORMAL);

Если браузер вообще открывается, вы будете перенаправлены в файл: /// c: /Help/index.html без идентификатора темы # cshid = GettingStarted.

Обратите внимание, что это проблема только в том случае, если обработчик Файлового протокола задействован через ShellExecute(), если справочная система работает в Интернете, а обработчик протокола Http или Https задействован, все работает отлично.

Для наших клиентов, некоторые из которых находятся в частной локальной сети, мы не всегда можем полагаться на доступ в Интернет, поэтому наши справочные системы должны поставляться с приложением.

ответ

2

После некоторых из них с MSDN-командой Microsoft они рассмотрели исходный код на вызов ShellExecute(), и было определено, что да, при обработке URL-адресов на основе файлов: /// в ShellExecute(), ShellExecute() отключит # и любые данные, которые он найдет после # перед запуском браузера по умолчанию, и отправку на открытую страницу HTML. Позиция MS заключается в том, что они делают это намеренно, чтобы предотвратить инъекции в функцию.

Решение состояло в том, чтобы усилить вызов ShellExecute() путем поиска URL-адреса для #, и если он был найден, мы вручную запустим браузер по умолчанию с 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++ код, но это общий проект работал для нас.