![]() |
![]() |
![]() |
Явный
вызов
Явный вызов динамической библиотеки подразумевает создание программистом соответствующего исходного кода. Ему необходимо предусмотреть загрузку DLL, получение адресов переменных процедурного типа для используемых функций и процедур, выгрузку DLL.
Пример явного вызова функций динамической библиотеки имеется в демонстрационном приложении DemoDLL2, которое по выполняемым функциям полностью совпадает с предыдущим примером.
Листинг 28.6. Модуль главной формы проекта DemoDll2
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
StandardProc = function(AText: String): Boolean;
TMainForm = class(TForm)
Editl: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
LabelS: TLabel;
procedure FormShow(Sender: TObject);
procedure EditlExit(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Edit2Exit(Sender: TObject);
procedure EditSExit(Sender: TObject);
private
DLLHandle: THandle;
LoadError: Word;
IsValidlnt: StandardProc;
IsValidDate: StandardProc;
ValidTime: StandardProc;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation {$R *.DFM}
procedure TMainForm.FormShow(Sender: TObject);
begin
DLLHandle := LoadLibrary('DataCheck');
if DLLHandle = 0 then begin if GetLastError = ERROR_DLL_NOT_FOUND
then ShowMessagef'Ошибка загрузки DLL');
Close;
end;
@IsValidInt := GetProcAddress(DLLHandle, 'IsValidlnt');
SIsValidDate := GetProcAddress(DLLHandle, 'IsValidDate');
SValidTime := GetProcAddress(DLLHandle, 'ValidTime');
end;
procedure TMainForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin if DLLHandle <> 0
then FreeLibrary(DLLHandle);
end;
procedure TMainForm.EditlExit(Sender: TObject);
begin
if not IsValidlnt(Editl.Text)
then Edit2.Clear;
end;
procedure TMainForm.Edit2Exit(Sender: TObject);
begin if not IsValidDate(Edit2.Text)
then Editl.Clear;
end;
procedure TMainForm.EditSExit(Sender: TObject);
begin
if not ValidTime(Edit3.Text)
then Edit3.Clear;
end;
end.
Загрузка динамической библиотеки DataCheck осуществляется в методе-обработчике FormShow при помощи функции LoadLibrary. Имя динамической библиотеки может не содержать маршрута, если файл DLL расположен в одном каталоге с программой. Если в этом каталоге файл DLL не найден, поиск последовательно проводится в текущем каталоге, \SYSTEM и каталогах из перечня Path.
Так как для этой системной функции не создается исключительная ситуация, то следом предусмотрен контроль возможных ошибок. Функция GetLastError возвращает код последней ошибки.
Примечание
Код ошибки ERROR_DLL_NOT_FOUND, Наряду со многими другими кодами, содержится в файле Windows.PAS.
Если библиотека успешно загружена, в три процедурные переменные типа standardProc передаются адреса соответствующих функций DLL. Процедурный тип standardProc объявлен перед классом формы. Для этого используется системная функция GetProcAddress.
В дальнейшем созданные таким образом функции применяются для вводимых значений в компонентах TEdit.
При закрытии приложения необходимо выгрузить все используемые динамические библиотеки Припомощи системной функции FreeLibrary.
![]() |
![]() |
![]() |
1. Электромагнитная волна (в религиозной терминологии релятивизма - "свет") имеет строго постоянную скорость 300 тыс.км/с, абсурдно не отсчитываемую ни от чего. Реально ЭМ-волны имеют разную скорость в веществе (например, ~200 тыс км/с в стекле и ~3 млн. км/с в поверхностных слоях металлов, разную скорость в эфире (см. статью "Температура эфира и красные смещения"), разную скорость для разных частот (см. статью "О скорости ЭМ-волн")
2. В релятивизме "свет" есть мифическое явление само по себе, а не физическая волна, являющаяся волнением определенной физической среды. Релятивистский "свет" - это волнение ничего в ничем. У него нет среды-носителя колебаний.
3. В релятивизме возможны манипуляции со временем (замедление), поэтому там нарушаются основополагающие для любой науки принцип причинности и принцип строгой логичности. В релятивизме при скорости света время останавливается (поэтому в нем абсурдно говорить о частоте фотона). В релятивизме возможны такие насилия над разумом, как утверждение о взаимном превышении возраста близнецов, движущихся с субсветовой скоростью, и прочие издевательства над логикой, присущие любой религии.
4. В гравитационном релятивизме (ОТО) вопреки наблюдаемым фактам утверждается об угловом отклонении ЭМ-волн в пустом пространстве под действием гравитации. Однако астрономам известно, что свет от затменных двойных звезд не подвержен такому отклонению, а те "подтверждающие теорию Эйнштейна факты", которые якобы наблюдались А. Эддингтоном в 1919 году в отношении Солнца, являются фальсификацией. Подробнее читайте в FAQ по эфирной физике.
|
![]() |