当然可以了,句柄一般用FindWindow得到
解决方案 »
- 项目需要,一个对话框中需要建300+个控件,怎么办?
- vc ado 读取mysql图片(blod)字段不正确
- 请问专家!!sdk和mfc?
- 使用VC2005,WTL7.5组合,居然不能插入 Simple ATL Object。天大的怪事,高分求解。
- 为什么我使用capicom.dll,使用了名字空间 using namespace capicom 之后对listctrl排序就有问题了。
- 急:如何可以快速地将40万个点(x,y,z)中重复的顶点的删除
- 对话框DOMODAL问题。
- 封装ADO的一个问题,好头痛啊...
- 菜鸟问题:关于文件结构???
- vc 关于picture控件的使用
- 一个关于c++在VC运行的问题
- 这个link问题怎么解决?
PostThreadMessage( DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
给这个句柄PostMessage
==================================================================
但是一般而言没友窗体的线程是米有消息队列的,就是“没有路,怎么能走呢”
我试着使用FindWindow去获得一个控制台进程的handle,
但是返回值总是0。各位兄弟姐妹,能给点有权威的回答吗,
利用PostMessage等API进行没有窗体的进程之间的通信,
到底能行还是不能行,我也好有个数。
========================================
是么?那CWnd的成员变量m_hWnd取什么值呢????
以上两个发消息的函数都是与HWND相关的,即必须有窗口句柄,才能发消息。
若要想线程发消息,用PostThreadMessage,需要知道线程的id,并且线程有消息循环
使用PostThreadMessage的话,如何能知道接受者的线程的id呢?
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId-------------线程ID
);
这两个到网上查一下,就可以得到一些资料
如果有多个控制台,那么LZ需要的到底是哪一个?
这就像去找人一样,不知道对方姓名、年龄、性别、样貌、身材、服饰,如果去找?
失散多年的母子相聚,好歹还有个胎记可以区分一下。
LZ必须先确定一个唯一的标志,然后再来让对方通过这个标志找到它!
--------------------------------
可以得到自己的id,但怎么去告诉别人呢。
现在想问的是:
PostThreadMessage如何进行两个进程之间的通信?
因为以前没学习过,所以一些问题可能问的很无知,而且也没什么时间磨刀(笑)。再总结一下问题:
目前要实现两个没有窗体的后台进程之间的通信,并且非得要用Win32API中的函数来完成,如何弄?
其次,你自己必须定义通信协议,包括怎么告诉对方等答案
“创建一个不可视的窗口”应该是比较简单而可行的方法,其他方法都比这个要复杂,在你没有时间去磨刀的情况下,还是选择他,否则我真怀疑你几个月内能不能搞明白
用不可见窗口,通过RegisterWindowMessage定义系统级的消息
通过消息映射来处理对于你,应该是唯一可行的
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()3。动态数据交换(DDE)通过维护全局分配内存使的应用程序间传递成为可能
其方式是再一块全局内存中手工放置大量的数据,然后使用窗口消息传递内存 指针.这是16位WIN时代使用的方式,因为在WIN32下已经没有全局和局部内存 了,现在的内存只有一种就是虚存。 4。消息管道(Message Pipe)
用于设置应用程序间的一条永久通讯通道,通过该通道可以象自己的应用程序
访问一个平面文件一样读写数据。
匿名管道(Anonymous Pipes)
单向流动,并且只能够在同一电脑上的各个进程之间流动。
命名管道(Named Pipes)
双向,跨网络,任何进程都可以轻易的抓住,放进管道的数据有固定的格 式,而使用ReadFile()只能读取该大小的倍数。
可以被使用于I/O Completion Ports5 邮件槽(Mailslots)
广播式通信,在32系统中提供的新方法,可以在不同主机间交换数据,在 WIN9X下只支持邮件槽客户6。Windows套接字(Windows Socket)
它具备消息管道所有的功能,但遵守一套通信标准使的不同操作系统之上的应 用程序之间可以互相通信。7。Internet通信 它让应用程序从Internet地址上载或下载文件8。RPC:远程过程调用,很少使用,因其与UNIX的RPC不兼容。9。串行/并行通信(Serial/Parallel Communication)
它允许应用程序通过串行或并行端口与其他的应用程序通信10。COM/DCOM
通过COM系统的代理存根方式进行进程间数据交换,但只能够表现在对接口 函数的调用时传送数据,通过DCOM可以在不同主机间传送数据。