在一个EXE中打开另一个EXE, 再给这个EXE传递一个窗体参数..如何做

CruelYoung123 2006-12-16 09:45:28
在一个EXE中打开另一个EXE, 再给这个EXE传递一个窗体参数..如何做

就像在QQ中打开聊天室程序一样

谢谢大家
...全文
451 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
metyph 2006-12-22
  • 打赏
  • 举报
回复
mark
laowang2 2006-12-21
  • 打赏
  • 举报
回复
mark
wenyongjie 2006-12-19
  • 打赏
  • 举报
回复
例如有两个进程 A.exe 和B.exe,A.exe 调用B.exe可以用winexec、ShellExecute、createprocess(我就知道 这三个了,呵呵 ) ,其中前两个比较简单,可在网上找下例子,此略。如果要从A传参数给B.exe,最简单的办法就是发消息了SendMessage(hWmd,WM_COPYDATA,NULL,(long)&cs);
见以下我程序里的例子,以下例子仅做参考,因为是从我的程序里抽出一部的,所以里面的变量结构未定义,望楼主自己总结看下,而不要照抄,关键是
PCOPYDATASTRUCT 、COPYDATASTRUCT、SendMessage
接收方:
void __fastcall TMainForm::RecData(Messages::TMessage msg)//这个要在.h里定义
{

PCOPYDATASTRUCT pMyCDS=(PCOPYDATASTRUCT) msg.LParam;
Gas_Value.szCO=((GASDATA *)(pMyCDS->lpData))->szCO;
Gas_Value.szHC=((GASDATA *)(pMyCDS->lpData))->szHC;
Gas.m_CO1=Gas_Value.szCO;
Gas.m_HC1=Gas_Value.szHC;
}
发送方:
COPYDATASTRUCT cs;
cs.dwData = 100;
cs.cbData =sizeof(Decode)+1;
cs.lpData =&Decode;
SendMessage(GetMainHWND("TMainForm"),WM_COPYDATA,(WPARAM)testing->Handle,(LPARAM)(&cs));
wood542344 2006-12-18
  • 打赏
  • 举报
回复
用postMessage不行吗?用findwindow来找出这个应用程序,再给这个窗体发信息,或再找到窗体里的输入框,再输入信息也可以。
ljianq 2006-12-18
  • 打赏
  • 举报
回复
方法很多,最简单的用命令行参数。
pp616 2006-12-17
  • 打赏
  • 举报
回复
createprocess 里可以直接带启动参数的。
CruelYoung123 2006-12-17
  • 打赏
  • 举报
回复
谢谢两位...

程序通讯这么多方法!...

看起来都挺复杂的呵
leonatcs 2006-12-16
  • 打赏
  • 举报
回复
为了能在两个进程之间进行通讯,由以下几种方法可供参考:

0。剪贴板Clipboard:
在16位时代常使用的方式,CWnd中提供支持,可能程序必须提供该方法,而不是作为一种IPC方法来选用。

1。窗口消息
标准的Windows消息以及专用的WM_COPYDATA消息 SENDMESSAGE()接收端必须有一个窗口

2。使用共享内存方式(Shared Memory)
a.设定一块共享内存区域
HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCSTR)
产生一个file-mapping核心对象
LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAcess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap
);
得到共享内存的指针
b.找出共享内存
决定这块内存要以点对点(peer to peer)的形式呈现
每个进程都必须有相同的能力,产生共享内存并将它初始化。每个进程
都应该调用CreateFileMapping(),然后调用GetLastError().如果传回的
错误代码是ERROR_ALREADY_EXISTS,那么进程就可以假设这一共享内存区域已经被别的进程打开并 初始化了,否则该进程就可以合理的认为自己 排在第一位,并接下来将共享内存初始化。
还是要使用client/server架构中
只有server进程才应该产生并初始化共享内存。所有的进程都应该使用
HANDLE OpenFileMapping(DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName);
再调用MapViewOfFile(),取得共享内存的指针
c.同步处理(Mutex)
d.清理(Cleaning up) BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);
CloseHandle()

共享内存总结:
0. CreateFile(); CloseHandle();
1. CreateFileMapping(); 如果在内存建立共享区,第一个参数用0xFFFFFFFF
2. OpenFileMapping();
3. MapViewOfFile(); UnmapViewOfFile();

在进程间共享句柄用DuplicateHandle();


3。动态数据交换(DDE)通过维护全局分配内存使的应用程序间传递成为可能
其方式是再一块全局内存中手工放置大量的数据,然后使用窗口消息传递内存 指针.这是16位WIN时代使用的方式,因为在WIN32下已经没有全局和局部内存 了,现在的内存只有一种就是虚存。

4。消息管道(Message Pipe)
用于设置应用程序间的一条永久通讯通道,通过该通道可以象自己的应用程序
访问一个平面文件一样读写数据。
匿名管道(Anonymous Pipes)
单向流动,并且只能够在同一电脑上的各个进程之间流动。
命名管道(Named Pipes)
双向,跨网络,任何进程都可以轻易的抓住,放进管道的数据有固定的格式,而使用ReadFile()只能读取该大小的倍数。
可以被使用于I/O Completion Ports

5 邮件槽(Mailslots)
广播式通信,在32系统中提供的新方法,可以在不同主机间交换数据,在WIN9X下只支持邮件槽客户

6。Windows套接字(Windows Socket)
它具备消息管道所有的功能,但遵守一套通信标准使的不同操作系统之上的应用程序之间可以互相通信。

7。Internet通信
它让应用程序从Internet地址上载或下载文件

8。RPC:
远程过程调用,很少使用,因其与UNIX的RPC不兼容。

9。串行/并行通信(Serial/Parallel Communication)
它允许应用程序通过串行或并行端口与其他的应用程序通信

10。COM/DCOM
通过COM系统的代理存根方式进行进程间数据交换,但只能够表现在对接口函数的调用时传送数据,通过DCOM可以在不同主机间传送数据。

11.定义共享变量
1.定义DLL全局共享变量,VC++,C++BUILDER都有办法,没见过DELPHI有这方面的介绍; 2.用API的文件映射的全局变量,通用性好,许多资料都有介绍;


另外,程序间通信还可以采用注册表,ini文件等方式。
CACACACACA 2006-12-16
  • 打赏
  • 举报
回复
winexec
ShellExecute
createprocess
都能执行另一个EXE文件,
但不知道"再给这个EXE传递一个窗体参数"是啥意思.
没用过QQ聊天室功能.

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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