Кнайт, ты и диод.
Какого лешего ты отдаешь TApplication и TScreen в плагины и не ставишь SharedMem в uses?
Убиваются твои плагины так:
Код
function InitPlugin(App, Scr: integer; Var Version: Real):Pointer; stdcall;
begin
TApplication(App).Title := TApplication(App).Title + 'My cool title';
end;
Объясняю: App передал по ссылке. Это нормально, только внутри сделана кака: TApplication.Title имеет тип string (Кстати, ANSIString или WideString? В 7-й - ANSI, в XE - Wide).
В приведенном примере Берется оригинальный тайтл, создается новая переменная под размер новой строки, туда конкатенируются 2 старых и ссылка записывается в Тайтл. Пока-что все нормально... Но вот дальше вызывается Дестрой для старого тайтла. В дестрое вызывается ФриМем, а память-то взята не плагиновой ФриМем, а Пилотной. В результате получается AccessViolation (может наступить и не сейчас).
Такая кака может быть и при простом чтении свойства, так что НИКОГДА НЕ ОТДАВАЙ В ПЛАГИН КЛАССЫ, ГДЕ ИСПОЛЬЗУЮТСЯ СТРОКИ ИЛИ ДИН. МАССИВЫ.
Выходов из этого положения 2:
1) Использовать SharedMem (который опять-таки зависит от версии дельфи)
2) Передавать ссылку на мемори менеджер в плагины (который опять-таки зависит от версии дельфи)
0) Отказаться от передачи классов в плагины заменив их хендлами (от приложения и от скрина)
Более того, разные версии Дельфи имеют разную семантику этих классов. То есть так просто делать нельзя. Надо обязательно знать - какой версией Дельфи ты компилировал.
Блин, лучше-бы посоветовался сначала.
Господа, в таком виде плагины не юзабельны, так что пока-что не пользуйте их пожалста.
Do. Or do not. There is no Try!
© Master Joda, Dagobah, Star Wars: Episode V.