进程间通信的问题(在线急等)
我把一个DLL注入到一传送文件的程序中,用来拦截send函数发送的信息,
然后通过
SendMessage(g_hForm,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds);
发送到一指定窗口
窗口的WM_COPYDATA消息映射函数如下(函数主要完成在指定文件中查找拦截到的数据):
//功能: 截获文件传送过程中的数据块,然后在一确定文件中查找看该文件中是否包含这段数据块,SameNum用来统计查找成功的次数
BOOL CDwormDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: Add your message handler code here and/or call default
m_cCopyData=(LPSTR)pCopyDataStruct-> lpData;
m_cCopyData=m_cCopyData.Left(pCopyDataStruct-> cbData);
int nDataNum=m_cCopyData.GetLength();
int nStrLen=nDataNum/2;
m_cCopyData=m_cCopyData.Left(nStrLen);
//UpdateData(FALSE);
char lpFileName[MAX_PATH];
DWORD Ret=GetFullPathName((LPCTSTR)m_cFile,MAX_PATH,
(LPTSTR)lpFileName,NULL);
//错误判断
if(Ret==0)
AfxMessageBox( "未发现! ");
// char* lpFileName = "D:\\test.exe ";
CFile file;
if(!file.Open(lpFileName,CFile::modeRead,NULL))
{
AfxMessageBox( "未打开文件! ");
return FALSE;
}
CFileStatus FileStatus;
if(!file.GetStatus(lpFileName,FileStatus))
return FALSE;
file.SeekToBegin();
CString strBuff;
int nRes=-1,SameNum=0;
strBuff.GetBufferSetLength(1024);
for(long i=0;i <FileStatus.m_size;)
{
memset(strBuff.GetBuffer(0), '\0 ',1024);
file.Read(strBuff.GetBuffer(0),1024);
nRes=strBuff.Find(m_cCopyData);
if(nRes!=-1)
{
SameNum++;
if(SameNum> =2)
//发现
{
AfxMessageBox( "发现! "); //报警
// MessageBeep(0xFFFFFFFF);
file.Close();
return TRUE;
}
}
else
{
file.Seek((i+1024)-nStrLen,CFile::begin);
i=i+1024-nStrLen;
}
}
file.Close();
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
请有空的朋友给看一下,小弟的程序有什么不妥的地方 ,怎么实现不预期功能.
我通过观察发现:窗口可以接受到SendMessage发来的消息.
而且用这段程序去拦截聊天信息并显示都正常
[解决办法]
这样写当然不行了,你是在目标进程中分配的数据,怎么可能在另一个进程取得
GlobalAlloc 来分配共享内存
GlobalLock 来锁住内存
GlobalUnlock解锁全局内存块
GlobalFree 释放内存块