tag:blogger.com,1999:blog-1702873441071265539.post6416159076334020173..comments2023-05-29T19:02:20.570+03:00Comments on Блог GunSmoker-а: Разработка системы плагинов, часть 9: подводные камниGunSmokerhttp://www.blogger.com/profile/15611696588191431330noreply@blogger.comBlogger12125tag:blogger.com,1999:blog-1702873441071265539.post-4989066696088125982016-08-22T19:40:46.247+03:002016-08-22T19:40:46.247+03:00> А можно привести пример реализации?
В тексте...> <i>А можно привести пример реализации?</i><br /><br />В тексте статьи есть ссылка на <a href="https://pastebin.com/tewqjG6h" rel="nofollow">примеры кода</a>. <br /><br />В данном случае в интерфейсе должно быть свойство Count и индексированное Items[], а в private реализовывающего класса будет динамический массив, инициализируемый из параметров конструктора.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-12022401363443848272016-06-25T11:27:26.270+03:002016-06-25T11:27:26.270+03:00> интерфейс для передачи любых сложных и динами...> интерфейс для передачи любых сложных и динамических данных.<br /><br />А можно привести пример реализации?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-72689829191381530742016-04-03T23:56:12.471+03:002016-04-03T23:56:12.471+03:00Я бы использовал интерфейс для передачи любых слож...Я бы использовал интерфейс для передачи любых сложных и динамических данных. Но при желании можно использовать можно указатель на статический массив + целочисленная длина.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-8349526818104275512016-04-01T12:13:34.777+03:002016-04-01T12:13:34.777+03:00Здравствуйте!
Спасибо, за ответ. То есть вместо T...Здравствуйте!<br /><br />Спасибо, за ответ. То есть вместо TCheLibraryBoolean = LongBool лучше использовать TCheLibraryBoolean = BOOL?? В одной из статей, посвященной плагинам было сказано, что в них не следует использовать array of, например, то вместо TCheLibraryStringArray = array of TCheLibraryString что лучше использовать, чтобы реализовать работу с массивом внутри DLL (плагина) и приложением??<br /><br />Заранее спасибо.Anonymoushttps://www.blogger.com/profile/09251599384059832780noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-34706530131906547582016-03-28T13:22:52.047+03:002016-03-28T13:22:52.047+03:00> вместо BOOL можно использовать LongBool?
Мож...<i> > вместо BOOL можно использовать LongBool?</i><br /><br />Можно, но не нужно.<br /><br /><i> > Насколько это необходимо и правильно? Нет ли в этом подводных камней, которые сложно уловить в будущем, при эксплуатации программы?</i><br /><br />Понятия не имею. Поскольку я крайне тщательно подхожу к <a href="http://www.gunsmoker.ru/2011/12/delphi.html#n5" rel="nofollow">выбору базовых типов</a>, мне ни разу не приходилось их менять.<br /><br />Но в своей системе наименований есть однозначный плюс: можно ввести правило, что все экспортируемые типы обязательно должны иметь определённый префикс (TCheLibrary - в вашем примере). Соответственно, все типы с этим префиксом должны быть объявлены как "безопасные для экспорта" (т.е. совместимые между языками). Тогда можно легко проверять правильность выбора типов в прототипах экспортируемых функций - они обязаны иметь один и тот же префикс. <br /><br /><i> > При вызове IsEqualStrings внутри подпрограммы IsEqualStringsW не происходит ли какой-либо потери символов (точности, разрядности и тд)?</i><br /><br />Нет - при использовании Delphi 2009 и выше.<br />Да - при использовании Delphi 7 и ниже.<br /><br />И в обоих случаях будет конвертация типов и копирование данных (в run-time).<br /><br />Всё это - нормально.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-65178743224622016372016-03-25T05:40:48.751+03:002016-03-25T05:40:48.751+03:001) Вместо типа Boolean вы рекомендуете использоват...1) Вместо типа Boolean вы рекомендуете использовать тип BOOL (допустимо ByteBool, WordBool и LongBool), но тип BOOL объявляется в модуле (Delphi XE2) Winapi.Windows как: BOOL = LongBool; при этом LongBool определяется уже в System (то есть вшит в комплиятор). Таким образом, получается, что вместо BOOL можно использовать LongBool?<br /><br />2) В своих программах начал использовать синонимы для стандартных типов вида:<br /><br /> TCheBoolean = Boolean;<br /> PCheBoolean = PBoolean;<br /><br /> TCheLibraryBoolean = LongBool;<br /> PCheLibraryBoolean = ^TCheLibraryBoolean;<br /><br /> TCheString = string;<br /> TCheLibraryString = WideString;<br /><br />так как считаю, что (типы с Library использую только в экспортных подпрограммах библиотек) в случае чего лего будет заменить на иной тип. Насколько это необходимо и правильно? Нет ли в этом подводных камней, которые сложно уловить в будущем, при эксплуатации программы?<br /><br />3) Допустим имею функции:<br /><br />function IsEqualStrings<br /> (const aStr1, aStr2 : TCheString;<br /> const aToLowerCase : TCheBoolean) : TCheBoolean;<br />function IsEqualStringsW<br /> (const aStr1, aStr2 : TCheLibraryString;<br /> const aToLowerCase : TCheLibraryBoolean) : TCheLibraryBoolean;<br /> stdcall;<br /><br />при этом вторая функция имеет следующий код:<br /><br />function IsEqualStringsW<br /> (const aStr1, aStr2 : TCheLibraryString;<br /> const aToLowerCase : TCheLibraryBoolean) : TCheLibraryBoolean;<br /> stdcall;<br />begin<br /> Result :=<br /> TCheLibraryBoolean<br /> (IsEqualStrings<br /> (TCheString(aStr1), TCheString(aStr2), TCheBoolean(aToLowerCase)));<br />end;<br /><br />При вызове IsEqualStrings внутри подпрограммы IsEqualStringsW не происходит ли какой-либо потери символов (точности, разрядности и тд)?<br /><br />Спасибо, с уважением Иван!Anonymoushttps://www.blogger.com/profile/09251599384059832780noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-22225480266428499972014-03-31T18:53:53.122+04:002014-03-31T18:53:53.122+04:00>>> в 6 части цикла статей было рассказан...<i> >>> в 6 части цикла статей было рассказано про формы в плагинах, вроде с созданием формы проблем нет, а вот как сделать чтобы при выгрузке плагина форма удалялась</i><br /><br />Ну кто-то должен хранить список форм плагина. По логике, это должен делать плагин. Вот создали вы в плагине форму - запомните её в список. Выгружается плагин - удаляйте все формы, что вы запомнили в списке.<br /><br /><i> >>> Где можно подробней почитать о вариантах, с хоть минимальными примерами</i><br /><br /><a href="http://pastebin.com/tewqjG6h" rel="nofollow">Посмотрите</a>.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-68991473067485942672014-03-31T01:21:04.937+04:002014-03-31T01:21:04.937+04:00Подскажите пожалуйста относительно управления памя...Подскажите пожалуйста относительно управления памяти для плагинов.<br />Где можно подробней почитать о вариантах, с хоть минимальными примерами: <br /> * Интерфейс со свойствами типа lpData и cbSize.<br /> * DLL с экспортированием функции освобождения памяти.<br /><br />Заранее спасибо!Владимир Б.http://www.auctia.netnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-68352932959023163102013-11-27T11:01:49.731+04:002013-11-27T11:01:49.731+04:00Добрый день,
цикл статей интересный, в 6 части цик...Добрый день,<br />цикл статей интересный, в 6 части цикла статей было рассказано про формы в плагинах, вроде с созданием формы проблем нет, а вот как сделать чтобы при выгрузке плагина форма удалялась? Намекните плиз. Спасибо. Mikhail Grigorevhttps://www.blogger.com/profile/02545636226243801838noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-91936700296723861932013-05-13T14:52:44.843+04:002013-05-13T14:52:44.843+04:00Подробно.
Кратко:
HRESULT:
+ Позволяет производи...<a href="http://delphikingdom.ru/asp/viewitem.asp?catalogid=1392#SubHeader_1_1" rel="nofollow">Подробно</a>.<br /><br />Кратко:<br /><br />HRESULT:<br />+ Позволяет производить проверку успешности сразу, без необходимости делать дополнительный вызов функции (GetLastError).<br />+ Допускает несколько "успешных" результатов (например, S_FALSE и, в целом, любые S_<i>что-то</i>).<br />+ Имеет поддержку компилятора Delphi (safecall).<br />+ Есть стандартный механизм передачи произвольной дополнительной информации вместе с кодом ошибки (см. <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms221233(v=vs.85).aspx" rel="nofollow">IErrorInfo</a>/<a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms221409(v=vs.85).aspx" rel="nofollow">SetErrorInfo</a>).<br />+ Новые функции, вводимые в Windows сегодня, имеют вид интерфейсов COM (читай: используют HRESULT). Если же они являются именно чистыми функциями, то это (как правило) будут функции, возвращающие HRESULT, а не работающие с GetLastError/SetLastError. <br /><br />- Из-за дополнительных полей (Facility, тип успеха, зарезервированные поля) HRESULT допускает хранение всего 65 тысяч кодов на один источник (facility) вместо 2^31 для SetLastError/GetLastError (1 бит потрачен на признак MS/не-MS) - из которых, впрочем, сегодня используется всего 16 тысяч кодов. <br /><br /><br /><br />SetLastError/GetLastError - соответственно, наоборот.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-3374658718191115652013-05-13T14:28:54.862+04:002013-05-13T14:28:54.862+04:00Отличная статья, много полезного! Хотелось бы боле...Отличная статья, много полезного! Хотелось бы более развернуто про hresult, как про самый рекомендуемый способ возврата ошибок. И чем этот способ принципиально отличается от Success/Fail flag и GetLastError.Fr0sThttps://www.blogger.com/profile/08870754929246126173noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-7158484869374977402013-04-23T07:23:33.100+04:002013-04-23T07:23:33.100+04:00В комментариях к 6-ой части (UI в плагинах) мы уже...В комментариях к 6-ой части (UI в плагинах) мы уже начинали разговор о проблемах с Action-ами в плагинах.<br />Сейчас я сделал демо-приложение. На форму в плагине добавлены действия из StdActns.<br />В архиве плагин собран в Delphi 2007, а приложение в Delphi 2007 и в Delphi XE. Можно проверить, что в одном приложении плагин работает, а в другом - нет.<br />Кроме того, Action-ы из StdActns не работают в любом случае. В общем случае в плагине не будут работать Action-ы которые используют HandlesTarget и UpdateTarget.<br /><br /><a href="http://sites.google.com/site/achechulin/files/PluginAPI_Actions.zip" rel="nofollow">PluginAPI_Actions.zip</a>Chaahttps://www.blogger.com/profile/14387721107858333063noreply@blogger.com