关于进程间传递数据的问题。神啊,救救我吧!!!

chenchen79 2003-01-16 08:29:40
我想用WM_COPYDATA 在进程间传递数据。该怎么进行?
程序A中,
public:
COPYDATASTRUCT cds;
.......
HWND hwnd = ::FindWindow(NULL, "proB");
if (hwnd != NULL)
{
ZeroMemory(&cds, sizeof(COPYDATASTRUCT));
char strWan[30] ;
strcpy(strWan, "this is a tes program");
cds.cbData= strlen(strWan)+1;
cds.dwData = 0 ;
cds.lpData = strWan;

::SendMessage(hwnd, WM_COPYDATA, (WPARAM)this->m_hWnd,(PARAM) &cds);
}
程序B中该怎么接收?
...全文
50 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenchen79 2003-02-10
  • 打赏
  • 举报
回复
请结帖。记得多给各位散点分。
chenchen79 2003-02-10
  • 打赏
  • 举报
回复
前些日子急着过年,没来逛。承蒙各位启发,我的做法如下:
In xxDlg.h
afx_msg void OnCopydata();
afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);

In xxDlg.cpp

#define HANDLE_WM_COPYDATA(hwnd , wParam, lParam, fn) \
((fn)(hwnd, (HWND)(wParam), (PCOPYDATASTRUCT)lParam),0L)
#define FORWARD_WM_COPYDATA(hwnd, hwndFrom, cds, fn) \
(BOOL)(UINT)(DWORD)(fn)((hwnd), WM_COPYDATA, \
(WPARAM)(hwndFrom), (LPARAM)(cds))
.....
ON_BN_CLICKED(IDC_COPYDATA, OnCopydata)
ON_WM_COPYDATA()
.....
void CxxDlg::OnCopydata()
{
HWND hwndOther;
HWND hwndEdit ;
COPYDATASTRUCT cds;
HWND hwnd ;
hwnd = AfxGetMainWnd()->m_hWnd;
// TODO: Add your control notification handler code here
//1. 找到指定窗口
hwndOther = ::FindWindow(NULL,_T("MyCopyData2"));
if (hwndOther == NULL)
{
MessageBox(_T("未找到另一个窗口"),_T("FindWindow Error"), MB_OK);
return;
}
hwndEdit = ::GetDlgItem(hwnd, IDC_DATA);

//2. 封装要传送的数据结构
//prepare the contents of the COPYDATASTRUCT.
cds.dwData = 0;
//get the length of the data block that we are sending.
cds.cbData = (::GetWindowTextLength(hwndEdit) +1 ) * sizeof(TCHAR);
//Allocate a block of memory to hold the string.
cds.lpData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cds.cbData);
//Put the edit control's string in the data block.
::GetWindowText(hwndEdit, (char *)cds.lpData, cds.cbData);

//3. 发送消息
FORWARD_WM_COPYDATA(hwndOther , hwnd, &cds, ::SendMessage);

//4. 释放数据结构所占内存
HeapFree(GetProcessHeap(), 0, cds.lpData);

}

BOOL CxxDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: Add your message handler code here and/or call default
//处理接收到的COPYSTRUCT 结构,此处是改变控件中的内容
::SetWindowText(::GetDlgItem(AfxGetMainWnd()->m_hWnd, IDC_DATA),
(char *)pCopyDataStruct->lpData);

return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
谢谢各位。
icelight 2003-01-20
  • 打赏
  • 举报
回复
靠,我怎么没想到注册表呢。
zzyx 2003-01-20
  • 打赏
  • 举报
回复
仅仅针对这个问题,“我现在只需要向另一个进程中传一个INI文件路径”,俺认为使用注册表最简单。
如楼上各位所言,进程间通讯可用用的计树太多了,自己选择一个合适的就可用了。
sevencat 2003-01-19
  • 打赏
  • 举报
回复
剪贴板的话可能要对剪贴板进行一些编程了。不然搞不好被其他进程接过去。
icelight 2003-01-19
  • 打赏
  • 举报
回复
简洁办法?试试剪贴版?
gull1234 2003-01-18
  • 打赏
  • 举报
回复
Acvanced Windows(third edition) 上有例子。
gull1234 2003-01-18
  • 打赏
  • 举报
回复
to: chenchen79 (神州三号)
正如你所作﹐ 通常用SendMessage() 傳輸一些小的數據﹐ 但是問題是﹕

如果傳輸常規消息﹕SendMessage(hwnd, WM_GETTEXT, (WPARAM)this->m_hWnd,(PARAM) &cds); // 工作正常。

如果傳輸自定義消息﹕SendMessage(hwnd, WM_COPYDATA, (WPARAM)this->m_hWnd,(PARAM) &cds); // 不工作

你必須對你的消息和數據作一下處理。
sevencat 2003-01-18
  • 打赏
  • 举报
回复
楼上说的共享内存应该没问题吧.
chenchen79 2003-01-18
  • 打赏
  • 举报
回复
我现在只需要向另一个进程中传一个INI文件路径,我想知道一种简洁办法。
还有,icelight说的是PreTranslateMessage()吧。我试了,好像不行啊。用文件可以,但是就因为一行字符串就搞个文件太浪费了吧。
icelight 2003-01-17
  • 打赏
  • 举报
回复
解决:
令SendMessage第一个参数指向程序B的主窗口的m_hWnd。
然后在程序B的主窗口的PreTransferMessage()里处理该消息。


建议:
进程间通讯的最好办法不是用WM_COPYDATA,
liagl 2003-01-17
  • 打赏
  • 举报
回复
最简单的是通过一个文件来传送了,使用一个互斥对象使一次只有一个进程可以使用该文件。
也可以使用内存映射或者命名管道。
yansea 2003-01-16
  • 打赏
  • 举报
回复
进程间通信有很多种方法,但基本上还是依赖内存映射文件。
用WM_COPYDATA的话需要在接受消息的窗口过程中处理它。
chenchen79 2003-01-16
  • 打赏
  • 举报
回复
在线等待....

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