Главная страница
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.01 c
1-90970
Art1
2002-03-14 09:40
2002.03.28
Где найти компонент для чтения и записи XLS файлов?


1-90900
skovorodka
2002-03-17 11:03
2002.03.28
Как зная путь к .exe файлу узнать его картинку ?


4-91121
ctapik-net
2002-01-29 14:18
2002.03.28
Вопрос про Hint


3-90810
ruslan_as
2002-03-04 13:13
2002.03.28
Сумма по полю


6-91010
НЕО
2002-01-14 16:09
2002.03.28
!!! ЛОГИН текущего пользователя