Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Выполнение процедуры по адресу

Delphi , Компоненты и Классы , Процедуры и функции

Выполнение процедуры по адресу

Автор: Peter Below


var
  F: procedure(x, y: double);

@F := GetProcAddress(hDLL, 'SOMEPROC');
F(3, 4);

Ключом здесь является использование оператора @, располагаемого с левой части процедурной переменной. Он говорит компилятору: "Не волнуйтесь здесь о совместимости типов, просто присвойте полученный в правой части выражения адрес переменной в левой части выражения (и процедурные переменные являются переменными-указателями).

Here's the translation of the text into Russian:

Код-сниппет написан на языке Pascal и использует функцию GetProcAddress для получения адреса процедуры из динамической библиотеки (DLL).

Вот разбивка каждого ряда: 1. var F: procedure(x, y: double);: Это объявление переменной процедуры, называемой F, которая принимает два параметра типа double, x и y. 2. @F := GetProcAddress(hDLL, 'SOMEPROC');: Эта строка использует функцию GetProcAddress для получения адреса процедуры, называемой 'SOMEPROC', из DLL-файла, указанного handle hDLL. Символ @ используется для дедерференции результата, что означает присваивание полученного адреса процедуры переменной F. Поясним, что F не только переменная процедуры, но и алиас для actual memory address процедуры. 3. F(3, 4);: Эта строка вызывает процедуру, хранящуюся в переменной F, с аргументами 3 и 4.

Ключевым takeaway здесь является использование символа @ для дедерференции результата GetProcAddress. Это говорит компилятору не беспокоиться о совместимости типов между левой и правой сторонами выражения, а вместо этого просто присваивает значение правой стороны переменной F. Поскольку F - это переменная процедуры, она может хранить адрес памяти.

Альтернативным решением является использование функции GetProcAddress для получения указателя на функцию и затем вызова этого указателя напрямую. Например:

function GetFunction(hDLL: HMODULE; procName: string): TFunProc;
begin
  Result := GetProcAddress(hDLL, procName);
end;

procedure CallSomeProcedure(x, y: double);
var
  pSomeProc: TFunProc;
begin
  pSomeProc := GetFunction(hDLL, 'SOMEPROC');
  if Assigned(pSomeProc) then
    pSomeProc(x, y);
end;

Эта APPROACH более явна и avoids использование символа @. Однако она достигает того же результата: получение адреса процедуры из DLL и вызов этой процедуры с аргументами.

В статье описывается использование оператора @ в Delphi для выполнения процедуры из динамической библиотеки, не учитывая типы параметров.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Процедуры и функции ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru Rambler's Top100

Время компиляции файла: 2024-05-10 07:13:18
2024-05-19 11:53:14/0.010326147079468/2