如何在C#中实现两个程序的通信?

两种方法,一种是把数据写入到文件,另一个程序去读!  
第二种方法,用socket,自己定义一个通道,相互间通讯,就好像通过网络通讯一样,但其实是在同一台电脑上!前提是要有Tcp/Ip环境!而且比较适合对数据及时性要求较高的。  
以上两种方法都是比较简单的,我以为。  
最好是去看看有没有可能用全局Dll调用的方法,进行进程间的共享! 

 

如果两个程序之间只是数据通信,可以采用以下方法:  
 
1、通过共享文件或数据库  
 
2、通过管道  
 
3、通过邮槽  
 
4、通过Socket  
 
5、其它  
 
如果两个程序之间不仅是数据通信,而且是处理通信(即程序A可以调用程序B的方法),可以采用以下方法:  

1、Dcom  
 
2、.net  Remoting  
 
3、Web  Service  
---------------------------------------------------------------  
 
进程之间通讯的几种方法:  
 
在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯。常用的方法有  
 
使用内存映射文件  
通过共享内存DLL共享内存  
使用SendMessage向另一进程发送WM_COPYDATA消息  
 
比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一中方法.  
 
WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。Windows在通过WM_COPYDATA消息传递期间,不提供继承同步方式。SDK文档推荐用户使用SendMessage函数,接受方在数据拷贝完成前不返回,这样发送方就不可能删除和修改数据:  
 
这个函数的原型及其要用到的结构如下:  
 
SendMessage(hwnd,WM_COPYDATA,wParam,lParam);    
其中,WM_COPYDATA对应的十六进制数为0x004A  
 
wParam设置为包含数据的窗口的句柄。lParam指向一个COPYDATASTRUCT的结构:  
typedef  struct  tagCOPYDATASTRUCT{  
DWORD  dwData;//用户定义数据  
DWORD  cbData;//数据大小  
PVOID  lpData;//指向数据的指针  
}COPYDATASTRUCT;  
该结构用来定义用户数据。  
 
具体过程如下:  
 
 
首先,在发送方,用FindWindow找到接受方的句柄,然后向接受方发送WM_COPYDATA消息.  
 
接受方在DefWndProc事件中,来处理这条消息.由于中文编码是两个字节,所以传递中文时候字节长度要搞清楚.  
 
体代码如下:  
//---------------------------------------------------  
//发送方:  
using  System;  
using  System.Drawing;  
using  System.Collections;  
using  System.ComponentModel;  
using  System.Windows.Forms;  
using  System.Data;  
using  System.Runtime.InteropServices;  
 
