Автор Тема: Разработка плагинов - основные ошибки  (Прочитано 6482 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Дмитрий Маслов

  • Администратор
  • Маэстро
  • *****
  • Сообщений: 6138
  • Репутация +220/-19
  • Я делаю мир таким!
    • Просмотр профиля
При разработке плагинов к LeaderTask, разработчики допускают всяческие неточности при взаимодействии с LeaderTask API.
В этой теме будут выкладываться типичные ошибки.

Оффлайн Дмитрий Маслов

  • Администратор
  • Маэстро
  • *****
  • Сообщений: 6138
  • Репутация +220/-19
  • Я делаю мир таким!
    • Просмотр профиля
Re: Разработка плагинов - основные ошибки
« Ответ #1 : 26 Мая 2010, 09:19:31 »
1. Используйте юникод!

Игнорирование того, что параметры должны поступать в юникоде - двухбайтной кодировке, типичной для функций Windows API (wchar_t) - приводит к ошибкам.
Передача строковых параметров в ansi (однобайтной кодировке) в лучшем случае воспримется программой как китайский язык, в общем случае приводит либо к падению программы, либо неопределенному поведению.
Это касается всех функций, в том числе и AddinLT_Task_SetRTFComment
« Последнее редактирование: 26 Мая 2010, 09:21:08 от zitz »

Оффлайн Дмитрий Маслов

  • Администратор
  • Маэстро
  • *****
  • Сообщений: 6138
  • Репутация +220/-19
  • Я делаю мир таким!
    • Просмотр профиля
Re: Разработка плагинов - основные ошибки
« Ответ #2 : 03 Июня 2010, 12:15:58 »
2. Следите за зависимостями от сторонних DLL

На компьютере пользователя могут отсутствовать необходимые для работы Вашего плагина DLL - тогда Ваш плагин просто у пользователя не загрузится (без всяких ошибок).
Самое распространенное здесь это отсутствие Debug библиотек у пользователя, по этому выкладывайте плагины всегда в Release сборке.

Оффлайн Hush

  • Плагинописатель
  • Способный
  • ***
  • Сообщений: 100
  • Репутация +21/-0
    • Просмотр профиля
Re: Разработка плагинов - основные ошибки
« Ответ #3 : 08 Августа 2010, 13:52:14 »
3. Для Delphi нужно указать модель вызова функции "cdecl"
Пример:
function AddinLT_Task_GetTitle(id:PWideChar):PWideChar; cdecl; external 'lt_plugins.dll' name 'AddinLT_Task_GetTitle';
« Последнее редактирование: 08 Октября 2010, 10:19:45 от zitz »

Оффлайн Дмитрий Маслов

  • Администратор
  • Маэстро
  • *****
  • Сообщений: 6138
  • Репутация +220/-19
  • Я делаю мир таким!
    • Просмотр профиля
Re: Разработка плагинов - основные ошибки
« Ответ #4 : 23 Августа 2010, 12:05:56 »
4. Запускайте функции LeaderTask API (AddinLT_...) в основном потоке

На текущий момент работа плагинов не предназначена для многопоточного режима, по этому вызов функций LeaderTask API из потоков созданных внутри плагина может приводить к зависанию, вылетанию программы или зацикливанию.
В следующих версиях все функцию будут возвращать FALSE если вызваны не в том потоке.
« Последнее редактирование: 08 Октября 2010, 10:18:00 от zitz »

Оффлайн NA

  • Плагинописатель
  • Эксперт
  • ******
  • Сообщений: 906
  • Репутация +78/-20
    • Просмотр профиля
Re: Разработка плагинов - основные ошибки
« Ответ #5 : 01 Ноября 2010, 18:54:42 »
Для Delphi я бы отметил как минимум 3 важных момента:

1. Как уже указано выше - cdecl, обязательно.
2. {$Z4} - просто скажите спасибо, поставьте в начало шаблона и забудьте о ней навсегда.
3. Грабля, которая чуть не выела мне весь мозг. При переводе API на Pascal пропарил указать в одном из многочисленных объявлений var.
Приглашаю обсудить мои мечты о Контактах.

Gantt... как много в этом слове. Оч ждется.

"Анонимному" минусишке: чем больше неудачников меня ненавидит, тем более правильно я живу. Твои минусы исподтишка - это настоящие плюсы мне. Спасибо!

Оффлайн Hush

  • Плагинописатель
  • Способный
  • ***
  • Сообщений: 100
  • Репутация +21/-0
    • Просмотр профиля
Re: Разработка плагинов - основные ошибки
« Ответ #6 : 07 Декабря 2010, 04:12:00 »
При экспорте ф-ий из dll для Delphi будьте внимательны - сишный тип BOOL соответствует типу BOOL в Delphi, а не привычному в Delphi типу Boolean. Но можно указать BOOL в экспорте функциии, а передавать туда Boolean, Delphi автоматически сделает приведение типов. Подробнее о разнице в этих типах можно прочитать здесь