Плагин для Download Master

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Плагин для Download Master

Сообщение Qwertiy » 22.12.2012 (Сб) 17:37

Собственно, пытаюсь сделать. Не получается. Судя по MsgBox'у выполняется только RegisterPlugIn, потом плагина в списке нет.

DM Plugin Test.7z
Что сделал
(10.39 Кб) Скачиваний: 182

Информация:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Плагин для Download Master

Сообщение Хакер » 22.12.2012 (Сб) 19:05

PKUNZIP.ZIP
Если хочешь поскорее получить ответ, используй архиватор, архив которого сможет без проблем открыть большинство людей без установки стороннего софта.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.12.2012 (Сб) 19:25

Хакер писал(а):Если хочешь поскорее получить ответ, используй архиватор, архив которого сможет без проблем открыть большинство людей без установки стороннего софта.

С каких пор программисты не могут открыть 7z? Это самый популярный архиватор сейчас. И с лучшей степенью сжатия.
А большинство людей меня сейчас не очень интересует. Большинство любит использовать, а не делать :D

DM Plugin Test.zip
Держи
(14.4 Кб) Скачиваний: 164

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Плагин для Download Master

Сообщение Хакер » 22.12.2012 (Сб) 19:30

Qwertiy писал(а):Это самый популярный архиватор сейчас.

Ага. А самая популярная музыка сейчас — Gangnam Style.
Всегда ненавидел моду.
____________________

О, так тут ещё и FNDLL.
Какую версию нужно DM нужно поставить, чтобы протестировать?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.12.2012 (Сб) 19:33

Хакер писал(а):Всегда ненавидел моду.

При чём тут мода, он объективно лучший. Или можешь назвать лучше?

Хакер писал(а):Какую версию нужно DM нужно поставить, чтобы протестировать?

У меня последняя, 5.14.1.1327. Но думаю, в других будет так же.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Плагин для Download Master

Сообщение Хакер » 22.12.2012 (Сб) 20:04

Поставил, но зря. Решил посмотреть код.

В общем, было крайне наивно и бесполезно создавать класс с именем «IDMPlugin», да ещё и помещать в него комментарий:
'{959CD0D3-83FD-40F7-A75A-E5C6500B58DF}
VB IDE вообще нет никакого дела до этого комментария. Это просто комментарий, и тот факт, указан ли там какой-то UUID или же там будет написано про настроение слона в зоопарке — ничего не решает.

Чтобы класс TestPlugin
поддерживал интерфейс IDMPlugin, и все понимали, что это действительно тот самый IDMPlugin, а не какой-то твой собственный с похожим именем и похожим набором методов, IID этого интерфейса должен совпадать с IID-ом реального IDMPlugin (с тем, что указан в комментарии). И поскольку VB не позволяет тебе указать, какой IID будет иметь сопряжённый с классом интерфейс, то интерфейс IDMPlugin ты должен объявить в TLB. Хотя, я так полагаю, существует какой-то примитивный эддин к VB, который подменяет IID-ы интерфейсов, и возможно комментарий сделан именно для такого эддина, но такого эддина у тебя нет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.12.2012 (Сб) 20:11

Хакер писал(а):VB IDE вообще нет никакого дела до этого комментария.

Я поместил комментарий скорее для себя. Вначале думал, чот есть какое-то ключевое слово, но ничего не нашёл. Потом вспомнил, что плагин на Си++ вообще никакого интерфейса не использует, поэтому решил, что дело не в этом.

Хакер писал(а):и возможно комментарий сделан именно для такого эддина, но такого эддина у тебя нет.

Нет, здесь всё сделано мною. Сначала интерфейса вообще не было, потом добавил, но guid присобачить не смог.

Хакер писал(а):интерфейс IDMPlugin ты должен объявить в TLB

Как это сделать? :oops:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Плагин для Download Master

Сообщение Хакер » 22.12.2012 (Сб) 21:28

Qwertiy писал(а):Как это сделать? :oops:

Ты меня запутал.

Для того, чтобы это сделать, надо либо найти готовую TLB-шку с описанием этого интерфейса, либо сделать свою.
Выбираем второй путь. Где взять оригинальное описание интерфейса? Я хотел взять его у тебя, но мне влом конвертировать его из VB в IDL. Я решил посмотреть, что С/С++ проектах оно должно быть. Ради этого мне пришлось скачать 7-Zip (софтина оказалась мерзостью — ни ресширение не проассоциировалось, ни копи-паст из окна в проводник не реализован), чтобы распаковать твой архив с сишными примерами.

