Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2008, 17:56   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию Ещё вопрос о длл...

Привет всем!
Вот у меня возник вопрос!
Вот код EXE:
Код:
unit test_form;

interface

uses
  Windows, Controls, SysUtils, Variants, Classes, Messages, Forms,
  StdCtrls, ExtCtrls, iniFiles, ImgList, dialogs, AtomButton, shellApi,
  ExtDlgs, Buttons, Graphics, jpeg, Grids, ValEdit, ComCtrls, TimeDateLabel,
  AtomButton2;

type
  Ttest_form1 = class(TForm)
    comp: TTimeDateLabel;
    tAtomButton21: tAtomButton2;
    tAtomButton22: tAtomButton2;
    tAtomButton23: tAtomButton2;
    Edit1: TEdit;
    tAtomButton24: tAtomButton2;
    procedure tAtomButton24Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure tAtomButton23Click(Sender: TObject);
    procedure tAtomButton22Click(Sender: TObject);
    procedure tAtomButton21Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  test_form1: Ttest_form1;
  h: tHandle;
  creating: procedure(const value: pointer); stdCall;
  set12: procedure(const value: boolean); stdCall;
  isPm: function: boolean; stdCall;
  getTime: function: pChar; stdCall;
  setRefreshInterval: procedure (const value: integer); stdCall;
implementation

{$R *.dfm}

procedure Ttest_form1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   FreeLibrary(h);
end;

procedure Ttest_form1.FormCreate(Sender: TObject);
begin
   h := loadLibrary(pChar(extractFilePath(application.ExeName)+'dll\dll.dll'));
   @creating := getProcAddress(h, 'creating');
   @set12 := getProcAddress(h, 'set12');
   @isPm := getProcAddress(h, 'isPm');
   @getTime := getProcAddress(h, 'getTime');
   @setRefreshInterval := getProcAddress(h, 'setRefreshInterval');

   creating(@comp);
end;

procedure Ttest_form1.tAtomButton21Click(Sender: TObject);
begin
   set12(not comp.is12);
end;

procedure Ttest_form1.tAtomButton22Click(Sender: TObject);
begin
   if isPm then showMessage('Is MP') else showMessage('Is AM');
end;

procedure Ttest_form1.tAtomButton23Click(Sender: TObject);
begin
   showMessage(strPas(getTime));
end;

procedure Ttest_form1.tAtomButton24Click(Sender: TObject);
begin
   setRefreshInterval(strToInt(edit1.Text));
end;

end.
а это код DLL:
Код:
library dll;


uses
  SysUtils,
  TimeDateLabel,
  forms,
  Classes;

{$R *.res}
var
tdLabel: tTimeDateLabel;

procedure creating(const value: pointer); stdCall;
begin
   tdLabel := tTimeDateLabel.Create(application);
   tdLabel := tTimeDateLabel(value^);
end;

procedure set12(const value: boolean);stdCall;
begin
   tdLabel.is12 := value;
end;

function isPm: boolean; stdCall;
begin
   result := tdLabel.isPm;
end;

function getTime: pChar; stdCall;
begin
   result := pChar(tdLabel.Caption);
end;

procedure setRefreshInterval(const value: integer); stdCall;
begin
   tdLabel.refreshInterval := value;
end;

exports creating, set12, isPm, getTime, setRefreshInterval;

begin
end.
Если прога весит в памяти и не используеться, выг7рузиться ли из памяти dll? Не выскачит ли ошибка при скажем вызове showMessage(strPas(getTime));??? Я знаю, что библиотеки выгружаються от туда по мере надабности.
Altera вне форума Ответить с цитированием
Старый 15.05.2008, 18:11   #2
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

По сути дела нет, если Вы её сами принудительно не выгрузите.
При вызове "getTime" она автоматически загрузится(должна) если была выгружена как не использующаяся библиотека.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 15.05.2008, 18:14   #3
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
При вызове "getTime" она автоматически загрузится(должно) если была выгружена как не использующаяся библиотека.
А переменная tdLabel: tTimeDateLabel; обнулиться?
Altera вне форума Ответить с цитированием
Старый 15.05.2008, 18:17   #4
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Цитата:
Сообщение от Altera Посмотреть сообщение
А переменная tdLabel: tTimeDateLabel; обнулиться?
Если дллка выгрузится из памяти,то да, в противном случее нет. (ведь она глобальная)
Вообще лучше не выгружать длл если надо сохранять какие-то данные или перебрасывать их в прога, потом отправлять их длл(это только если не обойтись без выгрузки)
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 15.05.2008, 18:37   #5
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Я не собираюсь ничего выгружать до завершения работы программы...
Altera вне форума Ответить с цитированием
Старый 15.05.2008, 18:40   #6
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Методом "loadLibrary" (когда я загружаю длл) у меня всё сохраняется.
а что мучаться... протестировали бы давно и спрашивать не пришлось бы
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 16.05.2008, 06:51   #7
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

И на этом big thank's
Altera вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10
TObject *Sender sergei64_89 Общие вопросы C/C++ 1 06.06.2008 13:36
Вопрос о КПК N!ckeL Свободное общение 3 05.06.2008 22:06
вопрос про ADO Cantana Помощь студентам 14 12.09.2007 15:33