科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件浅议VC程序中进程间信息交换方法

浅议VC程序中进程间信息交换方法

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

我们都是在一个进程中进行处理,处理什么样的数据和数据的发送都会在同一个进程中进行。

作者:赖锋 来源:vckbase 2007年10月19日

关键字: VC 进程 信息交换

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

  但是,假如要你负责一个程序要在两个不同的进程中交换数据,你会怎么办,你要想怎样做,一般的做法是这样,自定义一个消息,然后你就把这个数据放在这个消息附带的参数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);
}

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

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    闂備緡鍙庨崰鏇炩枎閵忋垺濯奸柕蹇嬪€栭~锟�

    婵犵鈧啿鈧綊鎮樻径鎰畺闁靛ň鏅滄慨婊堟偨椤栨稓鎽冮柟鐑╂櫊瀹曟岸宕堕埡鍌滄殸闂佽鍨伴崢鏍姳閿涘嫭鍠嗘い銈呭姬婵☆偅婢樺Λ妤呮偂濞嗘挸瀚夐柍褜鍓熷顒侊紣娓氣偓閻涙捇鏌涘┑鍛樂缂佹鐭傞獮搴ㄥ焵椤掑嫬瀚夋い鏍ㄧ懁缁诲棝鏌熼褍鐏茬紒杈ㄧ箞閺屽洭鏁愰崟顓犳澖闁荤姳闄嶉崹钘壩i崟顖涘殜闁硅泛顫曢埀顒€锕︾槐鏃堝箣閻愬弬妤呮煛閸偄鐏﹂柛瀣墬缁傛帞鎹勯搹瑙勵啈闂佸搫瀚烽崹閬嶅磻瀹ュ鍎嶉柛鏇ㄥ墯娴犳ê霉閿濆棗鈻曢柍褜鍓氶弻銊ф閻愬鈻曢悗锝傛櫇椤忛亶鏌曢崱顓熷

    重磅专题
    往期文章
    最新文章