История посещенных url в IE6

Тема в разделе "WASM.WIN32", создана пользователем Nouzui, 14 мар 2007.

  1. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    Вот такой вот код вроде перебирает эти урлы, но выводит в результате только небольшую часть того, что выпадает в списке при наборе в адресной строке. Как просмотреть все записи?

    Код (Text):
    1. #include "stdafx.h"
    2. #include "1.h"
    3. #include <fstream>
    4. #include <objbase.h>
    5. #include <comdef.h>
    6. #include <shlguid.h>
    7. #include <urlhist.h>
    8.  
    9. using namespace std;
    10.  
    11. #pragma comment(lib, "ole32")
    12.  
    13. _COM_SMARTPTR_TYPEDEF(IUrlHistoryStg, __uuidof(IUrlHistoryStg));
    14. _COM_SMARTPTR_TYPEDEF(IEnumSTATURL, __uuidof(IEnumSTATURL));
    15.  
    16. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    17. {
    18.     // TODO: Place code here.
    19.  
    20.     STATURL stStatUrl= {sizeof(stStatUrl)};
    21.     IUrlHistoryStgPtr pUrlHistory= NULL;
    22.     IEnumSTATURLPtr pUrlEnum= NULL;
    23.     wfstream f;
    24.     ULONG uFetched;
    25.  
    26.     try
    27.     {
    28.         if(!lpCmdLine[0])
    29.         {
    30.             MessageBox(NULL, "geturlhistory.exe <output file name>", "Synthax:", 0);
    31.             return 0;
    32.         }
    33.  
    34.         CoInitialize(NULL);
    35.  
    36.         f.open(lpCmdLine, ios_base::out | ios_base::trunc);
    37.         if(!f)
    38.         {
    39.             MessageBox(NULL, lpCmdLine, "Cannot create output file", 0);
    40.             return 0;
    41.         }
    42.  
    43.         pUrlHistory.CreateInstance(CLSID_CUrlHistory);
    44.         if(!pUrlHistory.operator bool())
    45.         {
    46.             MessageBox(NULL, "Cannot obtain interface for object", "Error", 0);
    47.             return 0;
    48.         }
    49.  
    50.         if(FAILED(pUrlHistory->EnumUrls(&pUrlEnum)))
    51.         {
    52.             MessageBox(NULL, "Cannot obtain interface for enumeration urls", "Error", 0);
    53.             return 0;
    54.         }
    55.  
    56.         uFetched= 1;
    57.         while(SUCCEEDED(pUrlEnum->Next(1, &stStatUrl, &uFetched)))
    58.         {
    59.             if(!uFetched)
    60.                 break;
    61.  
    62.             f << stStatUrl.pwcsUrl << L"\n";
    63.  
    64.             SysFreeString(stStatUrl.pwcsUrl);
    65.             SysFreeString(stStatUrl.pwcsTitle);
    66.         }
    67.     }
    68.     catch(_com_error e)
    69.     {
    70.         MessageBox(NULL, e.ErrorMessage(), "Error", 0);
    71.     }
    72.     catch(...)
    73.     {
    74.         MessageBox(NULL, "Unknown error", "Error", 0);
    75.     }
    76.  
    77.     return 0;
    78. }
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    можт фильтр по умолчанию остальные не пропускает? попробуй SetFilter заюзать из pUrlEnum
     
  3. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    пробовал..
    pUrlEnum->SetFilter(OLESTR(""), 0); и pUrlEnum->SetFilter(NULL, 0);
    а также pUrlEnum->Reset();
     
  4. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    HKCU\Software\Microsoft\Internet Explorer\TypedURLs - там, AFAIK можно отыскать все URLы
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Nouzui
    Код (Text):
    1. /* проверки для краткости отсутствуют */
    2.  
    3. #define UNICODE
    4. #define _UNICODE
    5.  
    6. #include <shlobj.h>
    7. #include <UrlHist.h>
    8. #include <tchar.h>
    9.  
    10. #pragma comment(linker,"/subsystem:console")
    11. #pragma comment(lib, "ole32.lib")
    12. #pragma comment(lib, "OleAut32.Lib")
    13.  
    14. void wmain(void)
    15. {
    16.   CoInitialize( NULL );
    17.  
    18.   IUrlHistoryStg* pUrlHistoryStg = NULL;
    19.   HRESULT hr = CoCreateInstance(CLSID_CUrlHistory,
    20.                  NULL, CLSCTX_INPROC, IID_IUrlHistoryStg,
    21.                  (void**)&pUrlHistoryStg);
    22.  
    23.   IEnumSTATURL* pEnumURL;
    24.   hr = pUrlHistoryStg->EnumUrls(&pEnumURL);
    25.  
    26.   STATURL suURL;
    27.   ULONG pceltFetched;
    28.   suURL.cbSize = sizeof(suURL);
    29.   hr = pEnumURL->Reset();
    30.  
    31.   while(S_OK == (hr = pEnumURL->Next(1, &suURL, &pceltFetched)))
    32.   {
    33.  
    34.     wprintf(L"%s\n", suURL.pwcsUrl);
    35.  
    36.     SysFreeString(suURL.pwcsUrl);
    37.     SysFreeString(suURL.pwcsTitle);
    38.   }
    39.  
    40.   pEnumURL->Release();
    41.   pUrlHistoryStg->Release();
    42.   CoUninitialize();
    43. }
    выдает у меня 1341-ну строчку.

    В указанной 10110111 ветке у меня 25 url'ов. Столько же "выпадает в списке при наборе в адресной строке". Наверное история и список это разные хранилища.
     
  6. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    q_q
    угу.. работает
    хочешь прикол? набери какой-нибудь адрес с исползованием кириллицы (именно в области адреса, а не в параметрах) и сравни результаты до и после
    оказывается, из-за этого и были все проблемы o_O
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Nouzui
    набери какой-нибудь адрес с исползованием кириллицы
    Попробовал - http://www.фывап.org/ - "Невозможно отобразить страницу". Закрыл ie, dial-up. Запустил программу - 1424 строки. У меня wxpsp2ru и ie v6.00.2900.2180 (xpsp_sp2_rtm.040803-2158).
    Что должно было произойти?
     
  8. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    q_q
    да так, ерунда..
    просто у меня код
    Код (Text):
    1. wprintf(L"%s", L"http://www.фывап.org/");
    пишет только http://www.
    а если такая строчка попадет в поток:
    Код (Text):
    1. f << L"http://www.фывап.org/";
    (где f - wfstream), поток вообще перестает передавать данные в файл..

    с printf'ом можно бороться setlocale, а вот с потоком как..
    вот только из-за этого все и было ::