Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как глобально выделить память?


fag2000@ok.ru ©   (2002-03-15 17:43:00) 

Проблема в следующем
Мне надо передать из одного процесса в другой структуру с помощью SendMessage.
...
GetMem(PSendStruct,sizeOf(MyStruct));
PSendStruct^.key:=MSGParam;
PSendStruct^.DestWND:=Myhwnd;
SendMessage(AppWndHandle,MsgId,WPARAM(PSendStruct),Code);
FreeMem(PSendStruct,sizeOf(KeyEvent));
...

Получаю я это сообщение так:
Procedure TMainForm.WM_KeyMessage(var Message: TMessage);
var
MSG_KEY_STRUCT:PKeyEvent;
Begin
MSG_KEY_STRUCT:=Pointer(Message.WParam);

Memo1.Lines.Add("Code: "+IntToStr(MSG_KEY_STRUCT^.key)+"; Char: "+Char(MSG_KEY_STRUCT^.key)+" Hex: $"+IntToHex(MSG_KEY_STRUCT^.key,8));//И здесь совершенно обоснованно нарываюсь на Access Violation т. к. память выделена в адресном пространстве другого процесса.

End;


Вопрос такой как сделать так чтобы к памяти получали доступ оба процесса ?


Dimka Maslov   (2002-03-15 18:28:00) [1]

Можно врспользоваться Memory Mapped Files:

в отсылающей программе пишешь:

var
SendStruct: PSendStruct;
hMem: THandle;

procedure InitSharedMem;
begin
hMem:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TSendStruct), "{E367C760-3840-11D6-A53C-00600809E025}");
SendStruct:=MapViewOfFile(hMem, FILE_MAP_ALL_ACCESS, 0, 0, 0);
FillChar(SendStruct, SizeOf(TSendStruct), 0);
end;

procedure Send(Data: TSendStruct);
begin
SendStruct:=Date;
SendMessage(AppWndHandle, MsgId, 0, 0);
end;

procedure DoneSharedMem;
begin
UnMapViewofFile(SendStruct);
CloseHandle(hMem);
end;


В принимающей программе:


var
hMem: THandle;
SendStruct: PSendStruct;

procedure InitSharedMem;
begin
hMem:=OpenFileMapping(FILE_MAP_ALL_ACCESS, False, "{E367C760-3840-11D6-A53C-00600809E025}");
SendStruct:=MapViewOfFile(hMem, FILE_MAP_ALL_ACCESS, 0, 0, 0);
end;

procedure Receive(var Data: TSendStruct);
begin
Data:=SendStruct^;
end;

procedure DoneSharedMem;
begin
UnmapViewOfFile(SendStruct);
end;

// теперь обработчик события
procedure TForm1.WMKeyMessage(var Message);
var
Data: TSendStruct;
begin
InitSharedMem;
Receive(Data);
DoneSharedMem;
...
// теперь с полученными данными делай что хочешь
end;

begin


Иван Шихалев   (2002-03-15 17:56:00) [2]

А также функции GlobalXXX (GlobalAlloc, GlobalFree etc.)


Иван Шихалев   (2002-03-15 17:48:00) [3]

wm_copydata


Наверх

Титульная страница Поиск, карта сайта Написать письмо