Re: Параметр типа TStringList в экпортируемой функции
От: Danchik Украина  
Дата: 07.07.05 14:31
Оценка:
Здравствуйте, 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 первым юнитом в проэкте, это важно...

Удачи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.