Страница 3 из 3

Риторический вопрос

Добавлено: 20 Ноябрь 2025, 15:29
ingasoftplus
Кстати, мозг застыл, не пойму что делать. Подскажите

Есть некоторое приложение MultiDLL.
EXE - в нем объявлена глобальная очередь

Код: Выделить всё

MyQ QUEUE
Field1   STRING(20)
Field2   LONG
Field3   BYTE
        END
он заполняется в данном ЕХЕ и т.п.

А есть еще DLL. Так надо в ней читать эту очередь. Я так понимаю, что нужно ее продекларировать с атрибутом EXTERNAL?

Код: Выделить всё

MyQ QUEUE,EXTERNAL
Field1   STRING(20)
Field2   LONG
Field3   BYTE
        END
а не надо ее как-то экспортировать в ехе приложении???

накидайте соображений плиз

Риторический вопрос

Добавлено: 20 Ноябрь 2025, 15:35
FromSPB
ingasoftplus писал(а): 20 Ноябрь 2025, 15:29 а не надо ее как-то экспортировать в ехе приложении???
Из EXE ничего экспортировать не получится.
ingasoftplus писал(а): 20 Ноябрь 2025, 15:29 Кстати, мозг застыл, не пойму что делать.
Передать очередь параметром при вызове какой-то функции из DLL.

Риторический вопрос

Добавлено: 20 Ноябрь 2025, 15:54
Игорь Столяров
ingasoftplus писал(а): 20 Ноябрь 2025, 15:29 накидайте соображений плиз
Ну можно использовать метод предложенный в своё время FinSoftRZ, который к моему удивлению работает.

1. Создаём тип данных с описанием очереди.
2. Объявляем очередь с этим типом в Global Data EXE и указатель на эту очередь в DLL
3. Вызываем функцию в которой передаём указатель и присваиваем его списку.

Код: Выделить всё

SetQTovar            PROCEDURE  (*Q_TovarList qTovarList)
  Code
  If Not (qTovarList &= Null) then Glo:qTovarList &= qTovarList.
Только по здравой логике я бы сделал наоборот.
Т.е. саму очередь объявил бы в DLL, указатель на неё в EXE.
И тогда бы из EXE вызвал функцию для установки указателя на очередь в DLL.

P/S: На всякий случай QUEUE в Global Data есстесно без Thread ...

Риторический вопрос

Добавлено: 20 Ноябрь 2025, 16:01
ingasoftplus
Спасибо всем. вот наткнулся на viewtopic.php?p=23631

Женя пишет + пример там для загрузки есть:
Обычно делается так.
В словаре или в основной DLL которая у вас AllFiles.app описываются глобальные переменные. К примеру:
GLO:Variable1 LONG
GLO:Variable2 LONG
Тогда в любых остальных DLL и EXE они описываются как
GLO:Variable1 LONG,EXTERNAL,DLL
GLO:Variable2 LONG,EXTERNAL,DLL
Получаются общие глобальные переменные, память для которых выделяется в DLL AllFiles.app
очевидно должно работать и для очереди

Риторический вопрос

Добавлено: 20 Ноябрь 2025, 17:19
finsoftrz
Можно в словаре объявлять глобальные очереди, группы, переменные. Тогда все автоматически собирается, как для таблиц. У меня так достаточно много очередей (с thread конечно) используется.

Риторический вопрос

Добавлено: 20 Ноябрь 2025, 17:25
finsoftrz
Игорь Столяров писал(а): 20 Ноябрь 2025, 15:54 Ну можно использовать метод предложенный в своё время FinSoftRZ, который к моему удивлению работает.
Не помню, чтобы я такое предлагал. По похожей схеме можно передавать адрес класса, объявленного в вызывающей процедуре, через long параметр, и работать с его свойствами и методами в вызываемой процедуре. В том числе в разных потоках.

Риторический вопрос

Добавлено: 20 Ноябрь 2025, 17:36
Игорь Столяров
finsoftrz писал(а): 20 Ноябрь 2025, 17:25 Не помню, чтобы я такое предлагал.
Ещё как предлагали ! Я не верил что такое возможно, но сейчас есть места где по другому и сделать нельзя.
Например перебрасывать большие объёмы выбранных в списке записей между потоками и DLL, без файлов и т.д.
Ну правда я расписал по пунктам рабочий вариант, а в свалили всё кучей с loc: и точками ... но я разобрался тогда ! :D

Риторический вопрос

Добавлено: 20 Ноябрь 2025, 18:26
finsoftrz
Во всяком случае, я так с очередями не работаю, только с классами, когда по другому не получается.