Информация:
- Официальный пример на Delphi.
- 3 плагина на Си++ (DMDIESP - мой).
Хакер писал(а):Если хочешь поскорее получить ответ, используй архиватор, архив которого сможет без проблем открыть большинство людей без установки стороннего софта.
Qwertiy писал(а):Это самый популярный архиватор сейчас.
Хакер писал(а):Всегда ненавидел моду.
Хакер писал(а):Какую версию нужно DM нужно поставить, чтобы протестировать?
Хакер писал(а):VB IDE вообще нет никакого дела до этого комментария.
Хакер писал(а):и возможно комментарий сделан именно для такого эддина, но такого эддина у тебя нет.
Хакер писал(а):интерфейс IDMPlugin ты должен объявить в TLB
Qwertiy писал(а):Как это сделать?
[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);
}
Хакер писал(а):Ради этого мне пришлось скачать 7-Zip (софтина оказалась мерзостью — ни ресширение не проассоциировалось, ни копи-паст из окна в проводник не реализован), чтобы распаковать твой архив с сишными примерами.
Хакер писал(а):Распокавал. Открываю IDMInterface.h, и вот тебе на ...
Хакер писал(а):Офицальную спецификацию интерфейса не могу найти вообще.
Но по крайней мере я нахожу вот это: http://www.delphimaster.ru/cgi-bin/foru ... 532021&n=8
Хакер писал(а):Кстати, ридми говорит, что IDMInterface реализуется хостом, и предоставляется плагину, а IDMPlugIn, стало быть, должен реализовывать плагин, и предоставлять хосту.
Хакер писал(а):Обрати внимание, что тут я проявил иницативу и функции превратил в read-only свойства, и переименовал некоторые члены на свой вкус.
Хакер писал(а):Пишим компилирующий батник:
midl idmpl_iface.idl /win32 /tlb download-master.tlb
Компилируем. Скомпилировалось.
Qwertiy писал(а):У кого как...
Qwertiy писал(а):А почему это допустимо? Или важен порядок функций?
Ну у меня так и есть, если не считать, что вместо IDMInterface я поставил Object...
Qwertiy писал(а):А ещё, у Description'а у тебя строковый параметр пропал.
Хакер писал(а):Это ни в коем случае недопустимо.
Хакер писал(а):Кривая установка или что-то вроде того.
Qwertiy писал(а):А почему от функции getID остаётся только свойство, а самой функции нет?
Qwertiy писал(а):И в чём идея использовать свойства вместо функций? Вообще, какая между ними разница?
Qwertiy писал(а):Почему?
disp_id=x.GetIDsOfNames("Boom")
x.Invoke(disp_id)
Qwertiy писал(а):VS6 или можно что-то поменьше переустановить?
Хакер писал(а):Как это понять? Любой свойство компилируется в пару функций 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 вообще не причём.
Qwertiy писал(а):У тебя осталось только свойство в последней.
Хакер писал(а):Вообще ни одного, понимаешь? Значит какие-то ещё требования не выполнены.
Хакер писал(а):Это какие-то дельфийские прибамбасы, которые меня запутали. Похоже действительно get-процедура свойства должна быть первой в интерфейсе.
Qwertiy писал(а):Но ведь он создаёт объект, значит он ему чем-то не нравится... Какие есть варианты?
А ты что-нибудь с уже имеющимися плагинами делать не пробовал?
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: Всё-таки, как работает сишный код без этих интерфейсов?
Хакер писал(а):Разобрался. Ты меня сбил . Вместо ... Должно быть:
Хакер писал(а):Никак. С чего ты взял, что сишный код работает без этих интерфейсов?
Qwertiy писал(а):а во-вторых, интерфейсов этих я там не вижу
virtual HRESULT STDMETHODCALLTYPE getID_ (/*Result BSTR* this, */ DMPluginBase* This)
{
T* this_ = static_cast<T*>(This);
BSTR* pResult = reinterpret_cast<BSTR*>(this);
Хакер писал(а):Я не знаю, что там они курили, но DM использует принципы, которые абсолютно противоречат COM.
Хакер писал(а):Обрати внимание на этот «странный код».
Qwertiy писал(а):Но ведь он создаёт объект, значит он ему чем-то не нравится... Какие есть варианты?
Что насчёт того, что возвращаемое значение пишется вместо this? Tlb это учитывает?
А ты что-нибудь с уже имеющимися плагинами делать не пробовал?
Qwertiy писал(а): данном случае под DM ты имеешь в виду делфи?
Qwertiy писал(а):Но ведь он создаёт объект, значит он ему чем-то не нравится... Какие есть варианты?
Что насчёт того, что возвращаемое значение пишется вместо this? Tlb это учитывает?
А ты что-нибудь с уже имеющимися плагинами делать не пробовал?
Хакер писал(а):Под DM имеется в виду Download Master. На чём он написан — вопрос второй.
Qwertiy писал(а):Я имел в виду, что вероятно, все программы на делфи так поступают, иначе это было бы весьма странно.
Qwertiy писал(а):Смахивает на декларацию pascal и cdecl.
Хакер писал(а):После того, как стало ясно, что без изврата плагин для DM не написать на на VB6, ни на дотнете, ни на С++ с применением ATL, ни на любом другом средстве для создания COM-классов.
Qwertiy писал(а):А что мешает сделать так же как в Си, т. е. Sub, а внутри Me привести к указателю на String?
Хакер писал(а):Я просто сейчас покажу тебе пример с переходниками. Дальше думай сам.
Хакер писал(а):Не знаю, что ты имел в виду под приведением Me к String
Что-нибудь типа
А как же тогда Implements IDMPlugIn?Хакер писал(а):Собственно, TLB-шка и объявленный в ней интерфейс в текущем варианта вообще не нужны,
Сейчас этот форум просматривают: Google-бот, Mail.ru [бот] и гости: 33