namespace  WinFormSendMsg  
{  
public  class  Form1  :  System.Windows.Forms.Form  
{  
private  System.Windows.Forms.TextBox  textBox1;  
private  System.Windows.Forms.Button  button1;  
private  System.ComponentModel.Container  components  =  null;  
const  int  WM_COPYDATA  =  0x004A;  
public  Form1()  
{  
InitializeComponent();  
}  
 
protected  override  void  Dispose(  bool  disposing  )  
{  
if(  disposing  )  
{  
if  (components  !=  null)    
{  
components.Dispose();  
}  
}  
base.Dispose(  disposing  );  
}  
 
 
private  void  InitializeComponent()  
{  
this.textBox1  =  new  System.Windows.Forms.TextBox();  
this.button1  =  new  System.Windows.Forms.Button();  
this.SuspendLayout();  
//    
//  textBox1  
//    
this.textBox1.Location  =  new  System.Drawing.Point(184,  24);  
this.textBox1.Name  =  "textBox1";  
this.textBox1.Size  =  new  System.Drawing.Size(128,  21);  
this.textBox1.TabIndex  =  0;  
this.textBox1.Text  =  "textBox1";  
//    
//  button1  
//    
this.button1.Location  =  new  System.Drawing.Point(344,  16);  
this.button1.Name  =  "button1";  
this.button1.Size  =  new  System.Drawing.Size(112,  32);  
this.button1.TabIndex  =  1;  
this.button1.Text  =  "button1";  
this.button1.Click  +=  new  System.EventHandler(this.button1_Click);  
//    
//  Form1  
//    
this.AutoScaleBaseSize  =  new  System.Drawing.Size(6,  14);  
this.ClientSize  =  new  System.Drawing.Size(536,  142);  
this.Controls.AddRange(new  System.Windows.Forms.Control[]  {  
this.button1,  
this.textBox1});  
this.Name  =  "Form1";  
this.Text  =  "发送方窗体";  
this.ResumeLayout(false);  
 
}  
 
static  void  Main()    
{  
Application.Run(new  Form1());  
}  
 
[DllImport("User32.dll",EntryPoint="SendMessage")]  
private  static  extern  int  SendMessage(  
int  hWnd,  //  handle  to  destination  window  
int  Msg,  //  message  
int  wParam,  //  first  message  parameter  
ref  COPYDATASTRUCT  lParam  //  second  message  parameter  
);  
 
 
[DllImport("User32.dll",EntryPoint="FindWindow")]  
private  static  extern  int  FindWindow(string  lpClassName,string  
lpWindowName);  
 
 
private  void  button1_Click(object  sender,  System.EventArgs  e)  
{  
int  WINDOW_HANDLER  =  FindWindow(null,@"接收方窗体");  
if(WINDOW_HANDLER  ==  0)  
{  
 
}  
else  
{  
byte[]  sarr  =  System.Text.Encoding.Default.GetBytes(this.textBox1.Text);  
int  len  =  sarr.Length;  
 
COPYDATASTRUCT  cds;  
cds.dwData  =  (IntPtr)  100;  
cds.lpData  =  this.textBox1.Text;  
cds.cbData  =  len  +  1;  
SendMessage(WINDOW_HANDLER,  WM_COPYDATA,  0,  ref  cds);  
 
 
}  
 
}  
}  
public  struct  COPYDATASTRUCT  
{  
public  IntPtr  dwData;  
public  int  cbData;  
[MarshalAs(UnmanagedType.LPStr)]  public  string  lpData;  
}  
 
 
}  
 
 
//---------------------------------------------------  
//接受方  
//---------------------------------------------------  
using  System;  
using  System.Drawing;  
using  System.Collections;  
using  System.ComponentModel;  
using  System.Windows.Forms;  
using  System.Data;  
using  System.Runtime.InteropServices;  
 
namespace  WindowsFormGetMsg  
{  
public  class  Form1  :  System.Windows.Forms.Form  
{  
private  System.Windows.Forms.TextBox  textBox1;  
private  System.ComponentModel.Container  components  =  null;  
const  int  WM_COPYDATA  =  0x004A;  
 
public  Form1()  
{  
InitializeComponent();  
}  
 
protected  override  void  Dispose(  bool  disposing  )  
{  
if(  disposing  )  
{  
if  (components  !=  null)    
{  
components.Dispose();  
}  
}  
base.Dispose(  disposing  );  
}  
private  void  InitializeComponent()  
{  
this.textBox1  =  new  System.Windows.Forms.TextBox();  
this.SuspendLayout();  
//    
//  textBox1  
//    
this.textBox1.Location  =  new  System.Drawing.Point(176,  32);  
this.textBox1.Name  =  "textBox1";  
this.textBox1.Size  =  new  System.Drawing.Size(160,  21);  
this.textBox1.TabIndex  =  0;  
this.textBox1.Text  =  "textBox1";  
//    
//  Form1  
//    
this.AutoScaleBaseSize  =  new  System.Drawing.Size(6,  14);  
this.ClientSize  =  new  System.Drawing.Size(432,  266);  
this.Controls.AddRange(new  System.Windows.Forms.Control[]  {  
this.textBox1});  
this.Name  =  "Form1";  
this.Text  =  "接收方窗体";  
this.ResumeLayout(false);  
 
}  
static  void  Main()    
{  
Application.Run(new  Form1());  
}  
 
protected  override  void  DefWndProc(ref  System.Windows.Forms.Message  m)  
{  
switch(m.Msg)  
{  
case  WM_COPYDATA:  
COPYDATASTRUCT  mystr  =  new  COPYDATASTRUCT();  
Type  mytype  =  mystr.GetType();  
mystr  =(COPYDATASTRUCT)m.GetLParam(mytype);  
this.textBox1.Text  =mystr.lpData;  
break;  
default:  
base.DefWndProc(ref  m);  
break;  
 
}  
 
}  
 
}  
 
public  struct  COPYDATASTRUCT  
{  
public  IntPtr  dwData;  
public  int  cbData;  
[MarshalAs(UnmanagedType.LPStr)]  public  string  lpData;  
}  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值