Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.26;
Скачать: CL | DM;

Вниз

Пример по работе с ресурсами из DLL   Найти похожие ветки 

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

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

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


 
Defunct ©   (2006-02-11 15:14) [1]

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

имеется 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/


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

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

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


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

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

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


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

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

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

P.S.
http://delphimaster.net/view/6-1139633936/
Интересующийся   (11.02.06 15:00) [18]

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

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

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


 
Defunct ©   (2006-02-11 15:46) [5]

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

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


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


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

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

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

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

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

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

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

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


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

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

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


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

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

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

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

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

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


 
Defunct ©   (2006-02-11 16:10) [9]

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

Все! понял

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

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

Да


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

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

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


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

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

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 по сокету ...


 
isasa ©   (2006-02-11 17:36) [12]

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


 
Defunct ©   (2006-02-11 17:38) [13]

> isasa ©

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



Страницы: 1 вся ветка

Текущий архив: 2006.02.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.039 c
2-1139259790
san6
2006-02-07 00:03
2006.02.26
можно ли передавать dbf таблицы в функцию, в качестве параметров


15-1139073129
sniknik
2006-02-04 20:12
2006.02.26
Восстановление виндов (w2k), открыть с помощью...


2-1139749664
~intel~
2006-02-12 16:07
2006.02.26
Скрытие значения поля


2-1139675549
veb
2006-02-11 19:32
2006.02.26
NOT LIKE


9-1123916645
boalse
2005-08-13 11:04
2006.02.26
Воспроизведение музыки