全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2114
推到 Plurk!
推到 Facebook!

【com】Automation Object中為何我用如下方法不能傳遞多張圖片給客戶端!

答題得分者是:RootKit
tomore_wanqing
一般會員


發表:1
回覆:3
積分:0
註冊:2008-06-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-06-24 10:47:22 IP:202.108.xxx.xxx 訂閱
應工作需要現正在需要通過進程外COM異常性傳遞多張圖片給客戶端!

如下為COM部分的代碼:
function TMyShowUtils.GetPicTest(out ov: OleVariant;
out bs: WideString): WordBool;
var S:String;
Strm:TMemoryStream;
Stream: TMemoryStream;
i:Integer;
begin
ov:=VarArrayCreate([0, 4], varOleStr);
for i:=0 to 4 do
begin
Strm:=TMemoryStream.Create;
case i of
0:begin
Strm.LoadFromFile('c:\W___3055ZHBETOSJ.jpg');
end;
1:begin
Strm.LoadFromFile('c:\W___3023ZHXJTOSJ.jpg');
end;
2:begin
Strm.LoadFromFile('c:\W___3491ZHSGTOSJ.jpg');
end;
3:begin
Strm.LoadFromFile('c:\W___3410ZHMGTOSJ.jpg');
end;
4:begin
Strm.LoadFromFile('c:\W___3379ZHLDTOSJ.jpg');
end;
end;
S := '';
SetLength(S,Strm.Size);
Strm.Read(S[1],Strm.Size);
//Strm.SaveToFile('c:\' '6' inttostr(i) 'jpg');
Stream := TMemoryStream.Create;
Stream.Write(S[1],Length(S));
Stream.Position :=0;
Stream.SaveToFile('c:\' '6' inttostr(i) '.jpg');
FreeAndNil(Stream);
ov[i] := s;
Strm.Free;
end;
end;

如下為客戶端的代碼:
procedure TForm1.Button3Click(Sender: TObject);
var MyShowUtils:IMyShowUtils;
MyShowUtilsEvents:IUMyShowUtilsEvents;
ov:OleVariant;
s:wideString;
i:Integer;
ss:String;
b:TBitmap;
Stream: TMemoryStream;
begin
MyShowUtils := TMyShowUtils.create;
MyShowUtils.GetPicTest(ov,s);
for i:=VarArrayLowBound(ov,1) to VarArrayHighBound(ov,1) do
begin
ss:=VarToStr(ov[i]);
Stream := TMemoryStream.Create;
Stream.Write(ss[1],Length(ss));
Stream.Position := 0;
Stream.SaveToFile('c:\' inttostr(i) '.jpg');
b:=TBitmap.Create;
//b.LoadFromStream(Stream);
//if i=0 then
//Image6.Picture.Assign(b);
b.Free;
Stream.Free;
end;
end;
程序執行是不會出錯的,但是轉換出來的文件大小就不對!很是鬱悶!^_^!
還請高人指點一二!^_^!!!
RootKit
資深會員


發表:16
回覆:357
積分:419
註冊:2008-01-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-06-24 14:59:45 IP:61.222.xxx.xxx 訂閱
參考這一篇
http://delphi.ktop.com.tw/board.php?cid=30&fid=68&tid=58044

tomore_wanqing
一般會員


發表:1
回覆:3
積分:0
註冊:2008-06-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-06-24 16:22:04 IP:202.108.xxx.xxx 訂閱
感謝RootKit
http://delphi.ktop.com.tw/board.php?cid=30&fid=68&tid=58044

這篇貼我已看過,而且還幫我解決啦單張圖片在com裏面傳遞的問題,
而且我現在想使用BSTR來進行一組(多張)圖片的傳輸也是源自此貼,可就是用BSTR來傳遞的時候好像數據會出現不對的情況,估計是字符問題?
chih_kuan的這種方法傳遞單張圖片是可以的
但是我將他們賦值給一個varint數組,類型是varolestr就不行啦!^_^!!!


这种情况下,我通常喜欢用 BSTR。

不管是图片,还是其它BLOB的DATA,比如一个FILE,都是一串BINARY的数据。都可以放进字符串里,也就是BSTR里。

比如,可以这样写:


var
S:String;
Mem:TMemoryStream;
Pic:TPicture;
procedure
Mem:=TMemoryStream.Create;
try
Pic.SaveToStream(Mem);
SetLength(S,Mem.Size);
Mem.Read(S[1],Mem.Size);
finally
end;
end;

当然,最后把这个S作为接口函数的结果传给客户端。客户端反过来恢复就行了。


 




tomore_wanqing
一般會員


發表:1
回覆:3
積分:0
註冊:2008-06-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-06-24 16:48:10 IP:202.108.xxx.xxx 訂閱
對於這個問題我有三中想法:
第一種是:
創建一個一唯的varOleStr數組
ov:=VarArrayCreate([0, *], varOleStr);
通過流將數據存放在字符串中
將字符串賦值給數組中的每個元素。
第二種是:
創建一個以為的varvriant數組
ov:=VarArrayCreate([0, *], varVariant);
對於每個OV元素創建varByte類型
ov[i] := VarArrayCreate([0, Strm.Size - 1], varByte);
Data := VarArrayLock(ov[i]);
try
Strm.Position := 0;
Strm.ReadBuffer(Data^, Strm.Size);
finally
VarArrayUnlock(ov[i]);
end;
這樣好像沒什麼問題,但是ov被lock之後就是解鎖都不行,delphi會提示ov已經被locked啦!^_^!真是鬱悶哦!!!
第三種方按:
使用IpictureDisp屬性
function Get_PicTest: IPictureDisp; safecall;
procedure Set_PicTest(const Value: IPictureDisp); safecall;
但是這是可以傳單張圖片,要是是多張的話,請問怎麼建立索引屬性呢?
Com原理允許嗎? Delphi可以支持嗎?

tomore_wanqing
一般會員


發表:1
回覆:3
積分:0
註冊:2008-06-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-06-27 16:28:31 IP:202.108.xxx.xxx 訂閱
對於這個問題我發現一個很好的解決方案就是使用TclientDataSet

創建一個表,裏面就是一個ftblob字段,把圖像存到表裏面,在吧

tclientDataSet.Data存放到olevarint裏面去,客戶端就能得到很多多圖片啦!

但是它是需要DBClient.dll支持的!

請問給位還能有更好的安裝嗎?

系統時間:2017-10-20 17:11:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!