Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2009, 16:05   #1
Fabio
Пользователь
 
Регистрация: 05.01.2009
Сообщений: 12
Вопрос Общая переменная для нескольких экземпляров программы.

Доброго времени суток.

Возник вопрос: как объявить\использовать переменную, к которой смогут обращаться несколько экземпляров программы

То есть любой экземпляр может считывать и изменять значение переменной и оно изменится для всех экземпляров программы.

Вот например как это делается в С++ :
#pragma data_seg("Shared")
volatile LONG x = 0;
#pragma data_seg()

Тогда X и будет такой переменной. Долго искал похожий аналог в делфи и не нашел.

Помогите, пожалуйста.
ЗЫ Вариант с сохранением значения переменной в файле не подойдет.
Fabio вне форума Ответить с цитированием
Старый 23.02.2009, 16:31   #2
KORN
Банхаммер
Участник клуба
 
Аватар для KORN
 
Регистрация: 17.02.2007
Сообщений: 1,754
По умолчанию

ну так в каждом запущеном экземпляре программы будет эта переменная... а если ты хочешь обращаться к другой программе, то посылай сообщения и обрабатывай их
Перед тем как спросить ищи на форуме и в GOOGLE
KORN вне форума Ответить с цитированием
Старый 23.02.2009, 16:54   #3
NieL
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 116
По умолчанию

Если уже сильно извращаться, то можно писать в опциональный поток исполняемого файла. Вот накидал примерчик:

Код:
procedure SetInt(Val: Integer; OptionalName: string);
var
  P: PByte;
begin
  DeleteFile(OptionalName);
  with TFileStream.Create(OptionalName, fmCreate) do
  try
    P := @Val;
    Write(P^, SizeOf(Integer));
  finally
    Free;
  end;
end;

procedure GetInt(var Val: Integer; OptionalName: string);
var
  P: PByte;
begin
  with TFileStream.Create(OptionalName, fmOpenRead or fmShareDenyNone) do
  try
    P := @Val;
    Read(P^, SizeOf(Integer));
  finally
    Free;
  end;
end;

procedure Tfrm_Test.btn_SetClick(Sender: TObject);
begin
  SetInt(StrToInt(InputBox('', '', '')), 'Variable');
end;

procedure Tfrm_Test.btn_GetClick(Sender: TObject);
var
  v: Integer;
begin
  GetInt(v, 'Variable');
  ShowMessageFmt('%d', [v]);
end;
NieL вне форума Ответить с цитированием
Старый 23.02.2009, 17:09   #4
Fabio
Пользователь
 
Регистрация: 05.01.2009
Сообщений: 12
По умолчанию

Спасибо вам большое.

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

Есть ли директива компилятора, которая может поместить переменную в такую обл. памяти ?
Fabio вне форума Ответить с цитированием
Старый 23.02.2009, 17:43   #5
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

CreateFileMapping/MapViewOfFile
(на *File* не обращай внимания, это только название такое)

http://www.delphisources.ru/pages/fa...lemapping.html
пыщь
JTG вне форума Ответить с цитированием
Старый 23.02.2009, 18:01   #6
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

Цитата:
Сообщение от NieL Посмотреть сообщение
Если уже сильно извращаться, то можно писать в опциональный поток исполняемого файла. Вот накидал примерчик:
...
сохранить адрес можно, но разве система разрешит обратится к памяти другого процесса программе? (2 экземпляр программы).
или я что-то путаю...

Последний раз редактировалось mihali4; 23.02.2009 в 18:50. Причина: Не следует цитировать полностью
Роман Радер вне форума Ответить с цитированием
Старый 23.02.2009, 19:58   #7
ZeitGeist7
Пользователь
 
Регистрация: 02.02.2009
Сообщений: 54
По умолчанию

бля! ему ответили а на мою тему ноль внимания! http://programmersforum.ru/showthread.php?t=39273
который час сижу ответа жду. хоть бы кто нибудь. всё нахер! баньте! видеть вас не могу
ZeitGeist7 вне форума Ответить с цитированием
Старый 23.02.2009, 21:06   #8
Fabio
Пользователь
 
Регистрация: 05.01.2009
Сообщений: 12
По умолчанию

Спасибо всем кто откликнулся.

Цитата:
Сообщение от Роман Радер Посмотреть сообщение
сохранить адрес можно, но разве система разрешит обратится к памяти другого процесса программе? (2 экземпляр программы).
или я что-то путаю...
В принципе в этом-то и суть вопроса, нужно объявить переменную, которая будет актуальна для всех открытых экземпляров моей программы.

В первом сообщении я указал код на С++, который оъявляет переменную x=0. Если, написать в проге функцию, которая будет увеличивать x при нажатии enter и выводить на печать, то работать будет так : запустим программу, нажмем enter 2 раза, на экране будет 0. 1. 2.
Запустим ещё раз программу, появится соответственно второе окно, в нем нажмем enter, появится цифра 3. И так далее, можно запустить 3-й экземпляр, нажать enter, появится 4, перейдем на первое, enter, 5....уф...
При этом переменная x едина и каждый экземпляр может её менять.

Извините, я немного сумбурно и на пальцах, но этот пример характеризует мою задачу очень хорошо.
Fabio вне форума Ответить с цитированием
Старый 24.02.2009, 00:59   #9
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Встроенных средств в делфи нет, но реализуется двумя строчками кода

hFile:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 4, 'AnyName');
pData:=MapViewOfFile(hFile, FILE_MAP_WRITE, 0, 0, 0);

В результате данные по указателю pData (строка, число, запись...) доступны всем копиям программы, см. аттач и пост #5
Вложения
Тип файла: rar FileMapping.rar (3.3 Кб, 37 просмотров)
пыщь
JTG вне форума Ответить с цитированием
Старый 24.02.2009, 09:25   #10
Fabio
Пользователь
 
Регистрация: 05.01.2009
Сообщений: 12
По умолчанию

Всё, разобрался. CreateFileMapping оказалось то что нужно.
Спасибо большое всем кто отписался.
Fabio вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Общая переменная для различных обработчиков событий Mike_new Общие вопросы .NET 3 29.12.2008 16:43
Проверка количества запущенных экземпляров приложения yulia Общие вопросы Delphi 3 07.10.2008 02:30
Подскажите пожалуста! есть ли переменная для обозначения дисковода? Medyankin Помощь студентам 4 27.07.2008 15:58
Общая переменная А.Брей Помощь студентам 2 20.05.2007 18:13
Доступ к com порту для нескольких приложений Lexx Win Api 11 06.04.2007 20:10