Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2023, 09:48   #1
Volkogriz
Форумчанин
 
Аватар для Volkogriz
 
Регистрация: 11.10.2007
Сообщений: 384
Вопрос загрузка изображения в имейдж

Добра всем!!!
Немогу получить изоброжение с длл(

Вот код длл:

Код:
procedure LoadTGAImage(hResInst: HInst;Image:TImage; const ImageName,ResName: PChar);
var
  Stream: TStream;
  TGA:TBitmapEx;
begin
  Stream:= TResourceStream.Create(hResInst,ImageName,ResName);
  try
    TGA:=TBitmapEx.Create;
    try
      TGA.LoadFromStream(Stream);
      Image.Picture.Assign(TGA);
      Image.Parent.DoubleBuffered := True;
    finally
      FreeAndNil(TGA)
    end;
  finally
    FreeAndNil(Stream)
  end;
end;   exports  LoadTGAImage;
Приложение:
Код:
procedure LoadTGAImage(hResInst: HInst;Image:TImage; const ImageName,ResName: PChar);
external 'Recollection.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
Imag: THandle;
begin
Imag:= LoadLibrary(PChar(extractfilepath(Application.ExeName)+'dllImLoad.dll'));
LoadTGAImage(Imag,Image1, 'Имя ресунка','Имя ресурса');
end;
Получаю ошибку:
Цитата:
conot assign a TJPGimage to a TPicture
Error.png
pas TGAReader.txt
Помогите пожалуйста исправить
Заранее благодарен!
С уважением!
Не количеством плюсов измеряется репутация человека...!
Volkogriz вне форума Ответить с цитированием
Старый 23.04.2023, 11:02   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Проверьте. Ваши TGA грузятся только, через LoadFromFile, а вы вызываете LoadFromStream

Но чтобы не выискивать ошибки в коде, достаточно подключить к проекту dll исполнителя (проект где используется dll) и отлаживать код в dll как и в обычном exe файле.

Не могу сказать как т.к. не знаю где это в Delphi версии старше 7, но в 7 версии это было тут
Изображения
Тип файла: png Scr2.png (46.8 Кб, 22 просмотров)
Тип файла: png Scr3.png (54.8 Кб, 1 просмотров)
macomics вне форума Ответить с цитированием
Старый 23.04.2023, 11:11   #3
Volkogriz
Форумчанин
 
Аватар для Volkogriz
 
Регистрация: 11.10.2007
Сообщений: 384
По умолчанию

Спасибо за ответ!!!
Тоже самое с jpg.
Если процедура в приложении то всё работает на ура, помещаю в длл_ку
не может назначить где показывать
Пишу на Embarcadero RAD Studio 11
Не количеством плюсов измеряется репутация человека...!
Volkogriz вне форума Ответить с цитированием
Старый 23.04.2023, 11:23   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Скорее всего проблема в менеджере памяти, как и со строками. Алгоритмы используют стандартный Delphi GetMem.
Код:
{ 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. }
Цитата:
{ Важное примечание об управлении памятью DLL: ShareMem должен быть
первым модулем в предложении USES вашей библиотеки и (выберите
Project-View Source) USES вашего проекта предложение, если ваша библиотека DLL экспортирует и процедуры или
функции, которые передают строки в качестве параметров или результатов функции. Это
относится ко всем строкам, передаваемым в вашу библиотеку DLL и из нее - даже к тем, которые
вложены в записи и классы. ShareMem - это интерфейсный модуль для
BORLNDMM.DLL диспетчер общей памяти, который должен быть развернут вместе
с вашей библиотекой DLL. Чтобы избежать использования BORLNDMM.DLL , передавать строковую информацию
используя параметры PChar или ShortString. }
Вот это предупреждение вы так же опять игнорируете.

Допишите в вашей программе в USES ShareMem, ... остальные модули
И тоже самое в DLL
macomics вне форума Ответить с цитированием
Старый 23.04.2023, 11:42   #5
Volkogriz
Форумчанин
 
Аватар для Volkogriz
 
Регистрация: 11.10.2007
Сообщений: 384
По умолчанию

Нечиво не выходит(
Не количеством плюсов измеряется репутация человека...!
Volkogriz вне форума Ответить с цитированием
Старый 23.04.2023, 12:09   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Попробуйте передавать в библиотеку вместо графического буфера не визуальный компонент (окно) TImage, а буферный TBitmap, а Image1.Picture.Assign(bmp) делать уже в основном приложении.
macomics вне форума Ответить с цитированием
Старый 23.04.2023, 14:05   #7
Volkogriz
Форумчанин
 
Аватар для Volkogriz
 
Регистрация: 11.10.2007
Сообщений: 384
По умолчанию

Честно с этого и начинал!)
Спасибо всем за участие!!!
Вопрос решился изменением строчьки в DLL:
Код:
Image.Picture.Assign(TGA);
не эту))
Код:
Image.Picture.Graphic:=TGA;
Не количеством плюсов измеряется репутация человека...!
Volkogriz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка изображения Volkogriz Мультимедиа в Delphi 7 28.09.2012 05:17
Загрузка изображения из БД {Shadowevil} БД в Delphi 12 21.08.2012 09:30
загрузка изображения wlords Помощь студентам 3 24.11.2010 20:52
Загрузка изображения _-Re@l-_ Общие вопросы Delphi 7 31.05.2010 14:54
Загрузка изображения из exe Volkogriz Общие вопросы Delphi 13 18.01.2010 17:51