呵呵,比较陌生的问题!(流,TMemoryStream) 好象用DLL不能把TMemoryStream做参数因为它是一个Class吧可能跟数据访问有关 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在传入DLL前可能改用array of char来存放数据较好,这样传递一个指针就可以了.TMemoryStream的Read和ReadBuffer函数可以很容易做到这点在DLL里尽量用通用的数据类型较好. DLL中也可以使用任何流,传递没有错误,只是你要看看参数有没有用错. 我在主程序里这样写的:procedure TForm1.CMUDPDataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer);var MessageId:byte; MyStream :TMemoryStream;begin CMUDP.ReadStream(MyStream); UDPDataReceived(MyStream); //这个函数就是TDll.dll里面的函数,参数定义肯定没错 //它所做的就是 MyStream.Seek(1,SoFromBeginning); // MyStream.Read(Id,1); //id是这个流里面的参数。我如果放在一起不用DLL的话就是 //对的。调试的时候指向我的语句 //MyStream.Seek(1,SoFromBeginning);有错误。大家觉得 //是什么原因?我通过了一个ImportDll的.pas文件做为接口 //文件。不明白是哪里错了!end; 你好象没有Create吧?MyStream:=TMemoryStrem.Create;试一试 我将MyStream设为全局变量,已经在FormCreate的时候Create了:) 在DLL传类对象,不太会,你不如把MyStream.Memory作为Pointer传给DLL,然后再传回来一试。 流绝对是可以做参数传递的我就 做过//***************************************************************************//流压缩函数//***************************************************************************procedure CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel);var SourceStream: TCompressionStream; DestStream: TMemoryStream; Count: Integer;Begin //获得图像流的原始尺寸 Count := CompressedStream.Size; DestStream := TMemoryStream.Create; SourceStream:=TCompressionStream.Create(CompressionLevel, DestStream); Try//SourceStream是原始的图像流 CompressedStream.SaveToStream(SourceStream);//将原始图像流进行压缩,DestStream中是压缩后的图像流 SourceStream.Free; CompressedStream.Clear;//写入原始图像的大小 CompressedStream.WriteBuffer(Count, SizeOf(Count));//写入经过压缩的图像流 CompressedStream.CopyFrom(DestStream, 0); finally DestStream.Free; end;end;/////////用流做参数来调用函数///////////// jpg.SaveToStream(BmpStream); CompressBitmap(BmpStream, clMax); //按照最大压缩比进行压缩 是在DLL调用中传递中,一般在DLL传递的是Pointer, Number, Record,其它的一般尽可能的用它们来代替。 delphi中如何把dbgrid中的记录打印出来? 我写的游戏外挂“热血江湖伴侣”1.71发布,散分。 cxLookupComboBox选中的时候,如何和那个数据源的记录定位保持一致呢?或者如何取key DxFlowChart控件打印问题! 在BDE中如何創建和使用臨時表?--連接MS SQL server 关于数据表修改反映到界面的问题? 如何动态添加 TADOQuery 的字段? Create一个VCL对象时,会不会出现异常? delphi ShellExecute()同时打开多个网页怎么实现 大家晚上好!一个关于sql的问题。 在Delphi中如何调用.dll文件 sdk函数的引用
procedure TForm1.CMUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
MessageId:byte;
MyStream :TMemoryStream;
begin
CMUDP.ReadStream(MyStream);
UDPDataReceived(MyStream); //这个函数就是TDll.dll里面的函数,参数定义肯定没错
//它所做的就是 MyStream.Seek(1,SoFromBeginning);
// MyStream.Read(Id,1);
//id是这个流里面的参数。我如果放在一起不用DLL的话就是
//对的。调试的时候指向我的语句
//MyStream.Seek(1,SoFromBeginning);有错误。大家觉得
//是什么原因?我通过了一个ImportDll的.pas文件做为接口
//文件。不明白是哪里错了!end;
MyStream:=TMemoryStrem.Create;
试一试
:)
我就 做过//***************************************************************************
//流压缩函数
//***************************************************************************
procedure CompressBitmap(var CompressedStream: TMemoryStream;const
CompressionLevel: TCompressionLevel);
var
SourceStream: TCompressionStream;
DestStream: TMemoryStream;
Count: Integer;
Begin
//获得图像流的原始尺寸
Count := CompressedStream.Size;
DestStream := TMemoryStream.Create;
SourceStream:=TCompressionStream.Create(CompressionLevel, DestStream);
Try
//SourceStream是原始的图像流
CompressedStream.SaveToStream(SourceStream);
//将原始图像流进行压缩,DestStream中是压缩后的图像流
SourceStream.Free;
CompressedStream.Clear;
//写入原始图像的大小
CompressedStream.WriteBuffer(Count, SizeOf(Count));
//写入经过压缩的图像流
CompressedStream.CopyFrom(DestStream, 0);
finally
DestStream.Free;
end;
end;
/////////用流做参数来调用函数/////////////
jpg.SaveToStream(BmpStream);
CompressBitmap(BmpStream, clMax); //按照最大压缩比进行压缩