Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/48: Рейтинг темы: голосов - 48, средняя оценка - 4.83
3 / 3 / 0
Регистрация: 20.06.2012
Сообщений: 17

Совместное использование двумя приложениями глобальной переменной из одной DLL

29.11.2012, 05:10. Показов 10703. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть два приложения одновременно использующих одну dll. Вопрос как в dll объявить общую для двух приложений глобальную переменную? Поискал в интернете нашел пример. Сначала компилятор ругался на кавычки, исправил, теперь возникает ошибка. Builder 6.0
[Linker Fatal Error] Fatal: Unable to open file 'MSVCRT-SECTION: .MYSEG, RWS'
[C++ Warning] Unit1.cpp(15): W8094 Incorrect use of #pragma comment( <type> [,"string"] )

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <vcl.h>
#include "Unit1.h"
#include <windows.h>
 
#pragma argsused
 
#pragma data_seg (".MySeg")
 
int sharedInts[5]={0,0,0,0,0}; // переменная общего пользования
// другие переменные общего пользования
 
#pragma data_seg ()
 
 
#pragma comment (lib, "msvcrt" "-SECTION: .MySeg, rws");
 
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
 
        return 1;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.11.2012, 05:10
Ответы с готовыми решениями:

Различие глобальной и глобальной статической переменной
у нас есть заголовочный файл со стражами, допустим global.h , его используют несколько других...

Уйти от глобальной переменной (получил "использование неинициализированной памяти")
Требовалось уйти от использования глобальной переменной max И сделать массив статическим ...

Использование слова static при объявлении глобальной переменной
строка 7 → Необходимо ли слово static? строка 30 → Как это работает? П.5.16.Правил Запрещено...

25
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
29.11.2012, 08:23
Вопрос: где по вашему должна "лежать" эта переменная, если DLL "живет" в памяти только на момент вызова, и в теле самой DLL никакие изменения не допустимы?
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
29.11.2012, 08:32
А зачем вам общая DLL? Нужно взаимодействие приложений с общей переменной - создайте ключик в реестре или атом.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
29.11.2012, 08:53
Или как обычно - PostMessage(), SendMessage() ...
0
3 / 3 / 0
Регистрация: 20.06.2012
Сообщений: 17
29.11.2012, 10:04  [ТС]
Цитата Сообщение от mimicria Посмотреть сообщение
А зачем вам общая DLL? Нужно взаимодействие приложений с общей переменной - создайте ключик в реестре или атом.
Есть приложение A которое передает данные в функции в dll библиотеку Б. Передаваемые данные нужно перехватить. Для трансляции и перехвата Пишем dll библиотеку B. Подменяем ею библиотеку Б. Теперь приложение А посылает данные в dll B а та перехватывает данные и транслирует их в dll Б. С этим вопросов нет все работает. Осталась задача сохранить перехваченные данные. Я вижу только один рациональный способ Написать приложение Г которое обращается за перехваченными данными к dll B. Для этого в dll В нужно объявить глобальную переменную которая будет доступна приложению А и Г. Отсюда и вопрос как объявить глобальную переменную которая будет доступна обоим приложениям?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
29.11.2012, 10:15
Цитата Сообщение от avto Посмотреть сообщение
Осталась задача сохранить перехваченные данные.
Ну, так и сохраняй прямо из своего dll-перехватчика, пиши в файл.
0
3 / 3 / 0
Регистрация: 20.06.2012
Сообщений: 17
29.11.2012, 10:21  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
Ну, так и сохраняй прямо из своего dll-перехватчика, пиши в файл.
Есть проблема в данном способе, как остановить процесс записи в файл?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
29.11.2012, 10:49
перед записью проверить существование необходимой записи в файле и уйти, если такая запмсь есть
0
3 / 3 / 0
Регистрация: 20.06.2012
Сообщений: 17
29.11.2012, 11:14  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
перед записью проверить существование необходимой записи в файле и уйти, если такая запмсь есть
Записей будет очень много, по сути это отладчик. Предложенный способ будет занимать много времени.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
29.11.2012, 11:37
вы ничего не говорите об условии, при котором следует прекратить запись, в таком случае, проверяете -если файл не пустой - прекращаете запись

