Страница 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: и точками ... но я разобрался тогда !

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