直接读取进程内存实现两个应用程序之间的通信

来源:互联网 发布:淘宝街头篮球三无账号 编辑:程序博客网 时间: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;

}

原创粉丝点击