|
#1
|
||||
|
||||
Проблема с DLL
Всем привет!
Решил свою несложную игру научить сохранять скриншоты в формате PNG. Нашел дельфийские модули по работе с этим форматом, исправно выполняют свое дело. Но, увы, в них почти 7000 строк кода, а это чуть не 1/3 от всей моей игры; компиляция заметно затягивается. Решил написать DLL-ку, которая использует модуль PNGImage и экспортирует функции взаимного конвертирования BMP - PNG. Выглядит это примерно так: Код:
{...} uses PNGImage; {...} function BMPtoPNG(const BMP: pBitmap): pPNG; var PNG: TPNGObject; begin PNG:=TPNGObject.Create; try PNG.Assign(BMP^); finally Result:=@PNG; end; end; {...} exports BMPtoPNG; Проблемы это не решило, так как в программе все равно приходится объявлять тип pPNG, ссылающийся на TPNGObject (а он описан в массивном модуле на тысячи строк)... Код:
type pPNG = ^TPNGObject; pBitmap = ^TBitmap; function BMPtoPNG(const BMP: pBitmap): pPNG; external 'pngimg.dll'; К тому же, попытка конвертирования приводит к Access Violation. Видимо, я неправильно использую указатели? А раз нужно объявлять ссылку на TPNGObject, то весь модуль PNGImage будет все равно добавлен в код и откомпилирован, и тогда нет смысла биться над DLL-библиотекой... Есть решение у этой проблемы? Или не париться, выкинуть все модули для PNG и спокойно сохраняться в BMP или JPEG? Ne timeas obscurum. |
#2
|
||||
|
||||
Честно говоря, ошибка здесь:
Цитата:
Цитата:
По проблеме: Я бы сделал так: Код:
procedure BMPtoPNG(BMP: TBitmap; Path: PChar); З.Ы. А вот это здравое решение: Цитата:
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию Последний раз редактировалось M.A.D.M.A.N., 21.01.2017 в 08:46. |
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
Lothlorien (21.01.2017)
|
#3
|
||||
|
||||
Попробую сохранять сразу в файл; если надоест ковыряться, то и правда выкину весь геморрой и буду по старинке делать JPEG )
Ne timeas obscurum. |
#4
|
|||
|
|||
И самое главное. Когда создаёшь проект типа DLL, Дельфи пишет в файле проекта длинный коментарий. Внимательно читаем.
|
#5
|
|||
|
|||
Цитата:
А еще помним, что DLL.TObject <> App.TObject, сооьветственно, DLL.TBitmap <> App.TBitmap. Поэтому в такую функцию лучше передавать либо HBitmap. Ну и путь к файлу как PChar. Тогда, кстати, можно будет подобные DLL писать на любом языке. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Lothlorien (01.02.2017)
|
#6
|
||||
|
||||
Передаю как аргумент хэндл битмапа (hBITMAP), процедура из библиотеки сразу же сохраняет готовый PNG в указанный файл. Так все работает, спасибо за помощь!
Ne timeas obscurum. |