Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Вниз

Пример по работе с ресурсами из 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.037 c
2-1139325472
nts
2006-02-07 18:17
2006.02.26
LPT порт


3-1135670220
VadimSpb
2005-12-27 10:57
2006.02.26
Данные в графике


2-1139156692
Glex
2006-02-05 19:24
2006.02.26
Как присвоить TImage другой TImage?


6-1131999953
XRed
2005-11-14 23:25
2006.02.26
Интернет. Процесс передачи данных.


3-1135844495
Paha
2005-12-29 11:21
2006.02.26
Связка нескольких баз Oracle.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский