Помогите с ActiveX dll

Тема в разделе "WASM.ZEN", создана пользователем _Sysman_, 21 окт 2005.

  1. _Sysman_

    _Sysman_ Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    50
    Адрес:
    Ukraine
    В общем, размер моей FlashGet-базы перевалил за 40000 записей и начали ощущаться все прелести: база грузиться минут 15 (на P4 3ГГц, 256 Мб RAM), ресурсов жрёт столько, что всё тормозит так, что только один FlashGet и работает :)



    И такая проблема есть во всех менеджерах закачек при огромном количестве записей в базе.



    Решил выйти из положения следующим образом: написать свою программу, которая добавляет нужные ссылки в мою базу, а потом уже из этой базы частями буду брать нужные записи.



    FlashGet для отбора всех ссылок с html страницы использует следующий скрипт:
    Код (Text):
    1.  
    2. <script language="VBScript]
    3. 'Great thanks to Vladimir Romanov(Author of ReGet Pro)
    4.  
    5.     On Error Resume Next
    6.     set JetCarCatch=CreateObject("JetCar.Netscape")
    7.     if err<>0 then
    8.         MsgBox("FlashGet not properly installed!"+ vbCrLf+"Please Install FlashGet again")
    9.     else
    10.         set links = external.menuArguments.document.links
    11.         ReDim params(links.length*2)
    12.         params(0)=external.menuArguments.document.Url
    13.         for i = 0 to links.length-1
    14.             params(i*2+1)=links(i).href
    15.             params(i*2+2)=links(i).innerText   
    16.         next
    17.         JetCarCatch.AddUrlList params
    18.         end if
    19. </script>
    20.  




    Все ссылки помещаются в массив, который передаётся в ActiveX Dll.



    Затруднение вот в чём:

    Какой принцип разработки такой ActiveX dll и как узнать(определить) имя, которое можно использовать в скрипте для её вызова.

    FlashGet использует имя "JetCar.Netscape". Откуда он его берёт?

    И как мне прописать имя для своей dll?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    _Sysman_

    А работать с несколькими базами не проще ли?



    По вопросу откуда берёт: прочитай статьи по COM/ActiveX (хотя бы на FirstSteps), яснее станет. А ответ таков: копай в реестре ключики ProgID, CLSID (HCCR): поищи в первом JetCar.Netscape, дальше попадёшь на CLSID, а там и имя длл найдёшь. Но тебе придётся либо перехватывать вызовы сом-методов библиотеки флешгета, либо писать свою альтернативную длл, работающую с флешгетом.
     
  3. _Sysman_

    _Sysman_ Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    50
    Адрес:
    Ukraine
    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. Да, видимо в двух словах никто ничего не объяснит. Начинаю читать Дейла Роджерсона.
     
  4. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    в описание класса MyClass добавь
    Код (Text):
    1.  
    2.     public IObjectSafetyImpl<MyClass, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>,
    3.  
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    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>





    [​IMG] _87712110__activetest.zip
     
  6. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    _Sysman_

    Ты делал дефолтный интерфейс своего класса дуальным?

    По-моему из скрипта можно юзать только dispatch-интерфейсы.