Предаване на указатели към друг процес

Опитвам се да предам указател към структура към друг процес, който съм създал… Получавам само грешки при невалиден указател в процеса. Изпращам и указателя… Това изобщо възможно ли е в .NET?

Моят код за процеса на изпращане:

' Initialize unmanged memory to hold the struct.
Dim ptrSettings As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(EngineSettings))

' Copy the struct to unmanaged memory.
Marshal.StructureToPtr(EngineSettings, ptrSettings, False)

SendMessage(HWND, MSG_SETTINGS_STRUCT, 0, ptrSettings)

Заменям WinProc във втория процес, за да получа съобщението в LParam:

EngineSettings = CType(Marshal.PtrToStructure(ptr, GetType(SettingsStruct)), SettingsStruct)

' Free the unmanaged memory.
Marshal.FreeHGlobal(ptr)

Указателят е една и съща стойност между двата процеса, ето грешката във втория процес:

Кодът на грешката е 0xc0000005. Тази грешка може да е грешка в CLR или в опасните или неподлежащи на проверка части на потребителския код. Често срещаните източници на тази грешка включват грешки при маршалинг на потребители за COM-interop или PInvoke, които могат да повредят стека.


person devHead    schedule 16.08.2012    source източник
comment
Предполагам, че се натъквате на защита на паметта, което означава, че ще трябва да намерите друг начин за комуникация с другия процес. Освен това самата ти идея изглежда много лоша идея.   -  person Security Hound    schedule 16.08.2012
comment
ако смятате, че това е лоша идея, защо не предложите друг подход?   -  person devHead    schedule 16.08.2012


Отговори (3)


Обикновено процесите не могат да споделят памет. Не забравяйте, че повечето адреси всъщност са виртуални адреси и не сочат към местоположение на физически хардуер, а вместо това страница и отместване.

Функциите win32 връщат указатели, защото се изпълняват в адресното пространство на вашите процеси, а не като отделен процес.

Вижте Опции за управление на паметта в Win32 за повече информация за това как всички местни извиквания всъщност разпределят памет в Win32 (поне от кода на потребителския режим). Единственото нещо, което не се споменава на тази страница, е Поддръжка на големи страници, която създава нестандартни страници и не може да бъде странирана на диск. Тези страници могат да бъдат трудни за работа дори в C/C++, така че силно препоръчвам да не ги използвате от CLR.

Вероятно ще искате да използвате споделена памет, ако искате директно да споделите тази собствена структура. Създаване на име споделена памет (Win32)

person NtscCobalt    schedule 16.08.2012
comment
добре, благодаря за предоставянето на повече подробности... Джъстин също беше препоръчал файлове с карта на паметта. - person devHead; 16.08.2012

Мога ли да предложа да се търсят файлове с нанесени памети за този вид неща? Разгледайте тук:

http://msdn.microsoft.com/en-us/library/dd997372(v=vs.100).aspx

person Justin Harvey    schedule 16.08.2012
comment
интересен подход, ще прочета малко... наистина бих искал да знам дали внедряването ми е възможно в CLR... - person devHead; 16.08.2012
comment
@Don, не е възможно в Windows. AllocHGlobal не разпределя от глобална купчина. Терминът е само за наследени цели. AllocHGlobal все още в крайна сметка извиква VirtualAlloc на всяка платформа Win32. Глобалните купчини бяха част от 16-битовата ера. - person NtscCobalt; 16.08.2012
comment
благодаря, някои термини, използвани от MS, са много неясни... заедно с документацията в MSDN... - person devHead; 16.08.2012

Сериализирайте класа в XML и го SendMessage(WM_SETTEXT) в текстово поле в другото приложение (можете да предадете hwnd доста лесно, като използвате текущия си код, тъй като е просто дълъг). След това поставете слушател на промененото събитие в текстовото поле.

person Belmiris    schedule 16.08.2012
comment
Разбирам какво се опитвате да направите, но това не е подходът, който искам да възприема. Благодаря ти. - person devHead; 16.08.2012