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

时间:2015-02-19 15:23:39

标签: 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 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 );
}
}

在接收端

// 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
}

现在,一切都很好,我已经彻底测试过;

我从Runtime.InteropServices借用了SendMessage会发生什么。 邮件已成功发送。 但是,它只限于两个可怜的IntPtr。

所以我决定做的最好的事情是通过一个指向一些非托管内存的指针,以及该内存的大小。

发送成功,但是在两个不同的程序实例中,指针显然没有指向同一个地方。它看起来像IntPtr Marshal.AllocHGlobal是一些任意本地指针只与当前程序相关,因此给了我读/写访问冲突,或一些随机空值或一些随机的其他字符的异常,并且在某些时候我甚至采样了随机&#34; l32.dll&#34;某处的字符串。鬼!

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

有没有办法用Marshals获取指针,或者我还需要其他东西。 我可以弄清楚细节,我只需要了解一些指针,如果在多个程序中使用,则将指向相同的数据

或者,如果我正在做的事情非常可怕而且是一个坏主意,我想知道替代方案,只要它们不是:命名管道, RPC,Memorymapped,Files,Mutex;因为原因,我在.NET 2.0中工作,那些在那里不可用;而Mutex并没有传输数据;我喜欢我的硬盘漂亮,干净,不忙,处于原始状态。

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

忘记提及,这必须在.NET 2.0中,我所需要的只是一种指向多个应用程序之间的相同数据的指针。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

我猜你要么在源进程上需要OpenHandle而在那里需要ReadProcessMemory(因为你正在广播的内存地址是应用程序的本地地址),或者使用{{ 3}}或共享内存空间。无论哪种方式,你都在挖掘Win32 P / Invoke的土地,因为它们都不能在.NET 2.0上完全管理。

编辑:您似乎编辑了您的问题,将其删除为可行的候选人。您要求使用IPC的方法,同时排除IPC的所有方法(无理由)。