我正在尝试将指向结构的指针传递给我创建的另一个进程...我在发送指针的过程中只得到了无效的指针错误......这在{{3}中是否可行}?
我的发送过程代码:
' 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的用户封送错误,这可能会破坏堆栈。
答案 0 :(得分:3)
进程无法正常共享内存。请记住,大多数地址实际上是虚拟地址,并不指向物理硬件位置,而是指向页面和偏移。
win32函数返回指针,因为它们在您的进程地址空间内运行而不是单独的进程。
有关所有本机调用如何在Win32中实际分配内存的更多信息,请参阅Memory managment options in Win32(至少从用户模式代码中)。该页面上唯一没有提到的是Large-Page Support,它创建了非标准页面,无法分页到磁盘。即使在C / C ++中,这些页面也难以使用,所以我强烈建议不要在CLR中使用它们。
如果要直接共享此本机结构,您可能希望使用共享内存。 Creating Named Shared Memory (Win32)
答案 1 :(得分:1)
我可以建议查看内存映射文件吗?看看这里:
http://msdn.microsoft.com/en-us/library/dd997372(v=vs.100).aspx
答案 2 :(得分:0)
将类序列化为XML并将SendMessage(WM_SETTEXT)
序列化为另一个应用程序中的文本框(您可以使用当前代码轻松传递hwnd,因为它只是很长时间)。然后在文本框更改事件上放置一个监听器。