Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Exe + DLL  [new]
antox
Member

Откуда: РФ
Сообщений: 1050
Подскажите, как вызвать функцию exe из dll ?

В ехе загружаю dll, все норм, но иногда необходимо, чтобы dll вызывала функцию ехе с параметрами

Я так понимаю, что для этого необходимо передавать функцию ехе в длл в виде параметра? Или можно как-то по-другому? Если нельзя, то как правильно передать фцию в качестве параметра?
15 июн 19, 16:38    [21909133]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48688

Читай что такое callback и с чем его едят. А лучше - забудь про DLL, это чаще всего
совершенно ни к чему.

Posted via ActualForum NNTP Server 1.5

15 июн 19, 17:22    [21909142]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
ёёёёё
Member

Откуда:
Сообщений: 1417
antox,

см. "процедурные типы".
15 июн 19, 17:50    [21909145]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
ёёёёё
Member

Откуда:
Сообщений: 1417
antox,

https://docs.microsoft.com/en-us/windows/desktop/api/libloaderapi/nf-libloaderapi-loadlibraryexa + DONT_RESOLVE_DLL_REFERENCES

Например. Еще есть интерфейсы, процедурные типы. Можно в dll объект передать, а внутри длл обращаться к методу объекта. Или сразу процедуру.
15 июн 19, 17:53    [21909146]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 550
Правильное решение - спроектировать архитектуру так, чтобы у dll не было необходимости обращаться к функциям из exe
15 июн 19, 17:55    [21909147]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
x1ca4064
Member

Откуда:
Сообщений: 1013
antox

Я так понимаю, что для этого необходимо передавать функцию ехе в длл в виде параметра? Или можно как-то по-другому?


Еще EXE может экпортировать функцию, а DLL, в свою очередь, импортировать через GetProcAddress
15 июн 19, 18:07    [21909148]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
GunSmoker
Member

Откуда:
Сообщений: 3110
antox, тынц.
15 июн 19, 20:21    [21909166]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
antox
Member

Откуда: РФ
Сообщений: 1050
Dimitry Sibiryakov,

Вот все говорят dll не применять, но как тогда реализовать, общие файлы для нескольких программ? Но так что-нибудь переделаешь, а через несколько месяцев не поймёшь, почему другая программа (где это не было учтено) перестала работать... Кто-то рекомендует использовать bpl, но детально непонятен алгоритм...
16 июн 19, 02:18    [21909204]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
antox
Member

Откуда: РФ
Сообщений: 1050
*реализовать?
16 июн 19, 02:19    [21909205]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
rgreat
Member

Откуда:
Сообщений: 5454
antox,

Зачем тебе "общие файлы для нескольких программ"?
16 июн 19, 02:21    [21909206]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
antox
Member

Откуда: РФ
Сообщений: 1050
В них общие формы, процедуры и ф-ции, общие классы. Если в каждую включать копии, то потом задолбаешься во все вносить правки, в ТЧ связанные с новым функционалом
16 июн 19, 03:28    [21909207]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
rgreat
Member

Откуда:
Сообщений: 5454
antox,

Зачем тебе общий DLL, если можно в разных проектах использовать общие юниты?

Даже самый плохой случай, когда надо изменить функцию в DLL - так или иначе везде эту DLL обновлять.
Во всех проектах что её функции используют.

Так какая по большому счету разница будет это DLL или сами EXE-шники проектов?

А вот гемороя в разработке значительно меньше.

Хотя всякие нюансы могут быть. Типа проектов которые вы ведете в очень разных версиях среды.
16 июн 19, 03:34    [21909208]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
antox
Member

Откуда: РФ
Сообщений: 1050
rgreat,

Согласен на общие unit-ы )

Кто организационно выстраивать работу? Что бы потом случайно не сломать из одной программы работу другой? Просто не всегда помнишь, где ещё это используется и ХЗ, как это отслеживать
16 июн 19, 03:40    [21909209]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
rgreat
Member

Откуда:
Сообщений: 5454
antox
Кто организационно выстраивать работу? Что бы потом случайно не сломать из одной программы работу другой? Просто не всегда помнишь, где ещё это используется и ХЗ, как это отслеживать
Не помнишь - записывай. ;)
И тестируй все что связано с изменениями перед релизом.
16 июн 19, 04:04    [21909211]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
rgreat
Member

Откуда:
Сообщений: 5454
Еще можно при любом изменении общей функции менять его название.

Так по любому придеться править связаные проекты, ибо компитятор пропустить по забывчивости не даст. ;)
16 июн 19, 04:07    [21909212]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
rgreat
Member

Откуда:
Сообщений: 5454
Менять название этой функции в смысле. :)
Или добавлять новую, с измененным функционалом, не меняя старую.
16 июн 19, 04:18    [21909217]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
antox
Member

