Текущий архив: 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.45 MB
Время: 0.006 c