读书人

进程间通信的有关问题(在线急等)

发布时间: 2012-01-28 22:06:13 作者: rapoo

进程间通信的问题(在线急等)
我把一个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 释放内存块


读书人网 >VC/MFC

热点推荐