Установите поисковый сервер по умолчанию для IE с помощью IOpenServiceManager :: InstallService - PullRequest
4 голосов
/ 02 марта 2012

Я хотел бы установить поисковую систему по умолчанию для IE с IOpenServiceManager :: InstallService:

  1. Принадлежать ссылке http://www.opensearch.org/Specifications/OpenSearch/1.1#OpenSearch_description_elements. Я создал SearchProviderInfo *.xml вот так:

    &#60;?xml version="1.0" encoding="UTF-8"?&#62;<br /> &#60;OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"&#62;<br />   &#60;ShortName&#62;Web Search&#60;/ShortName&#62;<br />   &#60;Description&#62;Use Example.com to search the Web.&#60;/Description&#62;<br />   &#60;Tags&#62;example web&#60;/Tags&#62;<br />   &#60;Contact&#62;admin@example.com&#60;/Contact&#62;<br />   &#60;Url type="application/atom+xml"<br />        template="http://example.com/?q={searchTerms}&pw={startPage?}&format=atom"/&#62;<br />   &#60;Url type="application/rss+xml"<br />        template="http://example.com/?q={searchTerms}&pw={startPage?}&format=rss"/&#62;<br />   &#60;Url type="text/html" <br />        template="http://example.com/?q={searchTerms}&pw={startPage?}"/&#62;<br />   &#60;LongName&#62;Example.com Web Search&#60;/LongName&#62;<br />   &#60;Image height="64" width="64" type="image/png"&#62;http://example.com/websearch.png&#60;/Image&#62;<br />   &#60;Image height="16" width="16" type="image/vnd.microsoft.icon"&#62;http://example.com/websearch.ico&#60;/Image&#62;<br />   &#60;Query role="example" searchTerms="cat" /&#62;<br />   &#60;Developer&#62;Example.com Development Team&#60;/Developer&#62;<br />   &#60;Attribution&#62;<br />     Search data Copyright 2005, Example.com, Inc., All Rights Reserved<br />   &#60;/Attribution&#62;<br />   &#60;SyndicationRight&#62;open&#60;/SyndicationRight&#62;<br />   &#60;AdultContent&#62;false&#60;/AdultContent&#62;<br />   &#60;Language&#62;en-us&#60;/Language&#62;<br />   &#60;OutputEncoding&#62;UTF-8&#60;/OutputEncoding&#62;<br />   &#60;InputEncoding&#62;UTF-8&#60;/InputEncoding&#62;<br /> &#60;/OpenSearchDescription&#62;<br />
  2. Принадлежу ссылке http://msdn.microsoft.com/en-us/library/cc849088%28v=vs.85%29.aspx. Я создаю проект "SetDefaultHelper" примерно так:

        #include &#60;windows.h&#62;
        #include &#60;atlbase.h&#62;
        #include &#60;wininet.h&#62;
        #include &#60;urlmon.h&#62;
        #include &#60;string&#62;
        #include "openservice.h"    
        #pragma comment(lib, "urlmon.lib")
    
    void DisplayUsage()
    {
        wprintf(L"\r\nSetDefaultHelper.exe -- Call SetDefault API on a search provider");
        wprintf(L"\r\n");
        wprintf(L"\r\nUSAGE: SetDefaultHelper.exe &#60;option&#62;");
        wprintf(L"\r\n");
        wprintf(L"\r\nOptions (these are mutually exclusive!):");
        wprintf(L"\r\n");
        wprintf(L"\r\n    /guid &#60;guid&#62;      GUID of an installed search provider");
        wprintf(L"\r\n    /url &#60;url&#62;        URL of an OpenSearch Description file");
        wprintf(L"\r\n");
    }
    
    int __cdecl wmain(__in int argc, __in_ecount(argc) WCHAR* argv[])
    {
        HRESULT hr = E_FAIL;
        BOOL fComInitialized = FALSE;    
        if (3 != argc)
        { 
            DisplayUsage();
        }
        else if (SUCCEEDED(CoInitialize(NULL)))
        {
            fComInitialized = TRUE;
            CComPtr&#60;IOpenServiceManager&#62; spManager;
            hr = spManager.CoCreateInstance(CLSID_OpenServiceManager);    
            if (SUCCEEDED(hr))
            {
                CComPtr&#60;IOpenService&#62; spService;    
                if (0 == _wcsicmp(argv[1], L"/guid"))
                {
                    // Get an IOpenService pointer from the GUID.
                    WCHAR szEscaped[INTERNET_MAX_URL_LENGTH] = L"";
                    DWORD cchEscaped = ARRAYSIZE(szEscaped);
                    hr = UrlEscape(argv[2], szEscaped, &cchEscaped, URL_ESCAPE_SEGMENT_ONLY);    
                    if (SUCCEEDED(hr))
                    {                        
                        std::wstring wsOsid(L"x-osid:1:search:");
                        wsOsid += szEscaped;
                        hr = spManager-&#62;GetServiceByID(wsOsid.c_str(), &spService);
                    }  
                }
                else if (0 == _wcsicmp(argv[1], L"/url"))
                {
                    // Install the provider to get an IOpenService pointer.
                    //CComPtr&#60;IUri&#62; spUri;
                    //hr = CreateUri(argv[2], 0, 0, &spUri);
                    //if (SUCCEEDED(hr))
                    //{
                        hr = spManager-&#62;InstallService(argv[2], &spService);
                    //}
                }
                else
                {
                    DisplayUsage();
                    hr = E_FAIL;
                }
    
    <pre><code>        if (SUCCEEDED(hr))
            {
                hr = spService-&#62;SetDefault(TRUE, NULL);
            }
        }
    }  
    
    if (fComInitialized)
    {
        CoUninitialize();
    }
    
    return hr;
    </code>
    }
  3. Я строю проект нормально.Оба файла SetDefaultHelper.exe и SearchProviderInfo.xml находятся в одной папке.В настройках проекта выберите «Свойства конфигурации»> «Отладка»> «Аргументы команд» = / url absolutePaht / searchProvider.xml .Затем запустите отладку (F10) в строке «hr = CreateUri (argv [2], 0, 0, & spUri);», rusult hr настолько странный.Я не знаю почему.Вы можете мне помочь?

Большое спасибо.

[Решено]:1. Не нужно CreateUri // прокомментировал2. Используйте абсолютный путь.

1 Ответ

3 голосов
/ 12 апреля 2012

Используйте абсолютный путь и UrlCreateFromPath для создания file:/// подобного URL-адреса, передайте этот URL-адрес InstallService.

Между тем, кажется, что ваш XML содержит ошибку.

            WCHAR szURL[MAX_PATH] = L"";
            DWORD cchURL = ARRAYSIZE(szURL);
            hr = ::UrlCreateFromPath(argv[2], szURL, &cchURL, 0);
            if (SUCCEEDED(hr))
            {
                hr = spManager->InstallService(argv[2], &spService);

                // Now we can set it as the default.
                if (SUCCEEDED(hr))
                {
                    hr = spService->SetDefault(TRUE, NULL);
                    if (hr == OS_E_CANCELLED)
                    {
                        hr = E_ACCESSDENIED;  // by the user!
                    }
                }
            }
...