Распокавал. Открываю IDMInterface.h, и вот тебе на, в нём описание IDMInterface с одним единственным методом DoAction. А у тебя в интерфейсе куча методов? Кому верить? Офицальную спецификацию интерфейса не могу найти вообще.

Но по крайней мере я нахожу вот это: http://www.delphimaster.ru/cgi-bin/foru ... 532021&n=8

Оказывается интерфейса два: IDMInterface и IDMPlugIn.
Ладно, что делать, будем сдирать объявление интерфейса в Delphi-кода.

Кстати, ридми говорит, что IDMInterface реализуется хостом, и предоставляется плагину, а IDMPlugIn, стало быть, должен реализовывать плагин, и предоставлять хосту.

Ладно.
Калькируем описание интерфейсов с дельфийского кода:
Код: Выделить всё
[uuid(B412B405-0578-4B99-BB06-368CDA0B2F8C), helpstring("This interface is implemented by DownloadMaster and is provided to plugins to control host application.")]
interface IDMInterface:IUnknown
{
   HRESULT DoAction([in]BSTR sAction, [in]BSTR sParams);
}


И следующий интерфейс:
Код: Выделить всё
[uuid(959CD0D3-83FD-40F7-A75A-E5C6500B58DF), helpstring("Should be implemented by plugin and passed to host application.")]
interface IDMPlugIn:IUnknown
{
   [propget] HRESULT PluginName( [out, retval] BSTR* rv);
   [propget] HRESULT Version(    [out, retval] BSTR* rv);
   [propget] HRESULT Description([out, retval] BSTR* rv);
   [propget] HRESULT Email(      [out, retval] BSTR* rv);
   [propget] HRESULT HomePage(   [out, retval] BSTR* rv);
   [propget] HRESULT Copyright(  [out, retval] BSTR* rv);
   [propget] HRESULT MinHostVers([out, retval] BSTR* rv);      

   [propputref] HRESULT HostApp([in]IDMInterface* refDownloadMaster);
   HRESULT Configure([in]BSTR sParams);
   HRESULT BeforeUnloadNotify();

   HRESULT EventRaised([in]BSTR sEventType, [in]BSTR sEventData, [out, retval]BSTR *result);

   [propget] HRESULT Identifier([out, retval] BSTR* rv);   
         
}

Обрати внимание, что тут я проявил иницативу и функции превратил в read-only свойства, и переименовал некоторые члены на свой вкус.

Пишим компилирующий батник:
midl idmpl_iface.idl /win32 /tlb download-master.tlb

Компилируем. Скомпилировалось.

Идём в твой проект, выкидываем ненужный модуль класса.
Подключаем в Reference-ах нашу новую TLB-шку.

Реализую. Теперь надо скомпилировать, у меня не установлен FNDLL. Нашёл в папке в проектом какой-то дистрибутив и установил. Здесь проблема в том, что есть две версии FNDLL. В одной из них есть утечка памяти, и за счёт неё контекст живёт вечно, и плагин скорее всего будет работать. В другой же утечка устранена, но контекст сразу же умирает, и плагин скорее всего не будет работать.

Я наверное установил вторую, потому что плагин так и не попадает в список.

Держи проект, а я сейчас попытаюсь разобраться с FNDLL.
Вложения
DM Plugin Test 2.zip
(15.27 Кб) Скачиваний: 154
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.12.2012 (Сб) 21:58

Хакер писал(а):Ради этого мне пришлось скачать 7-Zip (софтина оказалась мерзостью — ни ресширение не проассоциировалось, ни копи-паст из окна в проводник не реализован), чтобы распаковать твой архив с сишными примерами.

Это очень странно. Ассоциации тоже должны создаваться, но если их всё-таки нет, то через настройки можно включить. Копипаст drag-n-drop'ом всегда работал.

Хакер писал(а):Распокавал. Открываю IDMInterface.h, и вот тебе на ...

Если честно, я вообще весьма смутно понимаю, как работает тот код на Си++. Изначальный пример не мой.
Я правильно понимаю, что оригинальные интерфейсы там вообще не используются?

Хакер писал(а):Офицальную спецификацию интерфейса не могу найти вообще.
Но по крайней мере я нахожу вот это: http://www.delphimaster.ru/cgi-bin/foru ... 532021&n=8

