В общем, размер моей FlashGet-базы перевалил за 40000 записей и начали ощущаться все прелести: база грузиться минут 15 (на P4 3ГГц, 256 Мб RAM), ресурсов жрёт столько, что всё тормозит так, что только один FlashGet и работает И такая проблема есть во всех менеджерах закачек при огромном количестве записей в базе. Решил выйти из положения следующим образом: написать свою программу, которая добавляет нужные ссылки в мою базу, а потом уже из этой базы частями буду брать нужные записи. FlashGet для отбора всех ссылок с html страницы использует следующий скрипт: Код (Text): <script language="VBScript] 'Great thanks to Vladimir Romanov(Author of ReGet Pro) On Error Resume Next set JetCarCatch=CreateObject("JetCar.Netscape") if err<>0 then MsgBox("FlashGet not properly installed!"+ vbCrLf+"Please Install FlashGet again") else set links = external.menuArguments.document.links ReDim params(links.length*2) params(0)=external.menuArguments.document.Url for i = 0 to links.length-1 params(i*2+1)=links(i).href params(i*2+2)=links(i).innerText next JetCarCatch.AddUrlList params end if </script> Все ссылки помещаются в массив, который передаётся в ActiveX Dll. Затруднение вот в чём: Какой принцип разработки такой ActiveX dll и как узнать(определить) имя, которое можно использовать в скрипте для её вызова. FlashGet использует имя "JetCar.Netscape". Откуда он его берёт? И как мне прописать имя для своей dll?
_Sysman_ А работать с несколькими базами не проще ли? По вопросу откуда берёт: прочитай статьи по COM/ActiveX (хотя бы на FirstSteps), яснее станет. А ответ таков: копай в реестре ключики ProgID, CLSID (HCCR): поищи в первом JetCar.Netscape, дальше попадёшь на CLSID, а там и имя длл найдёшь. Но тебе придётся либо перехватывать вызовы сом-методов библиотеки флешгета, либо писать свою альтернативную длл, работающую с флешгетом.
IceStudent А как быть с повторяющимися записями? Это главный повод написания своей dll. Скажем, в каждой базе по нескольку сотен повторяющихся записей, причём дубликат записи может быть внесен намного позже занесения оригинала и отследить его в разных базах будет проблематично. Другое дело, если бы менеджер закачек работал с несколькими базами и проверял на наличие копий в каждой из баз. Вообще откуда и из-за чего берутся тормоза? Из-за того, что все 40000 записей во FlashGet'e грузятся в List и само-собой занимают соответствующий размер в памяти. Поэтому и решено было сделать альтернативную базу, кол-во записей остаётся таким же, но из-за того, что все записи никуда не выводятся, освобождается память. Это недоработка во всех download-менеджерах. Можно для случая большого количества записей сделать, скажем, страничный просмотр, когда на одну страницу загружалось, допустим, 1000 записей, а для просмотра следующих 1000 записей выбрать следующую страницу и т. д. Но ни в одном download-менеджере так сделать ещё не додумались. Да, придётся писать Dll, но зачем ей работать с FlashGet'ом, когда она будет писать в другую базу (скажем, на основе Jet). Не получается вот что: я сделал свою ActiveX Dll, в которой реализован один метод, скажем show, который выводит MessageBox (для проверки). Dll разрабатывалась в Visual Studio. Имя класса - MyClass, имя проекта - MyProject. После регистрации DLL в реестре появилась запись "MyProject.MyClass" и соответствующий CLSID. Попытка вставить эту запись в скрипт (set MyObj=CreateObject("MyProject.MyClass"), а потом вызвать в скрипте метод show (MyObj.show) ничего не дала. Собственно вопрос такой: Какое имя нужно прописывать в скрипте и как его найти? P. S. Да, видимо в двух словах никто ничего не объяснит. Начинаю читать Дейла Роджерсона.
в описание класса MyClass добавь Код (Text): public IObjectSafetyImpl<MyClass, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>,
infern0 Это на заключительном этапе, чтобы IE не ругался на неподписанные скрипты. _Sysman_ В студии можно сделать сразу рабочий ActiveX (напр., 7.1): <ol type=1> <li>File -> New -> Project -> Visual C++ Projects -> ATL -> ATL Project <li>Project -> Add class -> ATL -> ATL Simple Object, в открывшемся окошке сразу видно, какой будет ProgID. <li>Потом ClassView -> IMyClass -> Add -> Add Method. Параметры метода делаешь как и у сом-класса FlashGet (смотришь какой-нить утилитой, PExplorer или OleView) <li>После создаёшь тестовую страницу и тестируешь (можно запускать для отладки процесс IE и спокойно отлаживать свою длл. </ol> _87712110__activetest.zip
_Sysman_ Ты делал дефолтный интерфейс своего класса дуальным? По-моему из скрипта можно юзать только dispatch-интерфейсы.