2017-01-09 80 views
2

在应用程序A中,一个整数被写入内存。全局内存访问

var intBytes = BitConverter.GetBytes(123); 
var allocatedMemory = Marshal.AllocHGlobal(intBytes.Length); 
Marshal.Copy(intBytes, 0, allocatedMemory, intBytes.Length); 

指针然后发送到应用程序B,在该应用程序中整数被再次读取。

byte[] buffer = new byte[Marshal.SizeOf<int>()]; 
Marshal.Copy(allocatedMemory, buffer, 0, buffer.Length); 
var myRecievedInteger = BitConverter.ToInt32(buffer, 0); 

的问题是,应用B是得到一个错误的随机值和有时候在App B中的Marshal.Copy方法抛出System.AccessViolationException

  • 使用AllocCoTaskMem方法不会改变任何东西。
  • 设置像4这样的内存的固定大小也没有帮助。
  • 指针在两个应用程序中都是相同的。
  • App B中的读取缓冲区包含错误的数据。 (不是123,0,0,0)

有人知道我在做什么错吗?

+1

进程不共享内存。编组是为了缩小托管和非托管内存之间的差距。进程之间不共享托管和非托管内存。为了在进程之间进行通信,有各种技术。您可以使用该文件系统作为最简单和最基本的。您也可以使用命名管道或WCF。 –

+0

共享内存也是一种可用的技术 –

+0

我试图发送一个结构与'lParam'参数通过'SendMessage'函数从user32.dll到另一个进程。他们不是使用相同的技术吗? – NtFreX

回答

3

正如评论中已经提到的那样,封送不能以这种方式使用。

应用程序不能自由地书写和读取彼此的内存。这是O.S.的一大特色。它允许应用程序不会让其他人崩溃。

如果你想在Windows应用程序之间共享数据,可以使用下面的选项,as explained here

+0

你知道消息循环如何处理这个问题吗?用user32的'SendMessage'函数。你可以发送指针到另一个进程。他们使用COM吗? – NtFreX

+0

也许,或者他们正在使用来自'kernal32.dll'的'ReadProcessMemory'和'WriteProcessMemory'。它取决于具体的消息。 –