C#通过SendMessage进行应用程序间通信

C#通过SendMessage进行应用程序间通信,c#,pointers,.net-2.0,sendmessage,inter-process-communicat,C#,Pointers,.net 2.0,Sendmessage,Inter Process Communicat,因此,在找到一种合适的方式让我的不同流程进行沟通后,我遇到了很多问题,我拼凑了以下内容: public const uint HWND_BROADCAST = 0xffff; [DllImport( "user32" )] public static extern bool SendMessage(IntPtr hwnd, IntPtr msg, IntPtr wparam, IntPtr lparam); [DllImport( "user32" )] public static extern

因此,在找到一种合适的方式让我的不同流程进行沟通后,我遇到了很多问题,我拼凑了以下内容:

public const uint HWND_BROADCAST = 0xffff;
[DllImport( "user32" )]
public static extern bool SendMessage(IntPtr hwnd, IntPtr msg, IntPtr wparam, IntPtr lparam);
[DllImport( "user32" )]
public static extern int RegisterWindowMessage(string message);
public static readonly uint WM_COPYDATA = (uint)RegisterWindowMessage( "WM_COPYDATA_DESKTOP_TODOLIST_9234892348932GIBBERISH" );
其使用方式如下:

public static void SendMessage(string Message) {
SendMessage( (IntPtr)HWND_BROADCAST, (IntPtr)WM_COPYDATA, (IntPtr)Rawify( ref Message ), (IntPtr)Message.Length );
}

// Preparing the message for pointer-sending
public static IntPtr Rawify(ref string target) {
char[] CHARS = target.ToCharArray();

// Copy string to raw memory block of bytes
int count = target.Length;
IntPtr P = Marshal.AllocHGlobal( 2 * count );
for (int I = 0; I < count; I++) {    Marshal.WriteInt16( (IntPtr)((int)P + I * 2), target[I] );    }

return P;
}

public static string Cook(IntPtr target, IntPtr length) {
int count = (int)length;
char[] CHARS = new char[count];

// Copy raw memory to char array->string
for (int I = 0; I < count; I++) {    CHARS[I] = (char)Marshal.ReadInt16( (IntPtr)((int)target + I * 2) );    }

return new string( CHARS );
}
}
现在,一切都很顺利,我已经彻底测试过了

发生的情况是,我从Runtime.InteropServices借用了SendMessage。 该消息已成功通过网络发送。 然而,它仅限于两个可怜的IntPtr

因此,我决定最好通过指针发送到某个非托管内存,以及该内存的大小

发送成功,但是在两个不同的程序实例中,指针显然不指向同一个位置。看起来像IntPtr,Marshal.AllocHGlobal是一些仅与当前程序相关的任意本地指针,因此给了我读/写访问冲突的异常,或一些随机空值,或一些随机的其他字符,在某个点上,我甚至从某处采样了一个随机的“l32.dll”字符串。鬼

我只是想知道如何获取指针,该指针指向两个不同应用程序中的相同数据。我甚至不知道从哪里开始寻找这个答案,因此我在这里发问。

有没有办法通过封送员获取指针,或者我需要其他东西。 我可以弄清楚细节,只需要让我知道一些指针,如果在多个程序中使用,它指向相同的数据

或者,如果我正在做的事情非常可怕,是个坏主意,我希望知道其他选择,只要它们不是:命名管道、RPC、内存映射、文件、互斥体;因为,出于各种原因,我在.NET2.0中工作,而这些在那里是不可用的;互斥不传输数据;我喜欢我的硬盘,干净,不忙,完好无损

再次提醒:我们的目标是在同一程序的多个实例之间,或者可能在其他程序之间,即在自己的应用程序域中的.EXE等,传递任何类型和大小的数据(我可以接受一些限制)


忘了提一下,这必须在.NET2.0中,我所需要的只是一个指针,指向多个应用程序之间的相同数据。

哇!为什么不使用WCF通过IPC在进程之间通信


我猜您要么需要在源进程上
OpenHandle
,然后从那里
ReadProcessMemory
(因为您正在广播的内存地址是应用程序的本地地址),要么使用或共享内存空间。无论是哪种方式,您都在深入研究Win32 P/Invoke land,因为它们都不可在.NET 2.0上完全管理


编辑:您似乎编辑了您的问题,以删除这些作为可行候选人的问题。您要求IPC的方法,但排除了IPC的所有方法(没有理由)。

.NET 3.0。我想要.NET 2.0是的,ReadProcessMemory需要的数据比两个IntPtr所能处理的要多得多。我不一定是在寻找一种有管理的方法来做到这一点。我只需要一些在应用程序之间有效的“全局”指针,并且开销最小。或者,我可以发送多条SendMessages并同步它们以执行ReadProcessMemory hax。我“专业”需要的是.NET远程方法调用,它基本上是一个TCP连接,在应用程序之间使用HTTP协议发送数据,以执行类似于我需要的操作。我需要一个离线协议较少的数据连接;Windows程序所遭受的随机性使得有必要将指针传递给进程和数据。似乎没有更好的方法了。打开句柄并从ReadProcessMemory读取需要额外的东西,比如了解源程序;这太麻烦了,只有在没有其他办法的情况下我才会实施。我也不一定在寻找一种“有管理的”方法来做到这一点。你为什么要把MMF扔出窗外?它们不一定会持久化到磁盘,您可以选择在创建时指定“临时”内存映射文件。在.NET-2.0中不受支持。如果可以的话,我很乐意使用它们。他们也没有做我希望他们做的事情。你说你不一定要寻找一种“托管”的方式来做这件事——所以P/调用MMF API(从开始)。正如我所说的,MMF是不可能的。
// Receiver for alternate applications
protected override void WndProc(ref Message m) {
if (m.Msg == Native.Messaging.WM_COPYDATA) { MessageBox.Show( "[" + Native.Messaging.Cook( m.WParam, m.LParam ) + "]" ); }
base.WndProc( ref m ); // Default handling
}