Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.28;
Скачать: CL | DM;

Вниз

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

 
fag2000@ok.ru ©   (2002-03-15 17:43) [0]

Проблема в следующем
Мне надо передать из одного процесса в другой структуру с помощью 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;


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


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

wm_copydata


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

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


 
Dimka Maslov ©   (2002-03-15 18:28) [3]

Можно врспользоваться 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



Страницы: 1 вся ветка

Текущий архив: 2002.03.28;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.012 c
1-90948
HELP!!!!!!!!!!!!!!!
2002-03-14 16:23
2002.03.28
!!!!!!!!!!!!!!!!!!


1-90829
Aidan
2002-03-13 17:20
2002.03.28
Как получить информацию о пакете или DLL?


1-90959
Tolstomordik
2002-03-14 14:43
2002.03.28
Преобразование строки типа PChar в строку типа String


1-90929
Vadimir
2002-03-13 16:37
2002.03.28
Графика...


1-90857
MoonShiner
2002-03-16 19:57
2002.03.28
ошибка в kernel32