WEB开发网      濠电姷鏁告繛鈧繛浣冲洤纾瑰┑鐘宠壘閻ょ偓銇勯幇鍫曟闁稿鍠愰妵鍕冀閵娧佲偓鎺楁⒒閸曨偄顏柡宀嬬畱铻e〒姘煎灡绗戦梻浣筋嚙濮橈箓顢氳濠€浣糕攽閻樿宸ュΔ鐘叉啞缁傚秹宕滆绾惧ジ寮堕崼娑樺缂佹宀搁弻鐔风暋閻楀牆娈楅梺璇″枓閺呯姴鐣疯ぐ鎺濇晝闁靛牆妫欓蹇旂節閻㈤潧浠﹂柛銊ョ埣楠炴劙骞橀鑲╋紱闂佽宕樼粔顔裤亹閹烘挸浜归梺缁樺灦閿曗晛螞閸曨垱鈷戦柟鑲╁仜婵″ジ鎮楀☉鎺撴珖缂侇喖顑呴鍏煎緞濡粯娅囬梻浣瑰缁诲倿寮绘繝鍥ㄦ櫇闁稿本绋撻崢鐢告煟鎼淬垻鈯曢柨姘舵煟韫囥儳绋荤紒缁樼箖缁绘繈宕橀妸褌绱濋梻浣筋嚃閸ㄤ即宕弶鎴犳殾闁绘梻鈷堥弫鍌炴煕閳锯偓閺呮瑧妲愬Ο琛℃斀闁绘劕妯婇崵鐔封攽椤旇棄鍔ら摶鐐烘煕閺囥劌澧柛娆忕箻閺屽秹宕崟顒€娅g紓浣插亾濠㈣泛顑囩粻楣冩煙鐎涙ḿ绠橀柨娑樼У椤ㄣ儵鎮欓鍕紙闂佽鍠栫紞濠傜暦閹偊妲诲┑鈩冨絻椤兘寮诲☉銏犖╅柕澶堝労閸斿绱撴担绋库偓鍝ョ矓瑜版帒鏋侀柟鍓х帛閺呮悂鏌ㄩ悤鍌涘 ---闂傚倸鍊烽悞锔锯偓绗涘厾娲煛閸涱厾顔嗛梺璺ㄥ櫐閹凤拷
开发学院软件开发VC 关于进程间互发信息 阅读

关于进程间互发信息

 2006-07-20 11:39:46 来源:WEB开发网 闂傚倸鍊风欢姘缚瑜嶈灋闁圭虎鍠栫粻顖炴煥閻曞倹瀚�闂傚倸鍊风粈渚€骞夐敓鐘插瀭闁汇垹鐏氬畷鏌ユ煙閹殿喖顣奸柛搴$У閵囧嫰骞掗幋婵冨亾閻㈢ǹ纾婚柟鐐灱濡插牊绻涢崱妤冃℃繛宀婁簽缁辨捇宕掑鎵佹瀸闂佺懓鍤栭幏锟�濠电姷鏁告慨顓㈠箯閸愵喖宸濇い鎾寸箘閹规洟姊绘笟鈧ḿ褍煤閵堝悿娲Ω閳轰胶鍔﹀銈嗗笂閼冲爼鍩婇弴銏$厪闁搞儮鏅涙禒褏绱掓潏鈺佷槐闁轰焦鎹囬弫鎾绘晸閿燂拷闂傚倸鍊风欢姘缚瑜嶈灋闁圭虎鍠栫粻顖炴煥閻曞倹瀚�  闂傚倸鍊烽懗鑸电仚缂備胶绮〃鍛村煝瀹ュ鍗抽柕蹇曞У閻庮剟姊虹紒妯哄闁诲繑姘ㄩ埀顒佸嚬閸撶喎顫忓ú顏勫瀭妞ゆ洖鎳庨崜浼存⒑闁偛鑻晶顔剧磼婢跺﹦绉虹€殿喖顭锋俊姝岊槷闁稿鎹囧Λ鍐ㄢ槈濞嗗繑娈橀梻浣风串缂嶁偓濞存粠鍓熼崺鈧い鎺戝€归弳顒勬煕鐎n亷韬€规洑鍗冲鍊燁槾闁哄棴绠撻弻銊╂偆閸屾稑顏�
