急救!!!!!一个关于获得远程桌面的问题?(100)

tengfu5414 2006-02-15 03:18:56
代码如下;
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//首先在client端获得桌面信息并发送
//其中的header结构为自定义的数据头
srtuct header{
int itype; //用于判断类别;
int ilen; //数据长度;
}
//////////////////////////////////////////////////////////////////////
void CClientView::OnScreen()
{
// TODO: Add your command handler code here
//获得的桌面信息保存到btm和lpData中
CDC dc;
BITMAP btm;
char *lpData;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
CBitmap bm;
int Width=GetSystemMetrics(SM_CXSCREEN);
int Height=GetSystemMetrics(SM_CYSCREEN);
bm.CreateCompatibleBitmap(&dc,Width,Height);
CDC tdc;
tdc.CreateCompatibleDC(&dc);
CBitmap*pOld=tdc.SelectObject(&bm);
tdc.BitBlt(0,0,Width,Height,&dc,0,0,SRCCOPY);
tdc.SelectObject(pOld);

bm.GetBitmap(&btm);
int size=btm.bmWidthBytes*btm.bmHeight;

lpData=new char[size];
/////////////////////////////////////////////
BITMAPINFOHEADER bih;
bih.biBitCount=btm.bmBitsPixel;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=btm.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=btm.bmWidth;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;
///////////////////////////////////
GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
///////////////////////////////////////////////////////
//构造数据头,发送btm;
char *psendbuff=new char[sizeof(header)+sizeof(BITMAP)];
((header*)psendbuff)->itype=1;
((header*)psendbuff)->ilen=sizeof(header)+sizeof(BITMAP);

memcpy(psendbuff+sizeof(header),&btm,sizeof(BITMAP));
m_psocket.Send(psendbuff,sizeof(psendbuff),0);
delete []psendbuff;


////////////////////////////////////////////////////////////
//构造数据头,发送lpData;
char *psendbuff1=new char[sizeof(header)+size];
((header*)psendbuff1)->itype=2;
((header*)psendbuff1)->ilen=sizeof(header)+size;

int length=0;

memcpy(psendbuff1+sizeof(header),lpData,0);

do{
int length1=m_psocket.Send(psendbuff1,sizeof(psendbuff1),0);
length=length+length1;
}while(length<sizeof(psendbuff1));

delete[]psendbuff1;
delete[]lpData; //释放内存

}
//////////////////////////////////////////////////////////////////////////////
然后在server端接收;
void Cmsgsocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
MessageBox(NULL,"receive",NULL,NULL);
char *buf;
buf=new char[sizeof(header)];
Receive(buf,sizeof(buf),0);

if (((header*)buf)->itype==1) {

char *precvbuffer;
precvbuffer=new char[sizeof(BITMAP)];//[((header*)buf)->ilen-sizeof(header)];
Receive(precvbuffer,sizeof(precvbuffer),0);
// btm=(BITMAP*)precvbuffer;
BITMAP *temp=(BITMAP*)precvbuffer;
btm.bmBits=temp->bmBits;
btm.bmBitsPixel=temp->bmBitsPixel;
btm.bmHeight=temp->bmHeight;
btm.bmPlanes=temp->bmPlanes;
btm.bmType=temp->bmType;
btm.bmWidthBytes=temp->bmWidthBytes;
btm.bmWidth=temp->bmWidth;
delete []precvbuffer;
MessageBox(NULL,"getbtm",NULL,NULL);

}
else if (((header*)buf)->itype==2) {
// char *precvbuffer1;

size=btm.bmWidth*btm.bmHeight;
lpData=new char[size];//[((header*)buf)->ilen-sizeof(header)];
int length=0;
int length1;
char *pch=lpData;

do{
length1=Receive(pch,sizeof(lpData)-length,0);
length=length+length1;
pch+=length1;
}while(length<sizeof(lpData));

MessageBox(NULL,"getlpData",NULL,NULL);
}
else return;



CAsyncSocket::OnReceive(nErrorCode);
}

编译没错误,但不只怎么运行后老是提示:"内存不足"???

程序参考 http://www.vckbase.com/document/viewdoc/?id=1246 上的定时显示远程计算机的桌面程序,知识将他加上了数据头,并显示的是静态的远程桌面,不知道怎么就是不能成功!
...全文
127 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
tengfu5414 2006-02-18
  • 打赏
  • 举报
回复
1.数据发送时的长度出错了,sizeof(lpData);得到的并不是数据的实际长度,应写成sizeof(size);
2.接受大容量数据时的接受循环有问题,当有数据到达时每次都会触发OnReceive()函数,因此必须将接收btm和lpData的接收函数写成子函数调用!!!

tengfu5414 2006-02-16
  • 打赏
  • 举报
回复
请教一下:能否把工程上传啊?
蒋晟 2006-02-15
  • 打赏
  • 举报
回复
Why not create a dib section from memory map?

http://msdn.microsoft.com/library/en-us/gdi/bitmaps_233i.asp
billy145533 2006-02-15
  • 打赏
  • 举报
回复
内存分配是不是有问题

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