Добавлено через 3 минуты
по ходу, файл можно не открывать/закрывать для запист, а хранить записи из файла в массиве, тогда времени занимать будет не так уж и много, при том, если это отладчик, при каждой "отладке" файл можно перезаписывать, хотя я не думаю, что по умолчанию там будут 100500 строк, если предыдущие данные отладки дороги, как память, можно каждый раз данные отладки писать в новый файл
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
29.11.2012, 12:34
Есть приложение A которое передает данные в функции в dll библиотеку Б. Передаваемые данные нужно перехватить. Для трансляции и перехвата Пишем dll библиотеку B. Подменяем ею библиотеку Б. Теперь приложение А посылает данные в dll B а та перехватывает данные и транслирует их в dll Б. С этим вопросов нет все работает. Осталась задача сохранить перехваченные данные. Я вижу только один рациональный способ Написать приложение Г которое обращается за перехваченными данными к dll B. Для этого в dll В нужно объявить глобальную переменную которая будет доступна приложению А и Г. Отсюда и вопрос как объявить глобальную переменную которая будет доступна обоим приложениям?
Не Г обращается за перехваченными данными к dll B, а В посылает перехваченные данные в Г.
1. Можно использовать встроенный в билдер трасировщик CodeSite (Menu->Tools->CodeSite). И ваша библиотека может отсылать лог в него.
2. Можно сделать общий файл в памяти и общаться через него. Вот пример, в нем две копии приложения общаются между собой.
Вложения
Тип файла: rar 2app.rar (397.9 Кб, 49 просмотров)
2
3 / 3 / 0
Регистрация: 20.06.2012
Сообщений: 17
29.11.2012, 14:41  [ТС]
Цитата Сообщение от gumi250 Посмотреть сообщение
Не Г обращается за перехваченными данными к dll B, а В посылает перехваченные данные в Г.
1. Можно использовать встроенный в билдер трасировщик CodeSite (Menu->Tools->CodeSite). И ваша библиотека может отсылать лог в него.
2. Можно сделать общий файл в памяти и общаться через него. Вот пример, в нем две копии приложения общаются между собой.
Это не совсем то..., но спасибо за идею.

Добавлено через 18 минут
Цитата Сообщение от LK Посмотреть сообщение
вы ничего не говорите об условии, при котором следует прекратить запись, в таком случае, проверяете -если файл не пустой - прекращаете запись

Добавлено через 3 минуты
по ходу, файл можно не открывать/закрывать для запист, а хранить записи из файла в массиве, тогда времени занимать будет не так уж и много, при том, если это отладчик, при каждой "отладке" файл можно перезаписывать, хотя я не думаю, что по умолчанию там будут 100500 строк, если предыдущие данные отладки дороги, как память, можно каждый раз данные отладки писать в новый файл
Строк около 100 тыс. Самое сложно определить последний вызов функции приложением А и закрыть файл. Поэтому хотелось бы пойти более простым путем, общим глобальным массивом.

Добавлено через 11 минут
Разделяемая память в DLL http://www.ishodniki.ru/art/ar... r/224.html, но пример у меня не компилируется
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
29.11.2012, 14:42
Это не совсем то..., но спасибо за идею.
Чем вас это не устраивает?
0
3 / 3 / 0
Регистрация: 20.06.2012
Сообщений: 17
29.11.2012, 14:47  [ТС]
Цитата Сообщение от gumi250 Посмотреть сообщение
Чем вас это не устраивает?
Хотелось бы разобраться с этим Разделяемая память в DLL http://www.ishodniki.ru/art/ar... r/224.html, но если не получится разобраться за разумное время, тогда скорее всего придется воспользоваться вашим вариантом.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
29.11.2012, 17:06
Цитата Сообщение от avto Посмотреть сообщение
Хотелось бы разобраться с этим Разделяемая память в DLL
... на 10 комментариев только один положительный... . Если разберетесь - поделитесь на форуме, интересно же...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.11.2012, 17:28
http://www.ishodniki.ru/art/ar... r/224.html просмотрев я там ничего нового не увидел...
не увидел там "глобальных переменных".

