Как засунуть Designer в DLL?

отредактировано 23:52 Раздел: FastReport 2.xx VCL
Все знают про эту проблемку: с дизайнером ехешник больше в 2 раза.
Вот я и пытаюсь выделить дизайнер в DLL-ку.
Передать вроде удалось: в ехешнике делаю
var pBuffer: Pointer;
szBuffer: integer;
begin
Stream:= TMemoryStream.Create;
try
frReport.SaveToStream(Stream);
szBuffer:= Stream.Size;
GetMem(pBuffer, szBuffer);
Stream.Seek(0, soFromBeginning);
Stream.Read(pBuffer^, szBuffer);
DLLDesignReport(pBuffer, szBuffer);
finally
FreeMem(pBuffer);
Stream.Free;
end;
end;

в DLL-ке:
function DLLDesignReport(Buffer: Pointer; szBuf: Integer): integer;
var Stream: TMemoryStream;
begin
Stream:= TMemoryStream.Create;
try
Result:=0;
Stream.Write(Buffer^, szBuf); {1}
Stream.Seek(0, soFromBeginning);
with TFRReport.Create(nil) do
try
LoadFromStream(Stream);
ShowReport;
finally
Free;
end;
finally
Stream.Free;
end;
end;

Но при попытке возвратить буфер назад в ехешник
(function DLLDesignReport(var{!!!} Buffer: Pointer; szBuf: Integer): integer;) возникает ошибка чтения в {1}.
Как это сделать по-другому?

Комментарии

  • отредактировано 23:52
    По-моему, использование DLL для дизайнера - есть очень сырое и поспешное решение. ГОРАЗДО проще, быстрее и логичнее, собрать проект с использованием FR.bpl, и поставлять exe-шник вместе в этой BPL-кой. Во-первых, сам exe-шник будет меньше (экономия на включении FR* в исполняемый файл) и дизайнер автоматически будет доступен, только вызови и пользуйся. Во-вторых - каких-либо изменений в проект вносить не требуется.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.