Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Пример по работе с ресурсами из DLL [D6, WinME, WinXP]


Интересующийся ©   (2006-02-11 15:02:00) 

Нужен пример или инфа по вопросу получения ресурсов из DLL и выгрузке их в файл или передачи по сети.

Нужны:
1. Полный список процедур и функций.
2. Примеры по работе (если есть).
3. Статьи по этому вопросу.


Defunct   (2006-02-11 17:38:00) [1]

> isasa ©

ничем не обидел, просто ResourceStream дает возможность отчасти абстрагироваться от кучи проблем, его сразу можно отправлят через сокет.


isasa   (2006-02-11 17:36:00) [2]

Да, в данном случае, никаких ShareMem не надо :)


isasa   (2006-02-11 17:33:00) [3]

А чем обидел, например, такой вариант для строкового ресурса

function TbForm.StrRes(i: integer): string;
var buf : PChar;
begin
 buf:=strAlloc(MaxMsgLen);
 LoadString(resHnd, i, buf, MaxMsgLen);
 Result:=StrPas(buf);
 strDispose(buf);
end;

i - индекс в ресурсе STRINGTABLE
resHnd:=LoadLibrary('<файл DLL>');
Для графики - соответственно

HBITMAP LoadBitmap(
 HINSTANCE hInstance,  // handle to application instance
 LPCTSTR lpBitmapName  // name of bitmap resource
);

Ну а дальше - передача string по сокету ...


Интересующийся   (2006-02-11 16:15:00) [4]

Все понял, за совет спасибо!!!

Буду пробовать изменить свой код для работы TResourceStream.


Defunct   (2006-02-11 16:10:00) [5]

> 2. Определяю пазицию ресурса в DLL при момощи FindResource()
> Ресурсы по типу RT_BITMAP, RT_ICON, RT_STRING или RT_RCDATA

Все! понял

> Что за ShareMem? (Я с ним врервые сталкнулся)
Это модуль соответствующим образом настраивает Borland менеджер памяти, что в свою очередь дает возможность использовать из Host приложения память и переменные DLL, и наоборот. Но похоже в вашем случае он не понадобится.

> Где HInstance = получаем при помощи LoadLibrary().

Да


Интересующийся   (2006-02-11 16:01:00) [6]

Насколько я понимаю при работе с графикой страка с TResourceStream будет таковой:

Stream:=TResourceStream.Create(HInstance,'Имя ресурса',RT_BITMAP);

общий вид таков:

Stream:=TResourceStream.Create(HInstance,'Имя ресурса',RT_RCDATA);

Где HInstance = получаем при помощи LoadLibrary().


Интересующийся   (2006-02-11 15:55:00) [7]

> Defunct ©   (11.02.06 15:46) [5]
> Если проект - это DLL, то подключив ShareMem, загруженные ресурсы можно сразу экспортировать. Вам это требовалось?

Что за ShareMem? (Я с ним врервые сталкнулся)


Интересующийся   (2006-02-11 15:49:00) [8]

Код работы пока дать немогу.

Но принцип таков:
1. Читаю при помощи LoadLibrary(), получаю Dll доступ к Dll
2. Определяю пазицию ресурса в DLL при момощи FindResource()

Ресурсы по типу RT_BITMAP, RT_ICON, RT_STRING или RT_RCDATA

3. Далее следует применить одну из слудующих вещей:
LoadResource, LoadBitmap, LoadString, LoadIcon (в зависимости от типа ресурса)

Здесь начинуются все проблемы

4. Здесь нужно передать ресурс в сеть

5. Выгружаем DLL при помощи FreeLibrary()


Defunct   (2006-02-11 15:46:00) [9]

Создаем .rc файл, подключаем его к проекту, далее в проекте загружаем требуемый ресурс, например так:

var
  Stream : TResourceStream;
begin
  Stream := TResourceStream.Create( HInstance, 'Имя ресурса', <Тип ресурса> );
  try
     Cделать с ресурсом что-то, либо ничего не делать
  finally
     Stream.Free
  end;


если проект - это DLL, то подключив ShareMem, загруженные ресурсы можно сразу экспортировать. Вам это требовалось?


Интересующийся   (2006-02-11 15:28:00) [10]

> Для второго можете почитать здесь: http://www.helloworld.ru/texts/comp/lang/delphi/dll/

Полезный текст, но мне нужна работа с ресурсами состоящими из текста, графики и простых файлов

P.S.
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1139633936&n=4
Интересующийся   (11.02.06 15:00) [18]

>> Если говоря о ресурсе DLL, вы имеете в виду нечто другое (не .rc), тогда все должно сводиться к получению данных из DLL

>Это мне и нужно.

Текс ошибочен.


Defunct   (2006-02-11 15:19:00) [11]

> 2. Получаю указатель на текстовый или графический ресурс

Подробнее с этого места, и лучше сразу с примером кода.


Интересующийся   (2006-02-11 15:17:00) [12]

Проблема такова:
1. Динамически открываю DLL (при помощи LoadLibrary)
2. Получаю указатель на текстовый или графический ресурс
3. После чего нужно передать ресурс по сети клиенту (Использую TServerSocket)

P.S
При выгрузке ресурса в файл (на диск) правильно удается определить только размер ресурса, а в файл выгружается мусор.


Defunct   (2006-02-11 15:14:00) [13]

:)
говорил же не упонинать о выгрузке в файл и про передачу по сети. ну да ладно.

имеется 2 пути. Первый и наиболее простой путь: подключить модуль ShareMem первым в DLL и в HOST приложении и экспортировать из DLL все что будет угодно влоть до создаваемых в DLL экземляров классов.

Второй путь: экспортировать из DLL функции, с помощью которых будет осуществляться передача данных.

пример для первого варианта:

Library MyDll;

uses ShareMem, SysUtils;

type TMyClass = class
      end;

var
  MyClass : TMyClass;

exports
  MyClass;

end.


Для второго можете почитать здесь: http://www.helloworld.ru/texts/comp/lang/delphi/dll/


Наверх

Титульная страница Поиск, карта сайта Написать письмо