为什么我从 datasnap ISAPI dll 中的 TBitmap.LoadFromStream 方法得到访问冲突错误?
Why I get access violation error from TBitmap.LoadFromStream method in datasnap ISAPI dll?
我在 RAD Studio 10.3.2 中开发了一个 datasnap rest 服务器应用程序。在我的一种服务器方法中,我从客户端应用程序接收图像。图像数据是作为 json 值的 base64 编码字符串。我的方法是这样的:
function TServerMethods1.getImage(JSONobj: TJSONObject): Boolean;
var
OutputStream : TMemoryStream;
InputStream : TStringStream;
theImage : TBitmap;
begin
var imageStr : string := JSONobj.GetValue('Image').Value;
InputStream := TStringStream.Create(imageStr);
//InputStream.saveToFile('C:\InputStream.txt');
OutputStream := TMemoryStream.Create;
theImage := TBitmap.Create;
try
InputStream.Position := 0;
TNetEncoding.Base64.Decode(InputStream, OutputStream);
//OutputStream.saveToFile('C:\OutputStream.txt');
OutputStream.Position := 0;
theImage.LoadFromStream(OutputStream); // in this line I get an access violation error!
finally
theStringStream.Free;
theMemoryStream.Free;
end;
.
.
.
end;
当我将项目构建为独立的 firemonkey 应用程序(.exe 文件)时,一切正常,但是当我构建 ISAPI dll 并将其部署在 IIS 中时,我在添加注释的行中遇到访问冲突错误它。怎么了?我真的很困惑!
P.S.
我把 InputStream
和 OutputStream
都保存在某个地方,这样我就可以确定我收到了流并正确解码,两个流都很好。
变量theImage: TBitmap;
是FMX.Graphics.TBitmap
class的对象,因为我的单机GUI是firemonkey应用
好像fmx的TBitmap
class ISAPI dll有问题。因此,我没有使用 FMX.Graphics
,而是使用了 vcl 的 TJPEGImage
class。为了实现这一点,我将 Vcl.Imaging.jpeg
添加到 ServerMethodsUnit 的 uses
部分。然后我把我以前的功能改成这样:
function TServerMethods1.getImage(JSONobj: TJSONObject): Boolean;
var
OutputStream : TMemoryStream;
InputStream : TStringStream;
theImage : TJPEGImage; // using TJPEGImage instead of FMX.Graphics.TBitmap
begin
var imageStr : string := JSONobj.GetValue('Image').Value;
InputStream := TStringStream.Create(imageStr);
OutputStream := TMemoryStream.Create;
theImage := TJPEGImage.Create;
try
InputStream.Position := 0;
TNetEncoding.Base64.Decode(InputStream, OutputStream);
OutputStream.Position := 0;
theImage.LoadFromStream(OutputStream); // Now this line works fine!
finally
theStringStream.Free;
theMemoryStream.Free;
end;
.
.
.
end;
现在我可以从内存流中加载接收到的图像并将其保存为 jpeg 图像文件。
我在 RAD Studio 10.3.2 中开发了一个 datasnap rest 服务器应用程序。在我的一种服务器方法中,我从客户端应用程序接收图像。图像数据是作为 json 值的 base64 编码字符串。我的方法是这样的:
function TServerMethods1.getImage(JSONobj: TJSONObject): Boolean;
var
OutputStream : TMemoryStream;
InputStream : TStringStream;
theImage : TBitmap;
begin
var imageStr : string := JSONobj.GetValue('Image').Value;
InputStream := TStringStream.Create(imageStr);
//InputStream.saveToFile('C:\InputStream.txt');
OutputStream := TMemoryStream.Create;
theImage := TBitmap.Create;
try
InputStream.Position := 0;
TNetEncoding.Base64.Decode(InputStream, OutputStream);
//OutputStream.saveToFile('C:\OutputStream.txt');
OutputStream.Position := 0;
theImage.LoadFromStream(OutputStream); // in this line I get an access violation error!
finally
theStringStream.Free;
theMemoryStream.Free;
end;
.
.
.
end;
当我将项目构建为独立的 firemonkey 应用程序(.exe 文件)时,一切正常,但是当我构建 ISAPI dll 并将其部署在 IIS 中时,我在添加注释的行中遇到访问冲突错误它。怎么了?我真的很困惑!
P.S.
我把
InputStream
和OutputStream
都保存在某个地方,这样我就可以确定我收到了流并正确解码,两个流都很好。变量
theImage: TBitmap;
是FMX.Graphics.TBitmap
class的对象,因为我的单机GUI是firemonkey应用
好像fmx的TBitmap
class ISAPI dll有问题。因此,我没有使用 FMX.Graphics
,而是使用了 vcl 的 TJPEGImage
class。为了实现这一点,我将 Vcl.Imaging.jpeg
添加到 ServerMethodsUnit 的 uses
部分。然后我把我以前的功能改成这样:
function TServerMethods1.getImage(JSONobj: TJSONObject): Boolean;
var
OutputStream : TMemoryStream;
InputStream : TStringStream;
theImage : TJPEGImage; // using TJPEGImage instead of FMX.Graphics.TBitmap
begin
var imageStr : string := JSONobj.GetValue('Image').Value;
InputStream := TStringStream.Create(imageStr);
OutputStream := TMemoryStream.Create;
theImage := TJPEGImage.Create;
try
InputStream.Position := 0;
TNetEncoding.Base64.Decode(InputStream, OutputStream);
OutputStream.Position := 0;
theImage.LoadFromStream(OutputStream); // Now this line works fine!
finally
theStringStream.Free;
theMemoryStream.Free;
end;
.
.
.
end;
现在我可以从内存流中加载接收到的图像并将其保存为 jpeg 图像文件。