Здравствуйте, greyvger, Вы писали:
[skip]
-- Первым делом убедись что юнит ShareMem являеется певым модулем в библиотеке.
-- Программа загружающая плагины тоже должна иметь ShareMem.pas первым юнитом в проэкте.
Это необходимо для того чтобы никакой другой юнит имеющий секцию инициализации
не выделил память до того как ShareMem.pas проинициализирует менеджер памяти.
Если это не так — EInvalidPointerOperation гарантируется.
Программа:
program MyProgram;
uses
ShareMem,
Forms,
...
Плагин:
library Plugin;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
ShareMem,
SysUtils,
Classes;
......
Все дело в том что необходимо сделать так что бы память выделяемая библиотекой и твоей программой
принадлежала одному менеджеру памяти. Это достигатся путем подключения дополнительной библиотеки borlandmm.dll.
Тоесть когда ты подключаеш Sharemem.pas — то программа подгружает borlandmm.dll.
Когда ты стартуеш свой плагин он подгружает ту же dll с тем же адресным пространством.
Тоесть плагин и программа будут иметь загруженную dll c теми же глобальными переменными,
в нашем случае — менеджером памяти, чего и следовало добится.
И еще раз: проверь что твоя программа и DLL имеет Sharemem.pas первым юнитом в проэкте, это важно...
Удачи!