Page 1 of 1
Предупреждение о приближении завершения закачки
Posted: 05 Feb 2011, 22:11 Sat
by Qwertiy
Мне бы пригодился плагин, который предупреждает о том, что до завершения закачки осталась, например, 1 минута. Естественно, интервал должен настраиваться.
Заранее спасибо.
Re: Предупреждение о приближении завершения закачки
Posted: 06 Feb 2011, 8:41 Sun
by Korney San
Вы готовы выделить на его разработку некую сумму?
Posted: 06 Feb 2011, 16:36 Sun
by Qwertiy
Korney San wrote:Вы готовы выделить на его разработку некую сумму?
Нет... Я лучше постараюсь разобраться, как написать плагин не на Delphi.
Re:
Posted: 06 Feb 2011, 17:59 Sun
by Korney San
Qwertiy wrote:Нет... Я лучше постараюсь разобраться, как написать плагин не на Delphi.
Попробуйте освоить то, что
сделал VoLT.
Posted: 06 Feb 2011, 18:08 Sun
by Qwertiy
Korney San wrote:Попробуйте освоить то, что
сделал VoLT.
Как раз пытаюсь понять, почему когда я компилирую этот код в VS2010, DM просто не видит, что плагин вообще существует...
Re:
Posted: 06 Feb 2011, 18:14 Sun
by Korney San
Qwertiy wrote:Как раз пытаюсь понять, почему когда я компилирую этот код в VS2010, DM просто не видит, что плагин вообще существует...
Мне как-то нагуглилось, что в С++ нет понятия "интерфейс". Может, ноги растут оттуда. Сам же VoLT бодался с присвоением классу GUID...
Posted: 06 Feb 2011, 19:49 Sun
by Qwertiy
Korney San wrote:Qwertiy wrote:Как раз пытаюсь понять, почему когда я компилирую этот код в VS2010, DM просто не видит, что плагин вообще существует...
Мне как-то нагуглилось, что в С++ нет понятия "интерфейс". Может, ноги растут оттуда. Сам же VoLT бодался с присвоением классу GUID...
Выяснил, что проблема (по крайней мере, пока) в экспортируемой функции...
readme.txt wrote:Плагин должен экспортировать единственную функцию - RegisterPlugIn, вызываемую
по соглашению stdcall. Экспортировать ее через __declspec(dllexport) нельзя, т.к.
при этом экспортированное имя будет декорировано в соответствии с соглашением о вызове.
Т.е. будет выглядеть как _RegisterPlugIn@4 - что DMaster'у никак не подходит
Я использовал .def файл.
Только вот VS def-файл игнорирует... А без него получается
Code: Select all
Function Name : long __stdcall RegisterPlugIn(struct MyPlugin * *)
Address : 0x10011177
Relative Address : 0x00011177
Ordinal : 1 (0x1)
Filename : DMDIESP.dll
Type : Exported Function
вместо
Code: Select all
Function Name : RegisterPlugIn
Address : 0x004027f0
Relative Address : 0x000027f0
Ordinal : 1 (0x1)
Filename : MyPlugin.dll
Type : Exported Function
Posted: 06 Feb 2011, 20:02 Sun
by Qwertiy
Нашёл решение
Code: Select all
extern "C" HRESULT __declspec(dllexport) _stdcall RegisterPlugIn( MyPlugin** out) {
#pragma comment (linker, "/export:RegisterPlugIn=_RegisterPlugIn@4")
*out = &myp;
return S_OK;
}
Теперь получается так:
Code: Select all
Function Name : _RegisterPlugIn@4
Address : 0x10002430
Relative Address : 0x00002430
Ordinal : 2 (0x2)
Filename : DMDIESP.dll
Type : Exported Function
==================================================
Function Name : RegisterPlugIn
Address : 0x10002430
Relative Address : 0x00002430
Ordinal : 1 (0x1)
Filename : DMDIESP.dll
Type : Exported Function
и плагин определяется.
Теперь буду код писать.
Re:
Posted: 06 Feb 2011, 20:29 Sun
by Korney San
Qwertiy wrote:Теперь буду код писать.
Отлично!
Вам осталось читать у загрузок поле <timeleft>, сверять с настройкой, умноженной на 60 (если в минутах), и оповещать пользователя каким-либо способом.
Я бы предложил свой сервис всплывающих окон, но для этого Вам придётся переложить на C улучшенный интерфейс...
Posted: 06 Feb 2011, 21:49 Sun
by Qwertiy
Пока сделал так:
Code: Select all
_bstr_t EventRaised(const _bstr_t& eventType, const _bstr_t& eventData)
{
static std::set <int> ignore;
if (eventType == _bstr_t("dm_timer_5"))
{
_bstr_t ids;
wchar_t *ptr, *end, buf[16];
int cur, n;
unsigned time;
ids = DoAction("GetDownloadIDsList", "3");
for(end=(ptr=(wchar_t*)ids)+ids.length(); ptr<end; ptr+=n)
{
if(swscanf(ptr, L"%d %n", &cur, &n) != 1)
break;
if(!ignore.count(cur))
{
wsprintf(buf, L"%d", cur);
swscanf(wcsstr((wchar_t*)DoAction("GetDownloadInfoByID",buf),L"<timeleft>")+10, L"%u", &(time=0));
if(time && time<120)
{
ignore.insert(cur);
MessageBox(0, L"До завершения одной из закачек осталось менее 2 минут!", L"", 48);
}
}
}
}
return "";
}
Потом займусь настройками и, возможно, интерфейсом. А вообще, подумаю над тем, как сделать плагин на VB.NET...
Скачать dll.