Как я понимаю в dll можно хранить только константы, и вообще про реализацию взаимодействия между программами с помощью общей dll первый раз слышу.

Добавлено через 6 минут
Из ссылки
Разделяемая память в DLL

В Win32 библиотека DLL располагается в области памяти загружающего ее процесса. Каждому процессу предоставляется отдельная копия “глобальной” памяти DLL ( т.е делается отдельная копия всех глобальных переменных, объявленных в исходном коде этой DLL), которая реининиализируется каждый раз, когда новой процесс загружает библиотеку. Это означает, что в Win32 динамическая библиотека, вернее, ее глобальные переменные, не могут использоваться процессами совместно.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
29.11.2012, 17:36
Зачем столько патетики?
Так же дальше описывается приблуда с pragma data_seg и comment... другое дело, что в билдере такого может и не быть, что это специфика мелкомягких и их компиляторов.
0
3 / 3 / 0
Регистрация: 20.06.2012
Сообщений: 17
10.12.2012, 15:29  [ТС]
В Builder пока не работает, зато работает в Visual studio. Важно!!! При объявлении в dll глобальной переменной с инициализацией нужно использовать #pragma data_seg (), а без инициализации #pragma bss_seg ()
Подскажите ссылку на нормальное описание #pragma, для Builder т.к. если верить этой http://docwiki.embarcadero.com... view_Index , то для Builder нет #pragma data_seg () и #pragma bss_seg ()
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
27.12.2021, 04:33
Я пишу в dll код так.
C++
1
2
3
4
5
6
7
8
9
10
#include "stdafx.h"
 
//#define MYDLL_API __declspec(dllexport)
#define MYDLL_API __declspec(allocate("MySection"))
#pragma data_seg("MySection")
MYDLL_API int szName[3]={356,821};
#pragma data_seg()
//#pragma comment(linker,"/MySection")//, /RWS
#pragma comment(linker,"/SECTION:MySection, ")
//#pragma comment(linker,"/SECTION:MySection")//, /RWS
В основной программе так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <iomanip>
#include <windows.h>
#include "Modul.h"//здесь макросы
 
using std::cout;
using std::endl;
using std::cin;
 
using namespace std;
HMODULE modulDLL=LoadLibraryA("Program1.dll");
int _tmain(int argc, _TCHAR* argv[]){
cout<<"GetLastError() "<<GetLastError()<<en;
cout<<"program modulDLL "<<(int)modulDLL<<en;
int*szName=(int*)GetProcAddress(modulDLL,"szName");
cout<<"GetLastError() "<<GetLastError()<<en;
cout<<"szName "<<(int)szName<<en;//ошибка 127
FreeLibrary(modulDLL);
_getch();   
return 0;
}
Ошибка возникает когда я пытаюсь вызвать GetProcAddress. В общем мне не удалось даже к одному приложению подключить такуюю dll? может кто-то сто-то посоветует.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,154
Записей в блоге: 3
27.12.2021, 10:18
Добрый день.
Одну и туже dll нельзя использовать в двух потоках (типа можно, но скорее всего будут проблемы). тут или идет поочередное "юзанье" или как то выниматься функции (как например работают с MySQL)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.12.2021, 10:18
Помогаю со студенческими работами здесь

Как двум приложениям совместно использовать DLL?
Всем привет, У меня есть некоторое приложение, которое, загрузившись, вызвало функцию внешнего...

Ошибка об отсутствии MSVCP140D.dll, ucrtbased.dll, CONCRT140D.dll, VCRUNTIME140D.dll
Добрый день, товарищи. Возникла проблема. Делаю программу с использованием openCV 3.1 на Visual...

Глобальные и статические глобальные переменные
Скажите, чем отличаются глобальные переменные от статических глобальных переменных?

Загрузка переменной из DLL (GetProcAddress не берет значение переменной из *.dll)
GetProcAddress не берет значение переменной из *.dll Не могу понять почему. Помогите....

Глобальная переменная из другой dll
Имеется сторонняя dll без исходников. Мне нужно в своей программе получить значение глобальной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru