Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание функций в ран-тайме (?) / 6 сообщений из 6, страница 1 из 1
23.06.2021, 17:07
    #40079643
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание функций в ран-тайме (?)
работаю с группой библиотек, каждой надо передать коллбэк
Передаю её при начале работы с библиотекой
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  procedure log(ARef: PAnsiChar; ACateg: Int32); cdecl;
var
  str: string;
begin
  str := 'Log: ' + IntToStr(ACateg) + ' ' + ResultToString(ARef);
  OutputDebugString(PChar(str));
end;
...
  FLib := LoadLibrary(PWideChar(AFileName));
  if FLib = 0 then
    raise Exception.CreateFmt('Не удалось загрузить библиотеку %s : %s', [AFileName, SysErrorMessage(GetLastError)]);
  try
    FInitFunc := GetProcAddress(FLib, 'init');
    FCallFunc := GetProcAddress(FLib, 'callFunc');
    if not Assigned(FInitFunc) then
      raise Exception.CreateFmt('Библиотека %s не содержит функцию %s', [AFileName, 'init']);
    if not Assigned(FCallFunc) then
      raise Exception.CreateFmt('Библиотека %s не содержит функцию %s', [AFileName, 'callFunc']);

    FInitFunc(@newMemory, @ACallBackFunc, @log);




Хочу различать - из какой библиотеки пришел log

Можно ли как-то изящно передавать одну функцию во все библиотеки. чтобы потом иметь возможность различать откуда

Или как-то в ран-тайме конструировать функции? Типа как MakeObjectInstance
...
Рейтинг: 0 / 0
23.06.2021, 17:22
    #40079646
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание функций в ран-тайме (?)
Cobalt747,

Добавить в функцию каллбэка еще и имя вызывающей библиотеки?
...
Рейтинг: 0 / 0
23.06.2021, 17:22
    #40079647
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание функций в ран-тайме (?)
Cobalt747Можно ли как-то изящно передавать одну функцию во все библиотеки. чтобы потом иметь
возможность различать откуда

Для этого все нормальные функции, принимающие коллбэк, обычно принимают ещё один
дополнительный параметр, который скармливают коллбэку как есть:
Код: sql
1.
2.
3.
4.
Procedure foo(callback: CallbackFunc; param: Pointer);
begin
   callback(param);
end;


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.06.2021, 18:36
    #40079663
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание функций в ран-тайме (?)
Если нет возможности влиять на интерфейс, то

function Log()...

function Log1()
begin
Log('DLL1', ...)
end

function Log2()
begin
Log('DLL2', ...)
end

но лучше добавить параметр UserData
...
Рейтинг: 0 / 0
23.06.2021, 19:08
    #40079678
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание функций в ран-тайме (?)
Cobalt747

Хочу различать - из какой библиотеки пришел log


Если нет возможности добавить пользовательский параметр, смотрите на адрес возврата: для разных библиотек он будет разным, скорее всего.
Если вызов callback делает сама библиотека, то из адреса возврата можно получить имя библиотеки.
...
Рейтинг: 0 / 0
24.06.2021, 07:12
    #40079733
Aniskin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание функций в ран-тайме (?)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание функций в ран-тайме (?) / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]