

/**/
/////////////////////////////////////////////////////////////////////////

////////////////////Web Service

unit Unit3;


interface

uses InvokeRegistry,Graphics,Classes,Unit2,Types;


type

TQueryCapital
=
class
(TInvokableClass, IQueryCapital)

public

function GetPic:TByteDynArray; stdcall;

function GetPicSize:LongInt; stdcall;

end;


implementation


function ByteArrayFromStream( inStream : TMemoryStream ) : TByteDynArray;

var pTemp : pointer;

begin

SetLength(Result, inStream.Size );

pTemp :
=
@Result[
0
];

inStream.Position :
=
0
;

inStream.Read(pTemp
^
, inStream.Size);

end;


//
TByteDynArray 做返回值 是重点

function TQueryCapital.GetPic:TByteDynArray;

var

tfs : TMemorystream;

outByAr : TByteDynArray;

begin

tfs:
=
TMemorystream.Create;

tfs.LoadFromFile(
'
1.jpg
'
);

tfs.Position :
=
0
;


Result :
=
ByteArrayFromStream(tfs);

end;


function TQueryCapital.GetPicSize: LongInt;

var

Pic : TPicture;

tfs : TMemorystream;

ss :
string
;

begin

ss :
=
''
;

tfs:
=
TMemorystream.Create;

tfs.LoadFromFile(
'
1.jpg
'
);

tfs.Position :
=
0
;


SetLength(ss, tfs.Size);

tfs.Read(ss[
1
], tfs.Size);

Result :
=
Length(ss);

end;


initialization


InvRegistry.RegisterInvokableClass(TQueryCapital
...
{, ShakespeareFactory}
);

end.



/**/
/////////////////////////////////////////////////////////////////////////////

//////////Client

unit Unit1;


interface


uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs,iquerycapital1,Types, ExtCtrls, StdCtrls, Rio, SOAPHTTPClient,jpeg;


type

TForm1
=
class
(TForm)

HTTPRIO1: THTTPRIO;

Button1: TButton;

Image1: timage;

procedure Button1Click(Sender: TObject);

private

procedure ByteArrayCompressedToImage(
const
ByteArray :

TByteDynArray);


...
{ Private declarations }

public


...
{ Public declarations }

end;


var

Form1: TForm1;


implementation



...
{$R *.dfm}



procedure copyToStream(
const
InArray : TByteDynArray ; outStream : TStream );

var pTemp : Pointer;

begin

pTemp :
=
@InArray[
0
];

outStream.Write( pTemp
^
, Length(InArray));

end;



procedure TForm1.ByteArrayCompressedToImage(
const
ByteArray : TByteDynArray);

var MStream : TMemoryStream;


Jpg : TJpegImage;

begin

MStream :
=
TMemoryStream.Create;

copyToStream( ByteArray, MStream );

MStream.Position :
=
0
;

Jpg :
=
TJpegImage.Create;

try

Image1.Picture.Graphic:
=
Jpg;
//
设置图片框的格式

Image1.Picture.Graphic.LoadFromStream(MStream);
//
将地址下的文件通过内存流写入图片框中

Image1.Repaint;



finally

MStream.Free;


end;

end;


procedure TForm1.Button1Click(Sender: TObject);

var

ByteArray : TByteDynArray;

begin

ByteArray :
=
(HTTPRIO1
as
IQueryCapital).GetPic;

ByteArrayCompressedToImage(ByteArray);

end;


end.


/**/
/////////////////////////////////////////////////////////////////////////////////////////////////////

//
为一个朋友面试做的小程序程序:

//
通过WebServices 访问服务器上的一张图片

//
开始的时候通过 服务器上加载 图片文件,然后通过WebService 直接传TPicture 对象到Client。发现这条路不行;

//
后来想到用 WebService传String到Client; 图片文件转成String成功。Client段接收WebService传过来的String,数据出现丢失 

//
用 TByteDynArray 传图片文件成功!!!!!!!!








版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。