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.