Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Exe + DLL / 25 сообщений из 30, страница 1 из 2
15.06.2019, 16:38
    #39826845
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
Подскажите, как вызвать функцию exe из dll ?

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

Я так понимаю, что для этого необходимо передавать функцию ехе в длл в виде параметра? Или можно как-то по-другому? Если нельзя, то как правильно передать фцию в качестве параметра?
...
Рейтинг: 0 / 0
15.06.2019, 17:22
    #39826850
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
Читай что такое callback и с чем его едят. А лучше - забудь про DLL, это чаще всего
совершенно ни к чему.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.06.2019, 17:50
    #39826853
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
antox,

см. "процедурные типы".
...
Рейтинг: 0 / 0
15.06.2019, 17:53
    #39826854
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
antox,

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

Например. Еще есть интерфейсы, процедурные типы. Можно в dll объект передать, а внутри длл обращаться к методу объекта. Или сразу процедуру.
...
Рейтинг: 0 / 0
15.06.2019, 17:55
    #39826855
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
Правильное решение - спроектировать архитектуру так, чтобы у dll не было необходимости обращаться к функциям из exe
...
Рейтинг: 0 / 0
15.06.2019, 18:07
    #39826856
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
antox
Я так понимаю, что для этого необходимо передавать функцию ехе в длл в виде параметра? Или можно как-то по-другому?

Еще EXE может экпортировать функцию, а DLL, в свою очередь, импортировать через GetProcAddress
...
Рейтинг: 0 / 0
15.06.2019, 20:21
    #39826865
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
antox, тынц .
...
Рейтинг: 0 / 0
16.06.2019, 02:18
    #39826883
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
Dimitry Sibiryakov,

Вот все говорят dll не применять, но как тогда реализовать, общие файлы для нескольких программ? Но так что-нибудь переделаешь, а через несколько месяцев не поймёшь, почему другая программа (где это не было учтено) перестала работать... Кто-то рекомендует использовать bpl, но детально непонятен алгоритм...
...
Рейтинг: 0 / 0
16.06.2019, 02:19
    #39826884
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
*реализовать?
...
Рейтинг: 0 / 0
16.06.2019, 02:21
    #39826885
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
antox,

Зачем тебе "общие файлы для нескольких программ"?
...
Рейтинг: 0 / 0
16.06.2019, 03:28
    #39826886
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
В них общие формы, процедуры и ф-ции, общие классы. Если в каждую включать копии, то потом задолбаешься во все вносить правки, в ТЧ связанные с новым функционалом
...
Рейтинг: 0 / 0
16.06.2019, 03:34
    #39826887
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
antox,

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

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

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

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

Хотя всякие нюансы могут быть. Типа проектов которые вы ведете в очень разных версиях среды.
...
Рейтинг: 0 / 0
16.06.2019, 03:40
    #39826888
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
rgreat,

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

Кто организационно выстраивать работу? Что бы потом случайно не сломать из одной программы работу другой? Просто не всегда помнишь, где ещё это используется и ХЗ, как это отслеживать
...
Рейтинг: 0 / 0
16.06.2019, 04:04
    #39826890
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
antoxКто организационно выстраивать работу? Что бы потом случайно не сломать из одной программы работу другой? Просто не всегда помнишь, где ещё это используется и ХЗ, как это отслеживатьНе помнишь - записывай. ;)
И тестируй все что связано с изменениями перед релизом.
...
Рейтинг: 0 / 0
16.06.2019, 04:07
    #39826891
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
Еще можно при любом изменении общей функции менять его название.

Так по любому придеться править связаные проекты, ибо компитятор пропустить по забывчивости не даст. ;)
...
Рейтинг: 0 / 0
16.06.2019, 04:18
    #39826892
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
Менять название этой функции в смысле. :)
Или добавлять новую, с измененным функционалом, не меняя старую.
...
Рейтинг: 0 / 0
16.06.2019, 04:35
    #39826893
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
А как версии отслеживать? Просто писать вначале основного unit-а и только его делать общим, а остальные уже только доступные для него?
...
Рейтинг: 0 / 0
16.06.2019, 05:27
    #39826896
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
antoxА как версии отслеживать? Просто писать вначале основного unit-а и только его делать общим, а остальные уже только доступные для него?
Версии чего?

unit MyCommonFunctions

function MyFunctionXXX_v1(params);
function MyFunctionXXX_v2(params);
function MyFunctionXXX_v3(params);
...
Рейтинг: 0 / 0
16.06.2019, 05:34
    #39826897
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
можно еще добавить:

const
MyCommonFunctionsUnitVersion = XXX;
...
Рейтинг: 0 / 0
16.06.2019, 12:38
    #39826937
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
antoxКто организационно выстраивать работу? Что бы потом случайно не сломать из одной программы
работу другой?

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

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

Ну и система контроля версий это must have по-любому.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.06.2019, 04:58
    #39827049
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
Ладно, пока все норм.

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

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

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

unit2
Код: pascal
1.
2.
3.
4.
5.
type
 TMyRec = record
   s:string;
   i:integer;
 end;



unit1
Код: pascal
1.
2.
type
 TMR = TMyRec
...
Рейтинг: 0 / 0
17.06.2019, 05:31
    #39827052
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
antox,

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

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

Что мешает юзать необходимые юниты напрямую без этого странного концентратора?
...
Рейтинг: 0 / 0
17.06.2019, 06:14
    #39827053
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
rgreat,

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

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

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

Код: pascal
1.
2.
3.
4.
5.
6.
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х - только уникальные специфические функции?
...
Рейтинг: 0 / 0
17.06.2019, 06:22
    #39827056
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
Я не знаю нюансов потому советов не дам.

Подумай стоят ли затраты выгоды и делай.
...
Рейтинг: 0 / 0
17.06.2019, 08:39
    #39827073
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exe + DLL
antoxrgreat,

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

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


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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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);
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Exe + DLL / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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