Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Межпроцессная переменная 
:(
    Опции темы
RinOSpro
Дата 26.8.2011, 10:14 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Всем привет! В C++ такая замечательная штука, которая позволяет экземплярам одного и того-же exe'шника работать с общей переменной:
Код

#pragma data_seg("Shared") 
volatile LONG g_shared_var = 0;
#pragma data_seg() 

#pragma comment(linker, "/SECTION:Shared,RWS" )


Если этот кусок кода положить в dll, то любой процесс, загрузив эту dll без релоцирования, сможет работать с этой переменной.

Как подобное можно реализовать в Delphi?

Сразу приходит на ум: TCP, UDP, Shared Memory, Pipes, Mailslots, но это как то громоздко для такой, казалось бы простой задачи...
  Вверх
kami
Дата 26.8.2011, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(RinOSpro @  26.8.2011,  10:14 Найти цитируемый пост)
позволяет экземплярам одного и того-же exe'шника работать с общей переменной:

Если кто-нибудь объяснит, как это возможно - было бы отлично. Ведь каждый процесс во-первых имеет свою копию dll, а во-вторых - он варится в своем собственном адресном пространстве... Пересечение областей памяти (без специализированных манипуляций) в user-mode, имхо, нереально. Не зря же существует целый раздел IPC.
PM MAIL WWW   Вверх
northener
Дата 26.8.2011, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: нет
Всего: 20



Цитата(kami @  26.8.2011,  21:30 Найти цитируемый пост)
Если кто-нибудь объяснит, как это возможно

MMF?


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
kami
Дата 27.8.2011, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(northener @  26.8.2011,  23:56 Найти цитируемый пост)
MMF?

Имхо, не то. Разве что С++ скрывает от программиста его создание и использование. А ну как CreateFileMapping или MapViewOfFile не сработают?
PM MAIL WWW   Вверх
RinOSpro
Дата 29.8.2011, 09:22 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Безболезненно как в С++ не получилось... Пришлось писать как раз через:

Цитата(kami @  27.8.2011,  12:54 Найти цитируемый пост)
А ну как CreateFileMapping или MapViewOfFile не сработают?

Ловите может кому пригодится
Код

unit untSharedData;

interface

uses
  Windows, SysUtils;

type
  PSharedData = ^TSharedData;
  TSharedData = record
    Handle: THandle; // Добавьте поля необходимые вам.
  end;

function GetSharedData(AName: string): PSharedData;
function CreateSharedData(AName: string; ASharedData: TSharedData): THandle;  
// Не забудьте выполнить CloseHandle после завершения работы

implementation

function GetSharedData(AName: string): PSharedData;
var
  LMapFile: THandle;
begin
  LMapFile := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(AName));
  try
    if LMapFile = 0 then
      RaiseLastOSError;

    Result := MapViewOfFile(LMapFile, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TSharedData));

    if not Assigned(Result) then
      RaiseLastOSError;
  finally
    CloseHandle(LMapFile);
  end;
end;

function CreateSharedData(AName: string; ASharedData: TSharedData): THandle;
var
  LSharedData: PSharedData;
begin
  Result := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0,
    SizeOf(TSharedData), PChar(AName));

  if Result = 0 then
    RaiseLastOSError;

  LSharedData := MapViewOfFile(Result, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TSharedData));

  if not Assigned(LSharedData) then
    RaiseLastOSError;

  Move(ASharedData, LSharedData^, SizeOf(TSharedData));
end;

end.



Это сообщение отредактировал(а) RinOSpro - 29.8.2011, 09:22
  Вверх
bems
Дата 31.8.2011, 21:38 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(kami @  27.8.2011,  12:54 Найти цитируемый пост)
Имхо, не то. Разве что С++ скрывает от программиста его создание и использование. А ну как CreateFileMapping или MapViewOfFile не сработают? 
Именно то. MMF в native api и DDK не даром называется section. Загрузка исполняемого файла это создание MMF (смотрим флажок SEC_IMAGE). Оно и понятно, если вспомнить что для исполняемых образов в памяти вместо файла подкачки используется сам этот файл на диске.
Так что в общем-то плюсы тут особо не причем, просто там линкеру можно задать SEC_COFF_SHARED а в дельфи, насколько я знаю, нельзя. Ну и если вызов (не CreateFileMapping но смысл почти тот же) провалится, то это отказ при загрузке модуля


Это сообщение отредактировал(а) bems - 31.8.2011, 21:41


--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0635 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.