直接读取进程内存实现两个应用程序之间的通信
来源:互联网 发布:淘宝街头篮球三无账号 编辑:程序博客网 时间:2024/04/26 11:51
有两个VC程序,TestSource,TestDest,其中TestSource中有一个显示缩略图的控件,可以显示很多图像,在其中选中一个图像时,通知TestDest中的图像显示控件显示这个选中的图像,实现的方式如下:
我通过CDibImage类操作图像,该类的代码很多地方可以下载。
1、在TestSource中注册Windows消息:
const UINT WM_PACS_IAMGE_SELECTED=RegisterWindowMessage("WM_PACS_IAMGE_SELECTED");
2、在TestSource中选中缩略图消息中,将CDibImage中的图像复制到一块内存中,然后将内存区域的大小和地址发送给TestDest:
HDIB hDib=m_pCurDib->GetHDIB();
DWORD dwDibSize = GlobalSize(hDib);
ASSERT(dwDibSize);
LPSTR lpDib = (LPSTR) ::GlobalLock(hDib);
ASSERT(lpDib);
LPSTR lpBuff=new char[dwDibSize];
CopyMemory(lpBuff,lpDib,dwDibSize);
//PWnd指向TestDest的主窗口
pWnd->SendMessage(WM_PACS_IAMGE_SELECTED,(WPARAM)dwDibSize,(LPARAM)lpBuff);
delete lpBuff;
GlobalUnlock(hDib);
3、在TestDest中注册同样的消息,并增加消息处理函数:
const UINT WM_PACS_IAMGE_SELECTED=RegisterWindowMessage("WM_PACS_IAMGE_SELECTED");
4、在TestDest的消息处理函数中增加如下的代码:
long nBufferSize=(long)wParam; // 读取缓冲区大小
LPVOID lpAddress=(LPVOID)lParam; // 图像文件在TestDest中的内存地址
LPVOID lpBuffer=new char[nBufferSize];
int ProcessID=GetProcessID("TestSource.exe");
HANDLE hProcessPacs=OpenProcess(PROCESS_ALL_ACCESS|PROCESS_VM_READ,TRUE,ProcessID);
if(hProcessPacs)
{
DWORD dwReadBytes=0;
if(ReadProcessMemory(hProcessPacs,lpAddress,lpBuffer,nBufferSize,&dwReadBytes))
{
CThumbnailView * pView=(CThumbnailView *)this->m_wndThumbnailBar.m_pView;
pView->AddNewImage(lpBuffer,nBufferSize);
}
else
{
DWORD dwError=GetLastError();
CString sErrMsg="";
}
}
CloseHandle(hProcessPacs);
delete lpBuffer;
这样在TestDest的缩略图控件中就实现了图像的显示。
主要上面代码中有一个函数 int ProcessID=GetProcessID("TestSource.exe");其功能时通过枚举系统中所有的进程,找到名称为TestSource.exe的进程ID,其代码如下:
int GetProcessID(LPCTSTR strExeName)
{
HANDLE hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32* processInfo=new PROCESSENTRY32;
processInfo->dwSize=sizeof(PROCESSENTRY32);
int index=0;
int processID=0;
while(Process32Next(hSnapShot,processInfo)!=FALSE)
{
CString sName;
sName.Format("%s",processInfo->szExeFile);
if(sName.CompareNoCase(strExeName)==0)
{
processID=processInfo->th32ProcessID;
break;
}
}
CloseHandle(hSnapShot);
delete processInfo;
return processID;
}
- 直接读取进程内存实现两个应用程序之间的通信
- LINUX 实现两个进程之间的通信
- Delphi 两个应用程序(进程)之间的通信
- Delphi 两个应用程序(进程)之间的通信
- Delphi 两个应用程序(进程)之间的通信
- 两个应用程序之间的通信
- 通过共享内存,实现两个进程A,B之间的通信
- 通过共享内存,利用循环队列实现两个进程A,B之间的通信
- 两个进程之间的通信
- 使用管道实现两个进程之间的通信
- Linux进程间通信-----使用数据报套接字实现两个进程之间的通信
- 两个进程之间通信
- 两个进程之间的通信方式有哪几种?
- Flex ExternalInterface 在 ActionScript 和 Flash Player 容器之间实现直接通信的应用程序编程接口
- 进程之间的通信 ------内存共享
- 进程之间的通信方式-共享内存
- java两个进程之间通信
- Aidl实现应用程序之间的 通信
- 感冒了
- DataGridView中如何在textbox列中限制输入。
- 用expect简化操作
- DNN框架初探
- SQL Profiler的找法
- 直接读取进程内存实现两个应用程序之间的通信
- QQ秀文字,很酷的!
- blog时钟、天气预报、搜索、Media播放器源码
- 《C++捷径教程》读书笔记--Chapter 4--程序控制语句(第二部分)
- 服了
- Crontab 使用
- SMS modem资料
- SUS client regedit
- IPX协议设置