TmemoryStream ReadBuffer出错,该如何解决
TmemoryStream ReadBuffer出错
全局变量
m_sendbuf : m_sendBuf : Array[0..SENDBUF_SIZE-1] of Byte;
出错函数部分代码
ms : TmemoryStream;
while循环
……
Jpg := tjpegimage.Create;
Jpg.Assign(Bmp);
Jpg.CompressionQuality := 10;
Jpg.JPEGNeeded;
Jpg.Compress;
ms := TmemoryStream.Create;
Jpg.SaveToStream(ms);
ms.Position := 0;
m_JpegSize := ms.size;
ms.ReadBuffer(m_sendBuf, ms.size);//出错行
循环n次后到最后一行出错,注释掉则不会出现异常
请指教
------解决方案--------------------
m_sendBuf : Array[0..SENDBUF_SIZE-1] of Byte;
m_sendBuf : Byte;
不用数组试试
------解决方案--------------------
感觉有点问题的是,你在WHILE循环里一直CJpg := tjpegimage.Create;
==
调试一下,看到第几次WHILE出的错。
------解决方案--------------------
你的这个JPG有多大,也有可能是因为一次性读MS.SIZE导致的错误
看看说明
1、Read:此方法实现将数据从流中读出。函数原形为:
Function Read(var Buffer;Count:Longint):Longint;virtual;abstract;
参数Buffer为数据读出时放置的缓冲区,Count为需要读出的数据的字节数,该方法返回值为实际读出的字节数,它可以小于或等于Count中指定的值。
1、ReadBuffer:此方法的作用是从流中当前位置读取数据。函数原形为:
Procedure ReadBuffer(var Buffer;Count:Longint);
参数的定义跟上面的Read相同。注意:当读取的数据字节数与需要读取的字节数不相同时,将产生EReadError异常。
------解决方案--------------------
这样试试
ms.ReadBuffer(PChar(@m_sendBuf[0])^, ms.size);
------解决方案--------------------
ReadBuffe读取的长度必须与设置的长度相同,Read可以不同。
------解决方案--------------------
你可以采用动态数组的方式处理你的图像
m_sendBuf:array of Byte
m_JpegSize := ms.size;
setLength(m_sendBuf, m_JpegSize)
ms.ReadBuffer(m_sendBuf[0], ms.size);
//这句出错,取决于你的SendBuf函数的参数格式,
//如果 m_sendBuf 位置是var类型的,传入m_sendBuf[0]
//如果是Pointer类型的,传入@m_sendBuf[0]
//如果是无类型常量,好像是应该传入m_sendBuf[0]
sendBuf(m_FrameIndex, m_Mod, GraphSize, m_JpegSize, m_Count, @m_sendBuf[0], m_Addr);
全局变量
m_sendbuf : m_sendBuf : Array[0..SENDBUF_SIZE-1] of Byte;
出错函数部分代码
ms : TmemoryStream;
while循环
……
Jpg := tjpegimage.Create;
Jpg.Assign(Bmp);
Jpg.CompressionQuality := 10;
Jpg.JPEGNeeded;
Jpg.Compress;
ms := TmemoryStream.Create;
Jpg.SaveToStream(ms);
ms.Position := 0;
m_JpegSize := ms.size;
ms.ReadBuffer(m_sendBuf, ms.size);//出错行
循环n次后到最后一行出错,注释掉则不会出现异常
请指教
------解决方案--------------------
m_sendBuf : Array[0..SENDBUF_SIZE-1] of Byte;
m_sendBuf : Byte;
不用数组试试
------解决方案--------------------
感觉有点问题的是,你在WHILE循环里一直CJpg := tjpegimage.Create;
==
调试一下,看到第几次WHILE出的错。
------解决方案--------------------
你的这个JPG有多大,也有可能是因为一次性读MS.SIZE导致的错误
看看说明
1、Read:此方法实现将数据从流中读出。函数原形为:
Function Read(var Buffer;Count:Longint):Longint;virtual;abstract;
参数Buffer为数据读出时放置的缓冲区,Count为需要读出的数据的字节数,该方法返回值为实际读出的字节数,它可以小于或等于Count中指定的值。
1、ReadBuffer:此方法的作用是从流中当前位置读取数据。函数原形为:
Procedure ReadBuffer(var Buffer;Count:Longint);
参数的定义跟上面的Read相同。注意:当读取的数据字节数与需要读取的字节数不相同时,将产生EReadError异常。
------解决方案--------------------
这样试试
ms.ReadBuffer(PChar(@m_sendBuf[0])^, ms.size);
------解决方案--------------------
ReadBuffe读取的长度必须与设置的长度相同,Read可以不同。
------解决方案--------------------
你可以采用动态数组的方式处理你的图像
m_sendBuf:array of Byte
m_JpegSize := ms.size;
setLength(m_sendBuf, m_JpegSize)
ms.ReadBuffer(m_sendBuf[0], ms.size);
//这句出错,取决于你的SendBuf函数的参数格式,
//如果 m_sendBuf 位置是var类型的,传入m_sendBuf[0]
//如果是Pointer类型的,传入@m_sendBuf[0]
//如果是无类型常量,好像是应该传入m_sendBuf[0]
sendBuf(m_FrameIndex, m_Mod, GraphSize, m_JpegSize, m_Count, @m_sendBuf[0], m_Addr);