Вот такой вот код вроде перебирает эти урлы, но выводит в результате только небольшую часть того, что выпадает в списке при наборе в адресной строке. Как просмотреть все записи? Код (Text): #include "stdafx.h" #include "1.h" #include <fstream> #include <objbase.h> #include <comdef.h> #include <shlguid.h> #include <urlhist.h> using namespace std; #pragma comment(lib, "ole32") _COM_SMARTPTR_TYPEDEF(IUrlHistoryStg, __uuidof(IUrlHistoryStg)); _COM_SMARTPTR_TYPEDEF(IEnumSTATURL, __uuidof(IEnumSTATURL)); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. STATURL stStatUrl= {sizeof(stStatUrl)}; IUrlHistoryStgPtr pUrlHistory= NULL; IEnumSTATURLPtr pUrlEnum= NULL; wfstream f; ULONG uFetched; try { if(!lpCmdLine[0]) { MessageBox(NULL, "geturlhistory.exe <output file name>", "Synthax:", 0); return 0; } CoInitialize(NULL); f.open(lpCmdLine, ios_base::out | ios_base::trunc); if(!f) { MessageBox(NULL, lpCmdLine, "Cannot create output file", 0); return 0; } pUrlHistory.CreateInstance(CLSID_CUrlHistory); if(!pUrlHistory.operator bool()) { MessageBox(NULL, "Cannot obtain interface for object", "Error", 0); return 0; } if(FAILED(pUrlHistory->EnumUrls(&pUrlEnum))) { MessageBox(NULL, "Cannot obtain interface for enumeration urls", "Error", 0); return 0; } uFetched= 1; while(SUCCEEDED(pUrlEnum->Next(1, &stStatUrl, &uFetched))) { if(!uFetched) break; f << stStatUrl.pwcsUrl << L"\n"; SysFreeString(stStatUrl.pwcsUrl); SysFreeString(stStatUrl.pwcsTitle); } } catch(_com_error e) { MessageBox(NULL, e.ErrorMessage(), "Error", 0); } catch(...) { MessageBox(NULL, "Unknown error", "Error", 0); } return 0; }
пробовал.. pUrlEnum->SetFilter(OLESTR(""), 0); и pUrlEnum->SetFilter(NULL, 0); а также pUrlEnum->Reset();
Nouzui Код (Text): /* проверки для краткости отсутствуют */ #define UNICODE #define _UNICODE #include <shlobj.h> #include <UrlHist.h> #include <tchar.h> #pragma comment(linker,"/subsystem:console") #pragma comment(lib, "ole32.lib") #pragma comment(lib, "OleAut32.Lib") void wmain(void) { CoInitialize( NULL ); IUrlHistoryStg* pUrlHistoryStg = NULL; HRESULT hr = CoCreateInstance(CLSID_CUrlHistory, NULL, CLSCTX_INPROC, IID_IUrlHistoryStg, (void**)&pUrlHistoryStg); IEnumSTATURL* pEnumURL; hr = pUrlHistoryStg->EnumUrls(&pEnumURL); STATURL suURL; ULONG pceltFetched; suURL.cbSize = sizeof(suURL); hr = pEnumURL->Reset(); while(S_OK == (hr = pEnumURL->Next(1, &suURL, &pceltFetched))) { wprintf(L"%s\n", suURL.pwcsUrl); SysFreeString(suURL.pwcsUrl); SysFreeString(suURL.pwcsTitle); } pEnumURL->Release(); pUrlHistoryStg->Release(); CoUninitialize(); } выдает у меня 1341-ну строчку. В указанной 10110111 ветке у меня 25 url'ов. Столько же "выпадает в списке при наборе в адресной строке". Наверное история и список это разные хранилища.
q_q угу.. работает хочешь прикол? набери какой-нибудь адрес с исползованием кириллицы (именно в области адреса, а не в параметрах) и сравни результаты до и после оказывается, из-за этого и были все проблемы o_O
Nouzui набери какой-нибудь адрес с исползованием кириллицы Попробовал - http://www.фывап.org/ - "Невозможно отобразить страницу". Закрыл ie, dial-up. Запустил программу - 1424 строки. У меня wxpsp2ru и ie v6.00.2900.2180 (xpsp_sp2_rtm.040803-2158). Что должно было произойти?
q_q да так, ерунда.. просто у меня код Код (Text): wprintf(L"%s", L"http://www.фывап.org/"); пишет только http://www. а если такая строчка попадет в поток: Код (Text): f << L"http://www.фывап.org/"; (где f - wfstream), поток вообще перестает передавать данные в файл.. с printf'ом можно бороться setlocale, а вот с потоком как.. вот только из-за этого все и было ::