![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пример по работе с ресурсами из 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/