В примере на делфи такой код как раз и есть. Надо было его брать за основу, т. к. он от разработчиков DM.
А ещё, у Description'а у тебя строковый параметр пропал.

Хакер писал(а):Кстати, ридми говорит, что IDMInterface реализуется хостом, и предоставляется плагину, а IDMPlugIn, стало быть, должен реализовывать плагин, и предоставлять хосту.

Ну у меня так и есть, если не считать, что вместо IDMInterface я поставил Object...

Хакер писал(а):Обрати внимание, что тут я проявил иницативу и функции превратил в read-only свойства, и переименовал некоторые члены на свой вкус.

А почему это допустимо? Или важен порядок функций?

Хакер писал(а):Пишим компилирующий батник:
midl idmpl_iface.idl /win32 /tlb download-master.tlb
Компилируем. Скомпилировалось.

У кого как...
cl error.png
Что с этим делать?
cl error.png (13.28 Кб) Просмотров: 7878
Последний раз редактировалось Qwertiy 22.12.2012 (Сб) 22:01, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Плагин для Download Master

Сообщение Хакер » 22.12.2012 (Сб) 22:00

Qwertiy писал(а):У кого как...

Кривая установка или что-то вроде того.
В любом случае, зачем тебе оно? У моём архиве есть готовая скомпилированная TLB-шка.

Qwertiy писал(а):А почему это допустимо? Или важен порядок функций?

При раннем связывании, которое в данном случае используется — только имеет значение только индекс метода. Когда нужно вызвать 13-ый метод, адрес берётся из 13-ой ячейки и делается вызов. Об имени метода ни одна инструкция даже не задумывается.

Ну у меня так и есть, если не считать, что вместо IDMInterface я поставил Object...

Это ни в коем случае недопустимо.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.12.2012 (Сб) 22:02

Пока дописал, ты уже ответил...
Qwertiy писал(а):А ещё, у Description'а у тебя строковый параметр пропал.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.12.2012 (Сб) 22:16

А почему от функции getID остаётся только свойство, а самой функции нет?
И в чём идея использовать свойства вместо функций? Вообще, какая между ними разница?

Хакер писал(а):Это ни в коем случае недопустимо.

Почему?

Хакер писал(а):Кривая установка или что-то вроде того.

VS6 или можно что-то поменьше переустановить?

PS: Всё-таки любишь ты в моём нике буквы переставлять :twisted:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Плагин для Download Master

Сообщение Хакер » 22.12.2012 (Сб) 22:26

Qwertiy писал(а):А почему от функции getID остаётся только свойство, а самой функции нет?

Как это понять? Любой свойство компилируется в пару функций getProp и putProp. Для read-only свойства получается только первая функция. Так что была функция getId, а стало read-only свойство, оборачивающееся одной процедурой.

Qwertiy писал(а):И в чём идея использовать свойства вместо функций? Вообще, какая между ними разница?

Стиль.

Qwertiy писал(а):Почему?

Потому что x As Object это всё равно что x As IDispatch, с той лиш разницей, что x.Boom компилируется в пару вызовов

Код: Выделить всё
disp_id=x.GetIDsOfNames("Boom")
x.Invoke(disp_id)


IDispatch унаследован от IUnknown.
IDMInterface не унаследован IDispatch, он унаследован непосредственно от IUnknown.

Получается для совершенно несовместимых интерфейсных типа. У них один общий предок, но они разные в том плане, что один не является предком другого.

Qwertiy писал(а):VS6 или можно что-то поменьше переустановить?

VB6 вообще не причём.
MIDL-а. MIDL может быть или в составе Visual C++, либо в составе Platform SDK. Откуда он у тебя, я не знаю. Вполне возможно, что у тебя там каша из кучи установленных друг поверх друга MIDL-ов :) Но ты подожди, я выложу правильную исправленную TLB-шку.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.12.2012 (Сб) 22:32

Хакер писал(а):Как это понять? Любой свойство компилируется в пару функций getProp и putProp. Для read-only свойства получается только первая функция. Так что была функция getId, а стало read-only свойство, оборачивающееся одной процедурой.

