求教:两个程序之间的通信问题

fanlin00428 2005-07-19 11:21:59
有两个可执行程序:第一个程序每秒产生一个字符串,第二个是一个客户端发送程序。我需要将第一个程序产生的字符串,通过第二个程序实时的发送出去。请问:1.如何把产生的字符串传递个发送程序(每秒产生一个字符串,同时传递给第二个程序)?2.用什么方法比较可行(管道,消息,共享内存,socket...)?3.如何实现,请写出一点简单代码,或提供一点相关信息、网址。
请不吝赐教,高分酬谢,顶者有分!
...全文
270 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
AntonlioX 2005-07-21
  • 打赏
  • 举报
回复
还可以用 套接字 进程间通讯
skykeen 2005-07-21
  • 打赏
  • 举报
回复
mark
cryptonym 2005-07-21
  • 打赏
  • 举报
回复
管道比套结子更快。
Kudeet 2005-07-20
  • 打赏
  • 举报
回复
http://www.yesky.com/42/1720542.shtml
fanlin00428 2005-07-20
  • 打赏
  • 举报
回复
谢谢各位,烦请哪位介绍一下共享内存的方法。
linur 2005-07-20
  • 打赏
  • 举报
回复
可用管道, 转一篇文章:
本文将在VC++环境下介绍一个父进程和其子进程的通信实例。在父进程Parent窗口中按一下鼠标左键,就会产生一个管道(Pipe)并启动子进程Child,且从(Pipe)一端发送信息,同时Child启动后会创建一个工作线程,专门用来从管道的另一端读入数据。父进程通过菜单项的控制来改变图形形状参数,并传给Child使之在自己的窗口中绘出响应的图形。下面分别就父进程Parent和子进程Child来进行说明。

父进程Parent
在父进程Parent中,我们将创建管道和启动子进程。首先说明几个相关函数。

创建进程函数:

BOOL CreateProcess(

LPCTSTR lpApplicationName, //应用模式指针

LPTSTR lpCommandLine, // 命令行字符串

LPSECURITY_ATTRIBUTES lpProcessAttributes,

// 进程安全性指针

LPSECURITY_ATTRIBUTES lpThreadAttributes,

// 主线程安全性指针

BOOL bInheritHandles,// 是否继承句柄

DWORD dwCreationFlags,// 进程类型与优先级

LPVOID lpEnvironment,// 环境块指针

LPCTSTR lpCurrentDirectory,// 当前目录

LPSTARTUPINFO lpStartupInfo,

// STARTUPINFO结构指针

LPPROCESS_INformATION lpProcessInformation);

// 新进程信息

创建管道函数:

BOOL CreatePipe(

PHANDLE hReadPipe, // 读句柄变量地址

PHANDLE hWritePipe,// 写句柄变量地址

LPSECURITY_ATTRIBUTES lpPipeAttributes,

// 安全属性指针

DWORDnSize );//管道缓冲区大小

写管道函数:

BOOL WriteFile(

HANDLE hFile;//写入文件句柄

LPCVOID lpBuffer;//写入数据指针

DWORD nNumberOfBytesToWrite;

//要写入字节数量

LPDWORD lpNumberOfBytesWritten;

//已写入字节数地址

LPOVERLAPPED lpOverlapped );

//异步I/O结构指针

下面从编程角度讨论其实现步骤:

1.利用AppWizard(EXE)产生Parent应用框架,然后在文件Parentview.cpp头部加入#in clude<global.h>,其中文件global.h定义了两个进程用于相互通信的结构和常量值。代码如下:

Global.h 共享变量头文件:

typedef struct Figure

{int iShape;// 图形控制参数

} FIGURE,*PFIGURE;

#define ID_RECT 32771

#define ID_ELLIPSE 32772

#define ID_TERMINATE 32773

2.使用ClassWizard工具:选择对应于CParentView类的消息WM_LBUTTONDOWN,选择AddFu nction键,增加函数OnLButtonDown()。在主菜单资源中加入Rect、Ellipse、Terminate菜单项,ID分别为IDC_RECT、IDR_ELLIPSE、IDR_TERMINATE,并在ClassWizard中加入相应函数。

在文件Parentview.h中加入如下代码:

public:

BOOL SendCommand();//发送信息

HANDLE hProcess; //进程句柄

HANDLE hpipeWrite; //管道写句柄

FIGURE figure;

本文给出Parentview.cpp的部分程序代码。

编者注:源代码发表在:http://www.computerworld.com. cn/98/skill/default. htm。

子进程Child
Child启动之后,立刻创建一个新的线程,并在新线程中执行读管道操作,利用读得的参数使主窗口绘出形状。读管道函数为:

BOOL ReadFile(

HANDLE hFile,// 读入文件句柄

LPVOID lpBuffer, // 读入数据缓冲区地址

DWORD nNumberOfBytesToRead;

// 要读入字节数量

LPDWORD lpNumberOfBytesRead,;

// 已读入字节数地址

LPOVERLAPPED lpOverlapped );

// 异步I/O结构指针

首先,从MFC类库中创建新线程,使用ClassWizard工具:选择AddClassNew,输入类名CT hr,在基类列表框中选择“CWinThread",按下Create按钮,生成线程类CThr。然后修改程序代码。本文给出部分源程序。

结论
运行本文例程,在父进程Parent窗口中按一下鼠标左键,就会产生一个Pipe并启动子进程Child;在Parent中选中菜单项Rect或Ellipse时,Child窗口中就会分别绘出矩形和椭圆;选中Terminate时,就会中断通信。以上介绍的是匿名管道,若要增加通信的灵活性还可采用命名管道NamedPipe,读者可尝试实现。

ForTopLevel 2005-07-20
  • 打赏
  • 举报
回复
可以用共享内存,简单点说共享内存就像一个存在于内存中的文件,可以被任何已知句柄的进程访问,但是看你的数据量不大,用WM_COPYDATA消息是不是更好呢?
oyljerry 2005-07-19
  • 打赏
  • 举报
回复
数据量比较少,就用简单的WM_COPYDATA等好了,使用简单
Kudeet 2005-07-19
  • 打赏
  • 举报
回复
使用WM_COPYDATA:

CString str = _T( "Hello" );
HWND hWndReceived = FindWindow( "Receiver", NULL );

COPYDATASTRUCT cpd;
cpd.dwData = 0;
cpd.cbData = strDataToSend.GetLength();
cpd.pData = (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);
}
smartcomplier 2005-07-19
  • 打赏
  • 举报
回复
为什么用两个程序呢?

用两个线程不好吗?

fanlin00428 2005-07-19
  • 打赏
  • 举报
回复
另:字符串大小不定,小于1K

15,471

社区成员

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

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