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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2010, 14:02   #1
Eminem
Пользователь
 
Регистрация: 08.02.2010
Сообщений: 64
По умолчанию TSream из DLL в программу.

Здравствуйте.
Есть DLL и в ней картинки, звуки, файлы.

Нужно в приложение загрузить определённые данные.

Например указываю имя картинки в ресурсах DLL ('BG_0'), эти данные через функцию отправляю в DLL, а в качестве результата должен быть ресурс, т.е. картинка.
Которую через TMemoryStream или через LoadFromStream загрузить куда нужно.

Сразу говорю, что в приложении не могу использовать ресурсы, как бы я этого ни хотел, но прога должна быть не большого размера. А DLL-ки наверно будут более 50Мб

Я пробовал TSream, TMemorySream передавать, всегда выдаёт ошибку доступа к памяти.

Подскажите как правильно передать данные.


Код DLL
Код:
library ImageModul;

uses
  SysUtils, ExtCtrls,
  Classes;

{$R *.res}
{$R Resource.res}



Function GetImage(Name:Pchar):TMemoryStream;
var
 rs:TResourceStream;
begin
rs:=TResourceStream.Create(Hinstance, Name, Pchar('OTHER'));
Result:=TMemoryStream.Create;
rs.SaveToStream(Result);
//Result.SaveToFile('c:\12.png');
end;


Exports
 GetImage name 'GetImage';


end.
Код в приложении, 2 варианта.
Код:
Var
 Function GetImage(Name:Pchar):TMemoryStream;
 stdcall; external 'D:\ImageModul.dll';  //для второго способа

...

// функция для загрузки, 1-й способ
function CallDLLStr_PNG(WayDll,NameFunc:String; Name:Pchar):TMemoryStream;
var
 DLLHandle: THandle;
 Info: TDLLStr_PNG;
begin
result:=TMemoryStream.Create;
 try
  DLLHandle := loadLibrary (pchar(WayDll));
   if DLLHandle <> 0 then
    begin
     @Info := getProcAddress ( DLLHandle, pchar(NameFunc) );
     if addr ( Info ) <> nil then
      begin
       result:=Info(Name);
      end
     else
      result:=nil;
    end
   else
    result:=nil;
 finally
  freeLibrary (DLLHandle);
 end;
end;

//Первый способ
procedure TForm1.Button1Click(Sender: TObject);
var ms:TMemoryStream;
begin
ms:=TMemoryStream.Create;
ms:=CallDLLStr_PNG('D:\ImageModul.dll', 'GetImage', 'BG_0');
Image1.Picture.Graphic.LoadFromStream(ms);
ms.Free;
end;

//Второй способ
procedure TForm1.Button2Click(Sender: TObject);
var ms:TMemoryStream;
begin
ms:=TMemoryStream.Create;
ms:=GetImage('BG_0');
Image1.Picture.Graphic.LoadFromStream(ms);
ms.Free;
end;
P.S. Работа с PNG-графикой реализована.
обратите внимание на строку в DLL Result.SaveToFile('c:\12.png'); Картинка сохраняется.
Eminem вне форума Ответить с цитированием
Старый 13.12.2010, 14:18   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

1. функции в DLL и основной программе должны иметь идентичные описания (включая stdcall и прочие модфикаторы).
Код:
 Function GetImage(Name:Pchar):TMemoryStream;
 stdcall; external 'D:\ImageModul.dll';  //для второго способа

Function GetImage(Name:Pchar):TMemoryStream;
Exports
 GetImage name 'GetImage';
2. комментарий про sharemem в заголовочном файле DLL читал? или удалил сразу не читая.

3. зачем нужна небольшая программа если рядом с ней будет лежать огромный файл ресурсов. К тому же использующая раннее связывание (external 'D:\ImageModul.dll') , так что программа без файла ресурсов не запустится.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 13.12.2010 в 14:23.
evg_m вне форума Ответить с цитированием
Старый 13.12.2010, 14:31   #3
Eminem
Пользователь
 
Регистрация: 08.02.2010
Сообщений: 64
По умолчанию

да вроде читал, но .... как-то глухо, там не сказано как вызовы делать.
stdcall; дописал в DLL-ке, но ошибка сохранилась.

external я использовал для расширения, вдруг загрузится.

P.S. так то если нет файла ресурсов, то прога Обязана не запускаться, там даже есть защита по Хэш, если DLL изменится прога уже должна начать паниковать.

Последний раз редактировалось Eminem; 13.12.2010 в 14:35.
Eminem вне форума Ответить с цитированием
Старый 13.12.2010, 14:41   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
да вроде читал, но .... как-то глухо, там не сказано как вызовы делать.
там сказано где и когда ее(sharemem) надо подключать (uses). и прочие требование к переносимости программы использующих данных механизм.

вопрос об уменьшении веса программы при раздувании сопутствующих обязательных файлов(DLL) отается открытым. Ведь общий(суммарный) объем никуда не делся.
фа
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 13.12.2010 в 14:44.
evg_m вне форума Ответить с цитированием
Старый 13.12.2010, 14:52   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
2. комментарий про sharemem в заголовочном файле DLL читал? или удалил сразу не читая.
это касется передачи string из программы в ДЛЛ и наоборот.

ТС, может проще в самой программе грузить эти ресурсы из ДЛЛ, чем писать экспортные велосипеды?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.12.2010, 15:02   #6
Eminem
Пользователь
 
Регистрация: 08.02.2010
Сообщений: 64
По умолчанию

Может и проще, задумка была грузить по функции, но я же не смогу запретить использование этих рес-в (в ДЛЛ) стандартным Виндусовским путём другими пользователями.
Eminem вне форума Ответить с цитированием
Старый 13.12.2010, 15:05   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну начнем с того что у вас все равно есть ресурсы, так что разница?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.12.2010, 15:07   #8
Eminem
Пользователь
 
Регистрация: 08.02.2010
Сообщений: 64
По умолчанию

ну да
А как из длл-ки загрузить ресурс... я такое еще не пактиковал.
обычно всё из памяти брал.
Eminem вне форума Ответить с цитированием
Старый 13.12.2010, 15:07   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В такой ситации, когда огромный ресурс и требования на размеры exe наверно нужно создать своими средствами файл для хранения картинок и прочего , а в основной программе модуль для поиска по ключу информации в этом файле и считывания ее. Возможно где-то в природе и компоненты нарисованы для этого
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.12.2010, 15:12   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
var
 DLLHandle: THandle;
 rs:TResourceStream;
begin
DLLHandle:=LoadLibrary('MyDLL.dll');//если в ДЛЛ не будет кода как такового, то вполне можно использовать LoadLibraryEx с флагом LOAD_LIBRARY_AS_DATAFILE
rs:=TResourceStream.Create(DLLHandle, Name, Pchar('OTHER'));
//используем ресурс
rs.Free;
FreeLibrary(DLLHandle);
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление DLL компоненита в программу ЖенёкСупер Общие вопросы Delphi 8 08.08.2010 20:20
Перенос формы из dll-ки в программу Greek9000 Общие вопросы Delphi 4 22.12.2009 18:19
Передать строки из dll в программу 856100 Общие вопросы Delphi 6 03.08.2009 00:37
Вынос компонентов программы (которые делфи всталяет в каждую программу) из проги в dll GanGSISoft Общие вопросы Delphi 17 02.07.2009 17:24
как из dll передавать данные в основную программу? andrey4623 Общие вопросы Delphi 5 06.08.2007 10:15