Я смотрю описание интерфейса на Делфи:
Код: Выделить всё
  IDMPlugIn = interface(IUnknown)
  ['{959CD0D3-83FD-40F7-A75A-E5C6500B58DF}']
    function getID: WideString; stdcall; // <----------------------------- Функция в первой позиции
    //-----info
    function GetName: WideString; stdcall;//получаем инфу о плагине
    function GetVersion: WideString; stdcall;//получаем инфу о плагине
    function GetDescription(language: WideString): WideString; stdcall;//получаем инфу о плагине
    function GetEmail: WideString; stdcall;//получаем инфу о плагине
    function GetHomepage: WideString; stdcall;//получаем инфу о плагине
    function GetCopyright: WideString; stdcall;//получаем инфу о плагине
    function GetMinAppVersion: WideString; stdcall;//получаем минимальную версию ДМ-а с которой может работать плагин

    //------
    procedure PluginInit(_IDmInterface: IDmInterface); stdcall;//инициализация плагина и передача интерфейса для доступа к ДМ
    procedure PluginConfigure(params: WideString); stdcall;//вызов окна конфигурации плагина
    procedure BeforeUnload; stdcall;

    function EventRaised(eventType: WideString; eventData: WideString): WideString; stdcall;//вызывается из ДМ-ма при возникновении какого либо события
    { идентификатор плагина }
    property ID: WideString read getID; // <----------------------------- Свойство в последней позиции
  end;
У тебя осталось только свойство в последней.

Хакер писал(а):VB6 вообще не причём.

Я написал VS, а не VB.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Плагин для Download Master

Сообщение Хакер » 22.12.2012 (Сб) 23:11

Qwertiy писал(а):У тебя осталось только свойство в последней.

Это какие-то дельфийские прибамбасы, которые меня запутали. Похоже действительно get-процедура свойства должна быть первой в интерфейсе.

Ладно. Я поменял порядок следования членов в определении интерфейса. Я даже нашёл в FNDLL то спорное место, и стал в каждой библиотеки править 3 байта, чтобы возникала утечка памяти, но библиотека была заведомо работающей.

Но всё равно библиотека не появляется в списке.

И тогда я стал смотреть под отладчиком, что происходит. Так вот получается, что хост вообще не делает ни одного объектного вызова в сторону нашего объекта, реализующего интерфейс IDMPlugIn. Вообще ни одного, понимаешь?

Значит какие-то ещё требования не выполнены.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.12.2012 (Сб) 23:20

Хакер писал(а):Вообще ни одного, понимаешь? Значит какие-то ещё требования не выполнены.

Но ведь он создаёт объект, значит он ему чем-то не нравится... Какие есть варианты?
Что насчёт того, что возвращаемое значение пишется вместо this? Tlb это учитывает?
А ты что-нибудь с уже имеющимися плагинами делать не пробовал?

Хакер писал(а):Это какие-то дельфийские прибамбасы, которые меня запутали. Похоже действительно get-процедура свойства должна быть первой в интерфейсе.

А может, их должно быть две?

PS: Всё-таки, как работает сишный код без этих интерфейсов?
Последний раз редактировалось Qwertiy 22.12.2012 (Сб) 23:24, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Плагин для Download Master

Сообщение Хакер » 22.12.2012 (Сб) 23:24

Qwertiy писал(а):Но ведь он создаёт объект, значит он ему чем-то не нравится... Какие есть варианты?
А ты что-нибудь с уже имеющимися плагинами делать не пробовал?

Разобрался. Ты меня сбил :D .

Вместо
Код: Выделить всё
Public Function RegisterPlugIn() As IDMPlugIn
  MsgBox "Это входящий вызов RegisterPlugIn"
  Set RegisterPlugIn= New CTestPlugin
End Sub


Должно быть:
Код: Выделить всё
Public Sub RegisterPlugIn(ByRef ret As IDMPlugIn)
  MsgBox "Это входящий вызов RegisterPlugIn"
  Set ret = New CTestPlugin
End Sub


Qwertiy писал(а):PS: Всё-таки, как работает сишный код без этих интерфейсов?

Никак. С чего ты взял, что сишный код работает без этих интерфейсов?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.12.2012 (Сб) 23:29

Хакер писал(а):Разобрался. Ты меня сбил :D . Вместо ... Должно быть:

Да, точно, на Си++ так и есть :) Но на делфи не так, а я с него переписывал...

Хакер писал(а):Никак. С чего ты взял, что сишный код работает без этих интерфейсов?

C того, что, во-первых, он работает, а во-вторых, интерфейсов этих я там не вижу :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Плагин для Download Master

