2012-08-16 93 views
1

我想一个指针传递给一个结构来我创造...我得到什么,但无效指针错误,在这个过程中我送指针太另一个进程......这甚至可能在.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) 

指针是两个过程之间的相同值,这里是在第二过程中的误差:

错误代码是0000005。此错误可能是CLR中的错误,也可能是用户代码中不安全或不可验证的部分。此错误的常见来源包括COM-interop或PInvoke的用户编组错误,这可能会破坏堆栈。

+1

我猜你会碰到内存保护,这意味着,你将不得不寻找另一种方式与其他进程通信。除了你的想法本身似乎是一个非常糟糕的主意。 – 2012-08-16 15:41:26

+1

如果你认为这是一个可怜的想法,而不是为什么不建议另一种方法? – devHead 2012-08-16 15:43:21

回答

2

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

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

关于如何所有本地调用实际上在Win32中分配内存(至少从用户模式代码)的更多信息,请参阅Memory managment options in Win32。该页面上没有提到的唯一东西是Large-Page Support,它会创建非标准页面并且无法分页到磁盘。即使在C/C++中,这些页面也很难处理,所以我强烈建议不要在CLR中使用它们。

你可能会想,如果你想直接分享这个天然的结构来使用共享内存。 Creating Named Shared Memory (Win32)

+0

好的,谢谢你提供更多的细节...... Justin也推荐​​了内存映射文件。 – devHead 2012-08-16 15:54:22

1

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

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

+0

有趣的做法,我会做一些阅读...我真的想知道如果我的实施是可能的CLR ... – devHead 2012-08-16 15:49:45

+3

@唐,这是不可能在Windows中。 AllocHGlobal不从“全局”堆分配。该术语仅用于传统目的。 AllocHGlobal仍然最终在任何Win32平台上调用VirtualAlloc。全球堆是16位时代的一部分。 – NtscCobalt 2012-08-16 15:54:37

+0

谢谢,MS使用的一些术语非常含糊......以及MSDN上的文档... – devHead 2012-08-16 16:00:43

0

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

+1

我明白你想要做什么,但这不是我想要采取的方法。谢谢。 – devHead 2012-08-16 16:21:42

相关问题