我正在尝试将指向结构的指针传递给我创建的另一个进程...我在发送指针的进程中除了无效指针错误之外什么也没有得到...这在 .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 互操作或 PInvoke 的用户编码错误,这可能会损坏堆栈。
最佳答案
进程通常不能共享内存。请记住,大多数地址实际上是虚拟地址,并不指向物理硬件位置,而是指向页面和偏移量。
win32 函数返回指针,因为它们在进程地址空间内运行,而不是单独的进程。
参见Memory managment options in Win32有关所有 native 调用如何在 Win32 中实际分配内存的更多信息(至少来自用户模式代码)。该页面上唯一没有提到的是 Large-Page Support它创建非标准页面并且无法分页到磁盘。即使在 C/C++ 中,这些页面也可能很难使用,因此我强烈建议不要在 CLR 中使用它们。
如果您想直接共享此 native 结构,您可能需要使用共享内存。 Creating Named Shared Memory (Win32)
关于c# - 将指针传递给另一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11990799/