Сообщение Хакер » 22.12.2012 (Сб) 23:33

Qwertiy писал(а):а во-вторых, интерфейсов этих я там не вижу :)

Ну, не видишь — это значит всего-лишь не видишь, а не то, что их там нет.

В общем, теперь оно просто «падает» (на самом деле, DM культурно обрабатывает исключение) внутри какого-то вызова. Может быть я опять где-то ошибся в определении интерфейса. Сейчас выясним.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Плагин для Download Master

Сообщение Хакер » 23.12.2012 (Вс) 0:17

Разобрался. В общем, всё плохо. Хотя и не смертельно.

Я не знаю, что там они курили, но DM использует принципы, которые абсолютно противоречат COM. Соответственнл, интерфейс, который ожидает DM — это вообще не истинный COM-интерфейс.

Потому что в COM принято такое соглашение о вызове, что первым неявным параметров передаётся this (me), потом все реальные аргументы, и потом (опционально) ссылочный аргумент, через который возвращается значение.

Но здесь всё наоборот, аргументы переставлены местами!

Сначала, когда я увидел свидетельства в пользу этого в отладчике — я подумал, что я где-то сильно ошибаюсь. Но тогда я глянул в сишный код и увидел подтверждение:
Код: Выделить всё
  virtual HRESULT STDMETHODCALLTYPE getID_           (/*Result BSTR* this, */ DMPluginBase* This)
  {
    T* this_ = static_cast<T*>(This);
    BSTR* pResult = reinterpret_cast<BSTR*>(this);

Обрати внимание на этот «странный код».

Тут функция getID_ принимает один аргумент — и это This, указатель на DMPluginBase. В то же время поскольку это виртуальная функция класса, в пространстве имён функции мы должны видеть переменную this (не путать с This), в которой был бы указатель на текущий объект. Но так оказывается, что this там содержит не указатель на текущий объект, а указатель на BSTR!

Это несусветная чушь с точки зрения COM и это абсолютно COM-несовместимо.

Так это это нельзя решить с помощью классов, интерфейсов и Implements.

Но можно решить, применив обёртку.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.12.2012 (Вс) 0:23

Хакер писал(а):Я не знаю, что там они курили, но DM использует принципы, которые абсолютно противоречат COM.

В данном случае под DM ты имеешь в виду делфи?

Хакер писал(а):Обрати внимание на этот «странный код».

Я это ещё с того раза запомнил, когда разбирался с сишным плагином. Оно там где-то даже написано было... А может не там, а на форуме.
Кстати, я недавно упоминал это:
Qwertiy писал(а):Но ведь он создаёт объект, значит он ему чем-то не нравится... Какие есть варианты?
Что насчёт того, что возвращаемое значение пишется вместо this? Tlb это учитывает?
А ты что-нибудь с уже имеющимися плагинами делать не пробовал?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Плагин для Download Master

Сообщение Хакер » 23.12.2012 (Вс) 0:38

Qwertiy писал(а): данном случае под DM ты имеешь в виду делфи?

Под DM имеется в виду Download Master. На чём он написан — вопрос второй.

Qwertiy писал(а):Но ведь он создаёт объект, значит он ему чем-то не нравится... Какие есть варианты?

Да по этому пункту мы разобрались. Твоя функция RegisterPlugin была неправильной. Она возвращала ссылку на созданный экземпляр твоего класса. А все остальные плагины возвращали 0, а ссылку на экземпляр класса возвращали через ссылочный аргумент. После того, как я это учёл, DownloadMaster стал делать вызовы к членам твоего класса. До этого не делал. Но внутри методов оно падает. Потому что уже сказал почему: если COM-метод принимает один единственный аргумент — число 123, то передано будет два аргумента — указатель this и число 5. И реализация VB-шного метода ждёт этого. Но DM передаёт сначала число 5, потом указатель this.

Что насчёт того, что возвращаемое значение пишется вместо this? Tlb это учитывает?

TLB не может учитывать того, что в корне противоречит базовому принципу COM.
При совершении объектных методов первым неявным аргументом всегда передаётся ссылка на объект, метод которого вызывается.

Но если говорить о DM, то ссылка на объект, метод которого вызывается, не передётся первым аргументом никогда.

А ты что-нибудь с уже имеющимися плагинами делать не пробовал?

Зачем мне с ними что-то вообще делать?

После того, как стало ясно, что без изврата плагин для DM не написать на на VB6, ни на дотнете, ни на С++ с применением ATL, ни на любом другом средстве для создания COM-классов.

Я просто сейчас покажу тебе пример с переходниками. Дальше думай сам.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.12.2012 (Вс) 0:51

Хакер писал(а):Под DM имеется в виду Download Master. На чём он написан — вопрос второй.

Я имел в виду, что вероятно, все программы на делфи так поступают, иначе это было бы весьма странно.
Смахивает на декларацию pascal и cdecl. Насколько я помню, для pascal аргументы передаются от первого к последнему, а для cdecl - наоборот.

PS: Я процитировал все 3 строчки, чтобы было поенятно, где я об этом писал.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Плагин для Download Master

Сообщение Хакер » 23.12.2012 (Вс) 0:56

Qwertiy писал(а):Я имел в виду, что вероятно, все программы на делфи так поступают, иначе это было бы весьма странно.

Никогда не интересовался.

Qwertiy писал(а):Смахивает на декларацию pascal и cdecl.

Нет. При cdecl аргументы из стека убирает вызывающая сторона, а здесь расчитано, что это будет делать вызываемая. В остальном cdecl — такой же stdcall. Здесь просто stdcall.

А здесь действительно похоже на pascal, но не совсем — например методе getDescription аргументы в стеке будут идти в таком порядке: retval, this, lang. Почему не retval, lang, this в противоположенность должному this, lang, retval?

К тому же в PluginInit аргументы передаются в правильном порядке. То есть оно вообще не поддаётся никакой логике.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.12.2012 (Вс) 0:57

Хакер писал(а):После того, как стало ясно, что без изврата плагин для DM не написать на на VB6, ни на дотнете, ни на С++ с применением ATL, ни на любом другом средстве для создания COM-классов.

А что мешает сделать так же как в Си, т. е. Sub, а внутри Me привести к указателю на String?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Плагин для Download Master

Сообщение Хакер » 23.12.2012 (Вс) 1:02

Qwertiy писал(а):А что мешает сделать так же как в Си, т. е. Sub, а внутри Me привести к указателю на String?


Не знаю, что ты имел в виду под приведением Me к String, но:
Хакер писал(а):Я просто сейчас покажу тебе пример с переходниками. Дальше думай сам.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.12.2012 (Вс) 1:17

Хакер писал(а):Не знаю, что ты имел в виду под приведением Me к String

Что-нибудь типа Declare Function AsString Lib "msvbvm60.dll" Alias "VarPtr" (ByVal S As IUnknown) As String
Видимо, через tlb, чтобы юникодная строка уцелела.
Ну и вызвать для Me.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Плагин для Download Master

Сообщение Хакер » 23.12.2012 (Вс) 2:00

Что-нибудь типа

Нет, это совершенно не то. Подожди, сейчас я выложу уже.

Кстати, нифига там не pascal. Там просто товарищи из Borland решили, что если метод возвращает значение, то она возвращает его через самый первый параметр (а this сдвигается на второе место). В реальном же COM this всегда на первом месте, а retval — всегда на последнем.

Радуйся:
dm_plugin_success.png
dm_plugin_success.png (30.4 Кб) Просмотров: 7854


Исходники:
newsrc.zip
Исходники работоспособного плагина.
(16.4 Кб) Скачиваний: 172


Собственно, TLB-шка и объявленный в ней интерфейс в текущем варианта вообще не нужны, но оставлены в проекте исходя из позиции «пусть останется». В идале внутри wrapper_QueryInterface надо сделать проверку riid-а (сам аргумент riid переделать в ByRef riid as UUID, пускать только если riid = IID_IUnknown или riid = IID_IDMPlugIn, в остальных случаях отказывать.)

Не знаю, какая у тебя версия FNDLL из двух возможных: соответсвенно возможно два варианта косяков.

P.S. Должен будешь! :mrgreen:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Плагин для Download Master

Сообщение Sam777e » 23.12.2012 (Вс) 3:12

Хакер писал(а):Всегда ненавидел моду.

+1
Здоровья и удачи

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Плагин для Download Master

Сообщение ger_kar » 23.12.2012 (Вс) 11:00

Хакер писал(а):Собственно, TLB-шка и объявленный в ней интерфейс в текущем варианта вообще не нужны,
А как же тогда Implements IDMPlugIn?
Бороться и искать, найти и перепрятать

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 3

    TopList  
cron