Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Размещение ресурсов в DLL 
:(
    Опции темы
Christoph
Дата 25.8.2008, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 5
Всего: 11



Интересует вопрос как разместить в длл какой то ресурс...любой...
нашел пример, как в длл закинуть форму, вот эта статья  http://www.delphimaster.ru/articles/usedll/index.html

Код

function ShowMyDialog(Msg: PChar): Boolean; stdcall;

...
exports ShowMyDialog;

function ShowMyDialog(Msg: PChar): Boolean;
begin
  {Создаем экземпляр Form1 формы TForm1}
  Form1 := TForm1.Create(Application);
  {В Label1 выводим Msg}
  Form1.Label1.Caption := StrPas(Msg);
  {Возвращаем True только если нажата OK (ModalResult = mrOk)}
  Result := (Form1.ShowModal = mrOk);
  {Освобождаем память}
  Form1.Free;
end;


Не понимаю самого кода...ни названия длл ничего...как оно туда пишет не понятно   smile 
Помогите разобраться. Или показать другой пример как в длл закинуть какой то ресурс...


Это сообщение отредактировал(а) Christoph - 25.8.2008, 23:04


--------------------
user posted image
PM MAIL ICQ   Вверх
Rohoss
Дата 26.8.2008, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: нет
Всего: 18



А что не понятно? Это и есть длл. Как она называется, не имеет значения. Форма создаётся динамически.


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
THandle
Дата 26.8.2008, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Christoph, посмотри прикрепленные файлы из вот этой вот темы:

http://forum.vingrad.ru/forum/topic-225395.html

Там форму в ДЛЛ пихали.


А ресурсы, в прямом смысле слова, как в ДЛЛ пихать посмотри например в примере, который я когда то давал:

http://forum.vingrad.ru/forum/topic-214004...y1530458/0.html
PM   Вверх
Christoph
Дата 26.8.2008, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 5
Всего: 11



Кто то может подкинуть теорию или статейку....про то как закинуть какой ресурс в файл мне THandle  дал ссылки ...но я не могу понять порядок действий...А нельзя ли прописать в разделе описании логики, ну например процедуру для загрузки рисунка


--------------------
user posted image
PM MAIL ICQ   Вверх
THandle
Дата 26.8.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Christoph, ладно...


Разместим форму в DLL, и будем загружать её двумя способами: явно и неявно.

Явная загрузка будет осуществляться с помощью функции LoadLibrary, получении адреса нужной нам процедуры/функции с помощью GetProcAddress, вызова данной процедуры(забегая вперед скажу - процедура у нас будет одна: она будет показывать форму, дожидаться когда пользователь с ней поработает, после чего уничтожит форму), и последующего освобождения загруженной библиотеки с помощью FreeLibrary.

Неявная же загрузка будет произведена с помощью экспортирования нашей процедуры из библиотеки.

При неявной загрузке библиотеки, она будет загружена вместе с программой, при явной - только тогда, когда нам это требуется(чтоб память не кушать).

После всех этих загрузок выгрузок мы еще попробуем пихать в ресурсы библиотеки картинки.

Итак, начнем.


Явная загрузка:


Открываем Delphi.
У меня сейчас 7 версия.

Закрываем все открытые проекты с помощью File->Close All.

И создаем новый проект - библиотеку DLL.

File -> New -> Other -> DLL wizard


Дожен появится проект с вот таким кодом(ненужные нам комментарии опущены):

Код


library Project1;

uses
  SysUtils,
  Classes;

{$R *.res}

begin
end.



Теперь добавим в наш проект форму:

File -> New -> Form

Как можно заметить по изменившемуся коду библиотеки - форма добавилась. Теперь она в DLL:

Код

library Project1;

uses
  SysUtils,
  Classes,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
end.




Положим на форму для красивости кнопку. По щелчку на ней будет показываться приветствие. Вот обработчик OnClick кнопки:


Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Превед!!!!');
end;



Наша форма готова к бою.
Теперь самое главное - напишем процедуру, которая будет показывать нашу формочку.


Объявим её в разделе interface модуля нашей формы:

Код

procedure ShowForm;



Теперь опишем её в разделе implementation:


Код

procedure ShowForm;
begin
  Form1 := TForm1.Create(Application);
  //создали форму
  Form1.ShowModal;
  //показали в модальном режиме
  Form1.Free;
  //форму закрыли - освобождаем память...
end;



Модуль с формой должен теперь стать такого вот вида:


Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

procedure ShowForm;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure ShowForm;
begin
  Form1 := TForm1.Create(Application);
  //создали форму
  Form1.ShowModal;
  //показали в модальном режиме
  Form1.Free;
  //форму закрыли - освобождаем память...
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Превед!!!!');
end;

end.



Тепрь осталось только добавить нашу процедуру ShowForm в экспорт библиотеки:

Пишем в коде самой DLL следующее:

Код

exports ShowForm;



Код библиотеки теперь должен выглядеть так:


Код

library Project1;

uses
  SysUtils,
  Classes,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

exports ShowForm;

begin
end.



Все. Теперь жмем File -> Save All и сохраняем библиотеку и форму в один каталог. Проект библиотеки я назвал DLLProj.

Теперь осталось только скомпилировать библиотеку нажав CTRL + F9.

Все. Снова жмем Close All в Delphi.


Сейчас мы создадим программу, которая эту DLL будет загружать.
Жмем File -> New-> Application.


Сохраняем этот проект в папку, куда уже была сохранена библиотека.

Теперь импортируем нашу функцию ShowForm.

Пишем в разделе implementation формы нашей программы следующее:

Код


procedure ShowForm; external 'DLLProj.dll'; 


Все. Теперь эту процедуру можно вызывать.


Кстати, скажу. В delphi есть такие директивы, как name и index. С помощью них можно было экспортировать нашу процедуру из DLL под каким-то именем или номером. Но тут нам это не требуется.

Так, я что-то отвлекся.

Кладем на форму в нашем приложении кнопку и в её обработчике вызываем нашу функцию, полученную из библиотеки:

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowForm;
end;



Модуль формы в приложении теперь должен выглядеть вот так:

Код

unit ProgForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

procedure ShowForm; external 'DLLProj.dll';

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowForm;
end;

end.

 
Все!!! Сохранить проект мы уже сохранили - теперь компилируем и запускаем.

Результат - при нажатии кнопки из программы показывается форма находящаяся в DLL.

Пример всего этого дела в аттаче.
Об остальном напишу чуть позже.


Это сообщение отредактировал(а) THandle - 26.8.2008, 17:45

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  1.rar 331,47 Kb
PM   Вверх
THandle
Дата 27.8.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Ну чтож. Не вижу ничего такого, что мешало бы мне продолжить повествование smile

Итак, неявная загрузка:

Создаем библиотеку. (Как это делать описано в предыдущем посте)

Точно так же создаем форму, пишем тот же обработчик для положенной на нее для красоты кнопки.

В принципе все это можно делать читая предыдущий пост. smile

В общем делаем точно такую же DLL. Можно даже ту скопировать smile

Сохраняем её в какую-нибудь папочку, компилируем...

Теперь закрываем, как и в прошлый раз, все проекты в Delphi, и создаем новое приложение.

Никаких процедур из библиотеки не импортируем, а сразу кладем на форму кнопку и пишем такой вот обработчик:


Код

procedure TForm1.Button1Click(Sender: TObject);
var
  LDllHandle : THandle;
  LProc : procedure;
begin
  //загружаем библиотеку...
  LDllHandle := LoadLibrary('DLLProj.dll');
  //дальнейший код выполнится только если библиотеку удалось загрузить
  if LDllHandle <> 0 then
    try
      //получаем адрес нашей процедуры
      @LProc := GetProcAddress(LDllHandle, 'ShowForm');
      //Вызываем её. Тут конечно можно еще проверку сделать - получили адрес или нет, но это и так, думаю, ясно
      LProc;
    finally
      //в любом случае - были ошибки, или нет - выгружаем библиотеку назад
      FreeLibrary(LDllHandle);
    end;
end;



Все. Сохраняем проект в папочку вместе с библиотекой и можно запускать. Пример в аттаче. Сейчас буду писать про ресурсы.


Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  2.rar 331,69 Kb
PM   Вверх
THandle
Дата 28.8.2008, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Ну а теперь последнее - загрузим в ресурсы DLL картинку.

Какие типы данных можно запихнуть в ресурсы - можно посмотреть тут: http://msdn.microsoft.com/en-us/library/aa381043(VS.85).aspx

Так для чего нам нужно помещать нашу картинку в ресурсы?

1. Чтобы не таскать отдельных за своей программой - картинка будет находится в ресурсах библиотеки/программы(это смотря куда её запихнуть!!!). К тому же отдельный файл легко можно удалить - и все, наша программа останется без картинки. smile 
2. Нам надобно научится это делать. Не так ли?


Почему мы будем помещать картинку именно в ресурсы DLL, а не программы?

Да, патаму чта аффтару темы так захотелось(в ICQ) smile 


Итакс, начнем.


Сначала мы создадим папку, где разместим проект.
У меня путь к ней будет такой:

Цитата

F:\DLL\3


Так вот. Папку создали. Надеюсь с этим особых проблем не возникло... Едем дальше...

Теперь берем любую картинку с расширением BMP, лучше не очень большую. Смысла в большой нету.
Копируем её в нашу папку.

Картинку у меня зовут так:

Цитата

kartinko.bmp



user posted image


Так. Картинка есть.

Теперь открываем Delphi. (У меня, как вы наверное знаете, на данный момент стоит 7 версия. Надо ставить 2007... но лень...)

Жмем Филе->Клосе Алл.

Теперь создаем DLL.

Создавать будем так:

File -> New -> Other -> DLL Wizard

Создав библиотеку мы сразу же сохраняем её в нашу папку. Я назвал проект DLLProj.dpr.

Теперь, (Внимание!!!) сворачиваем, а не закрываем Delphi.

Открываем любой текстовый редактор(я предпочитаю Notepad++ или ASUE(виноват - "водка"). Создаем пустой текстовый документ. Сохраняем его в нашу папочку под следующим именем:

Цитата

resbmp.rc



Примечание:
 в дальнейшем, если у вас имена файлов не совпадают с моими - настоятельно рекомендую везде писать имена СВОИХ файлов, а не моих.

Теперь пишем в этом файле:

Код

KARTINKO BITMAP kartinko.bmp


Что это такое? Это описание файла ресурсов с одним пунктом данных внутри.
Это - наша картинка.

Тут:

KARTINKO - имя, с которым данные будут помещены в ресурс.
BITMAP - тип данных.
kartinko.bmp - файл, откуда эти данные(картинка) берутся.

Теперь сохраняем файл. Текстовый редактор закрываем.

Теперь запускаем командную строку Windows(cmd), и пишем в ней следующее:

Код

Brcc32 F:\DLL\3\resbmp.rc



Цитата


Примечание:
 в дальнейшем, если у вас имена файлов не совпадают с моими - настоятельно рекомендую везде писать имена СВОИХ файлов, а не моих.


Если все прошло успешно и компилятор ресурсов, который мы вызывали в командной сроке, не выдал никаких ошибок - в нашей папке должен появится файл:

Цитата

resbmp.res


Если это так, то едем дальше, иначе - устраняем ошибки компиляции ресурса.

После этого разворачиваем с панели задач Delphi. Все остальные наши манипуляции будут происходить там.

Теперь подключим наш ресурс к нашей же(ну надо же!!!) DLL, с помощью директивы компилятора {$R}:

Код

{$R resbmp.res}


Наш проект выглядит теперь так:

Код

library DLLProj;

uses
  SysUtils,
  Classes;

{$R resbmp.res}

begin
end.


Теперь жмем пункт меню New -> Form. Создаем форму.

Кладем на форму два компонента - TImage и TButton.

Так зачем мы выполняли столько манипуляций, когда можно добиться того же результата просто загрузив нужную картинку в Image с помощью свойства Picture? smile 

Эээ... Товарищи... Надо все уметь делать вручную smile 

Так вот. Положили мы теперь эти компоненты. Что дальше?

А дальше тыкаем два раза на кнопке мышем, чтобы создать обработчик события OnClick.

В нем мы будем загружать картинку из ресурсов в DLL в наш компонент TImage.

Как вообще можно загрузить картинку из ресурсов? Вариантов очень много. Это и многофункциональный LoadImage, и более мелкоспециализированные функции типа LoadBitmap, LoadIcon, это и ресурсный поток... В TBitmap можно еще загрузить с помощью методов:

Код

LoadFromResourceName

LoadFromResourceID



В общем вариантов уйма и советую вам со всеми познакомится smile Но сейчас мы будем использовать самый простой в нашем случае - LoadBitmap.


Как видно из описания функции - первый параметр это дескриптор модуля, откуда будет браться ресурс. В нашем случае это HInastance.
Второй параметр это имя картинки в ресурсе:

Цитата

KARTINKO - имя, с которым данные будут помещены в ресурс.


Теперь осталось только написать в обработчике OnClick нашей злостчастной кнопки код на загрузку картинки из ресурса:

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  Image1.Picture.Bitmap.Handle := LoadBitmap(HInstance, 'KARTINKO'); 
end;


Теперь нам осталось только где-то создать наше окошко. Опять будем писать процедуру и экспортировать её из DLL?
Фигвам, а не процедура. Напишем все в самой точке входа DLL(вообще есть всякие DLL_PROCESS_ATTACH, DLL_PROCESS_DETACH, но с ними мы заморачиваться не будем, а сделаем все просто и ясно:
Код


library DLLProj;

uses
  SysUtils,
  Classes,
  FormDLL in 'FormDLL.pas' {Form1};

{$R resbmp.res}

begin
  Form1 := TFOrm1.Create(nil);
  Form1.ShowModal;
  Form1.Free;
end.



Да. Именно так теперь выглядит код самой библиотеки.

Теперь жмем File->Save all. Сохраняем рядом с проектом библиотеки еще несохраненную форму. Ну и саму DLL естественно сохраняем.
Теперь компилируем с помощью CTRL+F9 и спокойно жмем File->Close ALL.

Далее создаем новый проект: File->New->Application.

Бросаем на форму кнопку.

Пишем в её обработчике:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  LDllHandle : THandle;
begin
  LDllHandle := LoadLibrary('DllProj.dll');
  FreeLibrary(LDllHandle);
end;


Сохраняем проект в нашу папочку. Компилируем. Запускаем. Все.

Проект в аттаче.

Присоединённый файл ( Кол-во скачиваний: 20 )
Присоединённый файл  3.rar 333,69 Kb
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0957 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.