不明白为什么会出现access violation 40288xxxx in module 'VCL50.BPL'
以下是服务器端的代码,总是在执行到 “Socket->SendText(IntToStr(bmpStream->Size));这句就会出现我题目所说的错误信息,请问是什么原因”
void __fastcall TForm1::ServerSocket1Accept(TObject *Sender,
TCustomWinSocket *Socket)
{
Label1->Caption="已经成功和客户端连接";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString recText="";
recText=Socket->ReceiveText();
Net_Snap_Screen(0,0,Screen->Width,Screen->Height);
Label6->Caption=recText;
if(recText=="getImage")
{
Label2->Caption="收到要求截图的命令";
bmpStream=0;
Socket->SendText(IntToStr(bmpStream->Size));
}
if(recText=="ok")
{
Label3->Caption="开始发送图片文件流";
bmpStream->Position=0;
Socket->SendStream(bmpStream);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
ServerSocket1->Active=true;
bmpStream=new TMemoryStream;
}
问题点数:20、回复次数:9Top
1 楼cardinalh(天空下的船)回复于 2003-02-03 16:14:24 得分 0
一般说来这种错误都是内存溢出错误,你可以检查一下你在发送的时候相关指针是否都有指向Top
2 楼huang_2(叽叽喳喳)回复于 2003-02-03 16:22:30 得分 0
我全部代码就是这样,好像没有错
//---------------------------------------------------------------------------
#include "jpeg.hpp"
#include <vcl.h>
#pragma hdrstop
#include "main_server.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
void __fastcall TForm1::Net_Snap_Screen(int leftPos,int topPos,int
rightPos,int bottomPos)
{
int rectWidth,rectHeight;
HDC sourceDC,destDC,bHandle;
Graphics::TBitmap *bitMap=new Graphics::TBitmap();
rectWidth=rightPos-leftPos;
rectHeight=bottomPos-topPos;
/*以屏幕坐标位置读取源设备*/
sourceDC=CreateDC("DISPLAY",NULL,NULL,NULL);
destDC=CreateCompatibleDC(sourceDC);
bHandle=CreateCompatibleBitmap(sourceDC,rectWidth,rectHeight);
SelectObject(destDC,bHandle);
BitBlt(destDC,0,0,rectWidth,rectHeight,sourceDC,leftPos,topPos,SRCCOPY);
bitMap->Handle=bHandle;
bmpStream->Clear();
bitMap->SaveToStream(bmpStream);
/* 释放资源 */
delete bitMap;
DeleteDC(destDC);
ReleaseDC(bHandle,sourceDC);
/*保存截取的屏幕*/
bmpStream->SaveToFile("temp.bmp");
/* 将bmp转换成.jpg文件 */
Graphics::TBitmap *bitMap1=new Graphics::TBitmap(); //bitMap1是为了读取刚才储存的bmp文件
bitMap1->LoadFromFile("temp.bmp");
Graphics::TBitmap *tmpBitmap=new Graphics::TBitmap();
tmpBitmap->Width=bitMap1->Width;
tmpBitmap->Height=bitMap1->Height;
tmpBitmap->Canvas->StretchDraw(TRect(0,0,tmpBitmap->Width,tmpBitmap->Height),bitMap1);
TJPEGImage *jpeg=new TJPEGImage();
jpeg->PixelFormat=jf8Bit;
jpeg->CompressionQuality=75;
jpeg->Assign((TPersistent *)tmpBitmap);
jpeg->Compress();
/* 把jpg格式的图像储存在内存流中 */
bmpStream->Clear();
jpeg->SaveToStream(bmpStream);
jpeg->SaveToFile("temp.jpg");
/******** 释放资源 ***********/
delete jpeg;
delete bitMap1;
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1Accept(TObject *Sender,
TCustomWinSocket *Socket)
{
Label1->Caption="已经成功和客户端连接";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString recText="";
recText=Socket->ReceiveText();
Net_Snap_Screen(0,0,Screen->Width,Screen->Height);
Label6->Caption=recText;
if(recText=="getImage")
{
Label2->Caption="收到要求截图的命令";
bmpStream=0;
Socket->SendText(IntToStr(bmpStream->Size));
}
if(recText=="ok")
{
Label3->Caption="开始发送图片文件流";
bmpStream->Position=0;
Socket->SendStream(bmpStream);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
ServerSocket1->Active=true;
bmpStream=new TMemoryStream;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
Top
3 楼huang_2(叽叽喳喳)回复于 2003-02-03 16:23:33 得分 0
还有头文件:
//---------------------------------------------------------------------------
#ifndef main_serverH
#define main_serverH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ScktComp.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TLabel *Label1;
TServerSocket *ServerSocket1;
TLabel *Label2;
TLabel *Label3;
TLabel *Label4;
TLabel *Label5;
TLabel *Label6;
TButton *Button1;
void __fastcall ServerSocket1Accept(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall FormCreate(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
/********** 自定义变量 **************/
int photoSize;
TMemoryStream *bmpStream;
/************************************/
/******************************* 自定义函数 ****************************/
void __fastcall Net_Snap_Screen(int leftPos,int topPos,int rightPos,int bottomPos);
/************************************************************************/
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Top
4 楼huang_2(叽叽喳喳)回复于 2003-02-03 16:42:51 得分 0
看不出哪里错了Top
5 楼matq2008(叶子.net)回复于 2003-02-03 20:40:08 得分 0
Socket->SendText(IntToStr(bmpStream->Size));
---->这一句是服务器端的发送吗?给谁发?Top
6 楼huang_2(叽叽喳喳)回复于 2003-02-03 21:11:08 得分 0
没错,是服务器端发的,我曾经试过改为:
ServerSocket1->socket->connections[0]->SendText...............
的形式,但还是出现我所说的错误,我之所以说是这行出错,是因为我使用断点测试的时候每当运行到这行代码,就会报错,真不知道是什么原因
Top
7 楼ffww(疯子)回复于 2003-02-03 22:37:42 得分 0
该不会是一个抓对方机器屏幕的程序吧?
呵呵。。。。
我这里有,Top
8 楼jishiping(JSP 季世平)回复于 2003-02-07 19:58:29 得分 20
---------------------------
if(recText=="getImage")
{
Label2->Caption="收到要求截图的命令";
bmpStream=0; //这儿你已经将bmpStream设为0了
Socket->SendText(IntToStr(bmpStream->Size));
}
---------------------------
你已经将 bmpStream 设为0了,再访问 bmpStream->Size 不出错才怪呢。
你这儿应该是bmpStream->Position=0;吧,而不是bmpStream=0;Top
9 楼gaoshan9821(三儿)回复于 2003-02-09 14:46:12 得分 0
不行的话,把窗体重新换一下,效果会很好的Top




