C# 将指针传递到另一个进程

C# 将指针传递到另一个进程,c#,.net,vb.net,clr,marshalling,C#,.net,Vb.net,Clr,Marshalling,我试图将一个指向结构的指针传递给我创建的另一个进程…在我发送指针的进程中,除了无效的指针错误之外,我什么都没有得到…这在中可能吗 发送过程的我的代码: ' Initialize unmanged memory to hold the struct. Dim ptrSettings As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(EngineSettings)) ' Copy the struct to unmanaged memory. Mars

我试图将一个指向结构的指针传递给我创建的另一个进程…在我发送指针的进程中,除了无效的指针错误之外,我什么都没有得到…这在中可能吗

发送过程的我的代码:

' 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以在LPRAM中接收消息:

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

' Free the unmanaged memory.
Marshal.FreeHGlobal(ptr)
两个进程之间的指针值相同,下面是第二个进程中的错误:


错误代码为0xc0000005。此错误可能是CLR或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM interop或PInvoke的用户封送错误,这可能会损坏堆栈。

我是否可以建议查看内存映射文件以了解此类问题?请看这里:


我可以建议您查看内存映射文件以了解这类内容吗?请看这里:


进程通常不能共享内存。请记住,大多数地址实际上是虚拟地址,并不指向物理硬件位置,而是指向页面和偏移量

win32函数返回指针,因为它们在进程地址空间中运行,而不是在单独的进程中运行

有关Win32中所有本机调用如何实际分配内存的更多信息,请参阅(至少来自用户模式代码)。该页面上唯一没有提到的是创建非标准页面且无法分页到磁盘的页面。即使在C/C++中,这些页面也很难使用,因此我强烈建议不要在CLR中使用它们


如果要直接共享此本机结构,可能需要使用共享内存

进程通常不能共享内存。请记住,大多数地址实际上是虚拟地址,并不指向物理硬件位置,而是指向页面和偏移量

win32函数返回指针,因为它们在进程地址空间中运行,而不是在单独的进程中运行

有关Win32中所有本机调用如何实际分配内存的更多信息,请参阅(至少来自用户模式代码)。该页面上唯一没有提到的是创建非标准页面且无法分页到磁盘的页面。即使在C/C++中,这些页面也很难使用,因此我强烈建议不要在CLR中使用它们


如果要直接共享此本机结构,可能需要使用共享内存

将类序列化为XML并
发送消息(WM_SETTEXT)
将其发送到另一个应用程序中的文本框中(您可以使用当前代码非常轻松地传递hwnd,因为它很长)。然后将侦听器放在textbox changed事件上。

将类序列化为XML,并
发送消息(WM_SETTEXT)
将其发送到另一个应用程序中的文本框中(使用当前代码可以很容易地传递hwnd,因为它很长)。然后在textbox changed事件上放置一个侦听器。

我猜您正在运行内存保护,这意味着您必须找到另一种与其他进程通信的方式。此外,你的想法本身似乎是一个非常糟糕的想法。如果你认为这是一个糟糕的想法,为什么不建议另一种方法呢?我猜你遇到了内存保护,这意味着,你必须找到另一种方法与另一个进程进行通信。此外,你的想法本身似乎是一个非常糟糕的想法。如果你认为这是一个糟糕的想法,为什么不建议另一种方法?有趣的方法,我会做一些阅读。。。我很想知道我的实现是否可以在CLR中实现…@Don,在Windows中是不可能的。AllocHGlobal不从“全局”堆进行分配。该术语仅用于遗留用途。AllocHGlobal最终仍会在任何Win32平台上调用VirtualAlloc。全局堆是16位时代的一部分。谢谢,MS使用的一些术语非常模糊。。。除了有关MSDN的文档…有趣的方法外,我还将阅读一些。。。我很想知道我的实现是否可以在CLR中实现…@Don,在Windows中是不可能的。AllocHGlobal不从“全局”堆进行分配。该术语仅用于遗留用途。AllocHGlobal最终仍会在任何Win32平台上调用VirtualAlloc。全局堆是16位时代的一部分。谢谢,MS使用的一些术语非常模糊。。。连同MSDN的文档…好的,感谢您提供更多详细信息。。。贾斯汀还推荐了内存映射文件。好的,感谢您提供更多详细信息。。。贾斯汀还推荐了内存映射文件。我知道你想做什么,但这不是我真正想要的方法。谢谢。我明白你想做什么,但这不是我真正想要的方法。非常感谢。