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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как в dll форму засунуть, надо форму спрятать :-) 
:(
    Опции темы
DYUMON
Дата 13.3.2007, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хочу в библиотеку форму засунуть. Мне надо чтоб одно из окон в моей программе появлялось только при наличие этой библиотеки. Раньше такое не делал так что в непонятках  smile 


--------------------
Всех программистов надо посадить на целероны, что бы впредь головой думали что пишут.
user posted image
PM MAIL ICQ Skype   Вверх
Snowy
Дата 13.3.2007, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



И не делай.
Решение далеко от идеала.
Наверняка твою задачу можно решить по другому.
Не нужно решать задачу влоб.
PM MAIL   Вверх
Alexeis
Дата 13.3.2007, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



DYUMON, геморройно очень. Лучше тогда уж использовать bpl-ки. Dll-ки позволяют экспортировать только функции. Но с Bpl ками прийдется тащить еще весь набор стандартных Bpl ок, а точнее тех, чьи классы нужны.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MetalFan
Дата 14.3.2007, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Цитата(DYUMON @  13.3.2007,  19:50 Найти цитируемый пост)
одно из окон в моей программе появлялось только при наличие этой библиотеки

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


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
DYUMON
Дата 14.3.2007, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как говорится Прежде чем спросить пороися в своих караманах. smile  после того как создал тему на своём винте нашел статью как это сделать кому надо выкладываю.
Автор стать Horrific aka Флёнов Михаил все права на статью принадлежат ему.

Начнём с создания DLL. Первое, что надо сделать, это создать соответствующий проект. Щёлки File->New. Перед тобой откроется уже знакомое окно создания проекта. Выбери пункт DLL и щёлкай "ОК" (рис. 1). Delphi создаст тебе пустой проект DLL файла. Выглядит он так:

Код

library ProjectDLL;

{
 Здесь идёт куча
 информативных строк.
}

uses
  SysUtils,
  Classes;

{$R *.RES}

begin
end.


В качестве информативных строк тебя предупреждают, что если ты будешь использовать динамические строки, то надо подключить в раздел uses модуль ShareMem. Я этот модуль не подключил, потому что для примера мы не будем использовать строки. Удаляй эти комментарии, чтобы они не мозолили твои глаза.

Мы засунем в DLL файл одну лишь процедуру и одну форму, поэтому сейчас мы должны это описать:

Код

library ProjectDLL;

uses
  SysUtils, Classes;

{$R *.RES}

exports ShowAbout index 10;

begin
end.


Я добавил только одну строку exports ShowAbout index 10; . Что это означает? Ключевое слово export говорит о том, что я буду экспортировать процедуру или функцию. После этого идёт имя этой процедуры ShowAbout . Далее идёт ключевое слово index и число. Каждой процедуре, которую ты хочешь экспортировать ты должен назначить индекс или имя (можно и то и другое сразу). По этому индексу или имени программа будет вызывать экспортируемую функцию. Индексы и имена должны быть уникальными!!! Вот несколько примеров:

Код

exports
  Func1 index 10 name 'Fun',
  Func2 Insert,
  Func3 index 11,
  Func4 index 11,//Ошибка, такой индекс уже существует
  Func5 name 'Don';


Через индексы функции вызываются быстрее, поэтому я использую их. Объявлять можно и так:

Код

exports Func1 index 10 name 'Fun',
exports Func2 Insert,
exports Func3 index 11,


Но это всё примеры. У нас будет только ShowAbout с индексом 10.
Logo


Теперь щёлкаем File->New Form , чтобы создать новую форму. Нарисуй на ней что-нибудь, можно даже то, что сделал я (рис 2).

Переходи в текст модуля. В разделе var, после объявления формы опиши процедуру ShowAbout:

Код

var
  Form1: TForm1;
  procedure ShowAbout(Handle: THandle);export;stdcall;


Опять присутствует ключ export и добавлен ещё stdcall. Второй ключ говорит о том, что нужно использовать стандартный вызов.

Теперь напишем саму функцию после implementation и ключа {$R *.DFM}:

Код

procedure ShowAbout(Handle: THandle);
begin
 //Установить указатель на приложение
 Application.Handle := Handle;
 //Создать форму
 Form1:= TForm1.Create(Application);
 //Отобразить
 Form1.ShowModal;
 //Очистить
 Form1.Free;
end;


Откомпилируй (Ctrl+F9) и DLL-файл готов. Можно закрывать этот проект (File->Close All) и создавать новый (File->New Application).

В новом проекте переходим в текст формы и объявляем функцию ShowAbout:

Код

unit Unit2;

interface

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

procedure ShowAbout(Handle: THandle)stdcall;

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

var
  Form1: TForm1;
  procedure ShowAbout;external 'ProjectDLL.dll' index 10;

implementation


Объявление происходит два раза. Первый раз после раздела uses и перед type нужно написать procedure ShowAbout(Handle: THandle)stdcall; . А второй раз в разделе var пишем procedure ShowAbout;external 'ProjectDLL.dll' index 10; . Здесь в кавычках стоит имя DLL файла. Пиши его полностью (вместе с расширением), потому что без расширения DLL будет не найдена в Windows NT. Обязательно соблюдай индексы и параметры процедуры. При втором объявлении параметры указывать не надо, только имя.

Теперь ставим на форму кнопочку и пишем по её событию
Код


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


Запускаем и наслаждаемся. Удачи тебе. 



--------------------
Всех программистов надо посадить на целероны, что бы впредь головой думали что пишут.
user posted image
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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