2

我正在尝试将指向结构的指针传递给我创建的另一个进程……我在发送指针的进程中除了无效指针错误什么也没有得到……这在.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 的用户封送错误,这可能会损坏堆栈。

4

3 回答 3

3

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

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

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

如果您想直接共享此本机结构,您可能需要使用共享内存。创建命名共享内存 (Win32)

于 2012-08-16T15:48:45.013 回答
1

我可以建议查看内存映射文件的这种事情吗?看看这里:

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

于 2012-08-16T15:46:46.200 回答
0

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

于 2012-08-16T16:04:14.667 回答