核心提示:想一想,在平时的处理程序的时候,我们都是在一个进程中进行处理,所以,在处理字符串的时候,我们都不用考虑太多的问题,处理什么样的数据和数据的发送都会在同一个进程中进行,但是,假如要你负责一个程序要在两个不同的进程中交换数据,你会怎么办,你要想怎样做,一般的做法是这样,自定义一个消息,然后你就把这个数据放在这个消息附带的参

想一想,在平时的处理程序的时候,我们都是在一个进程中进行处理,所以,在处理字符串的时候,我们都不用考虑太多的问题,处理什么样的数据和数据的发送都会在同一个进程中进行。

但是,假如要你负责一个程序要在两个不同的进程中交换数据,你会怎么办,你要想怎样做,一般的做法是这样,自定义一个消息,然后你就把这个数据放在这个消息附带的参数WPARAM wParam 与 LPARAM lParam 中,不过这样只能限于非字符串的传递,只能传递数字,或者你更聪明一点,把字符编码,然后在另一个进程中解码,这样可以做成伪字符的数据传递。

不过,这样的方法都不错!

我在开始的时候,使用了字符地址作为消息参数进行传递,可是由于进程间都是独立的4GB内存空间,当接到我的字符消息的时候,就程序就误以为是自已的进程空间的地址,所以就把读取了这个地址,一般结果来看,不是乱码就是空字符串。

那么我们有什么方法可以在消息中进行字符串的传递呢?

我们可以使用两个Windows的消息分别进行一个字符串的两个进程间的传递,

一个消息是WM_SETTEXT。

一个消息是WM_COPYDATA。

以下我来分析这两个消息怎么实现,

最简单的是使用WM_SETTEXT的消息了,这个方法只是使用一个字符串的地址作为一个消息参数就可以实现了两个不同进程间的消息的互发了。

原因是因为这个消息会为这个字符串分配一个内存空间,在接收方就可以根据这个地址把这个字符串读取保存了

CString str = _T( "Hello" );
HWND hWndReceived = FindWindow( "Receiver", NULL );
SendMessage( hWndReceived, WM_SETTEXT, 0, (LPARAM) str );

在接收方这样处理消息:

加入消息映射宏:

BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
//{{AFX_MSG_MAP(CMyWnd)
...
ON_MESSAGE( WM_SETTEXT, OnSetTextMsg )
...
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
...

加入消息映射函数:

afx_msg void OnSetTextMsg( WPARAM wParam, LPARAM lParam)
OnSetTextMsg( WPARAM wParam, LPARAM lParam )
{
  char str[ 256 ];
  wsprintf( str, "%s", (char*) lParam );
  // 加入处理这个字符串的语句
  .....
}

使用WM_COPYDATA:CString str = _T( "Hello" );
HWND hWndReceived = FindWindow( "Receiver", NULL );
COPYDATASTRUCT cpd;
cpd。dwData = 0;
cpd。cbData = strDataToSend。GetLength();
cpd。lpData = (void*)str。GetBuffer(cpd。cbData);
SendMessage( hWndReceived, WM_COPYDATA, 0, (LPARAM) & cpd );
str。ReleaseBuffer();

加入映射宏:

BEGIN_MESSAGE_MAP(CMyWnd, CWnd) //{{AFX_MSG_MAP(CMyWnd) ... ON_WM_COPYDATA() ... //}}AFX_MSG_MAP END_MESSAGE_MAP() ...

映射函数:

BOOL CMyWnd::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
    CString strRecievedText = (LPCSTR) (pCopyDataStruct->lpData);
    return CMyWnd::OnCopyData(pWnd, pCopyDataStruct);
}

这样就可以实现了不同进程间两个字符串之间的互发!

结束语:

这只是一些简单的方法,对这些感兴趣的或需要源代码的朋友,可以跟我联系。

Tags:关于 进程 信息

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接