Откуда: РФ
Сообщений: 1050
А как версии отслеживать? Просто писать вначале основного unit-а и только его делать общим, а остальные уже только доступные для него?
16 июн 19, 04:35    [21909218]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
rgreat
Member

Откуда:
Сообщений: 5454
antox
А как версии отслеживать? Просто писать вначале основного unit-а и только его делать общим, а остальные уже только доступные для него?

Версии чего?

unit MyCommonFunctions

function MyFunctionXXX_v1(params);
function MyFunctionXXX_v2(params);
function MyFunctionXXX_v3(params);
16 июн 19, 05:27    [21909221]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
rgreat
Member

Откуда:
Сообщений: 5454
можно еще добавить:

const
MyCommonFunctionsUnitVersion = XXX;
16 июн 19, 05:34    [21909222]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48688

antox
Кто организационно выстраивать работу? Что бы потом случайно не сломать из одной программы
работу другой?

Работу другой программы ты не сломаешь если каждый отдельный модуль будет работать так как
задумано. Для того, чтобы это гарантировать, есть юнит-тесты.

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

Ну и система контроля версий это must have по-любому.

Posted via ActualForum NNTP Server 1.5

16 июн 19, 12:38    [21909275]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
antox
Member

Откуда: РФ
Сообщений: 1050
Ладно, пока все норм.

Хочу подключать к программам модуль 1 (unit1), в котором есть ф-ции для вызова их из программ, уже этот модуль вызывает ф-ции основного unit2. ф-ции из unit2 недоступны другим модулям, а доступны только unit1 (uses unit2, во всех остальных только uses1).

Проблема в том, что типы описаны в unit2, как можно не описывая их заново в unit1 и не подключая ко всем модулям кроме unit1 еще и unit2 использовать переменные типов, указанных в unit2 в других модулях?

Можно делать так, как показано ниже? Или есть другие решения или лучше вообще избегать такого?

unit2
type
 TMyRec = record
   s:string;
   i:integer;
 end;


unit1
type
 TMR = TMyRec
17 июн 19, 04:58    [21909437]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
rgreat
Member

Откуда:
Сообщений: 5454
antox,

Ты хочешь странного и странными путями.

В чем смысл объединения всего функционала в 1 юнит?

Что мешает юзать необходимые юниты напрямую без этого странного концентратора?
17 июн 19, 05:31    [21909442]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
antox
Member

Откуда: РФ
Сообщений: 1050
rgreat,

unit2 - будет несколько, они будут содержать разные ф-ции в зависимости от сторонних библиотек
unit1 - будет один со стандартными функциями и будет выполнять разные ф-ции из unit-ов типа unit2

Хочу, что бы мои программы работали одинаково со всеми сторонними библиотеками ч-з единый unit1 и ничего не знали о различиях в unit-ах типа unit2 (которые будут разные)

т.е. в unit1 будет:

function getProc(mr:TMyRec):curency; 
begin
  if *** then result:=unit2a.proc1(mr.i);
  if *** then result:=unit2c.proc2(mr.i)+unit2c.proc2(mr.i);
  if *** then result:=unit2e.proc3(mr.i)+unit2e.proc4(mr.i)+50;
end;


Соответственно хочу в программах только писать: getProc(mr.i), но TMyRec не описан в unit1, он описан в unit2a и т.д. Или в этом случае надо общие unit-ы с объявлением всех общих типов? Или вообще типы описать в unit1, а в unit2х - только уникальные специфические функции?
17 июн 19, 06:14    [21909443]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
rgreat
Member

Откуда:
Сообщений: 5454
Я не знаю нюансов потому советов не дам.

Подумай стоят ли затраты выгоды и делай.
17 июн 19, 06:22    [21909446]     Ответить | Цитировать Сообщить модератору
 Re: Exe + DLL  [new]
x1ca4064
Member

Откуда:
Сообщений: 1013
antox
rgreat,

unit2 - будет несколько, они будут содержать разные ф-ции в зависимости от сторонних библиотек
unit1 - будет один со стандартными функциями и будет выполнять разные ф-ции из unit-ов типа unit2

Хочу, что бы мои программы работали одинаково со всеми сторонними библиотеками ч-з единый unit1 и ничего не знали о различиях в unit-ах типа unit2 (которые будут разные)


Вам нужно не с юнитами заморачиваться, а использовать ООП, т.е. вместо unit1 создайте базовый класс, а вместо нескольких unit2 - наследников этого класса.

type
  TUnit1Base=class
    function Cool(a,b:integer):integer; virtual; abstract;
  end;

  TUnit2=class(TUnit1Base)
    function Cool(a,b:integer):integer; override;
  end;

  TUnit3=class(TUnit1Base)
    function Cool(a,b:integer):integer; override;
  end;


В самой программе используйте базовый класс: procedure MyProc(X:TUnit1Base)
потом передавайте туда потомков: MyProc(TUnit2.Create);
17 июн 19, 08:39    [21909468]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить