【com】Automation Object中為何我用如下方法不能傳遞多張圖片給客戶端! |
答題得分者是:RootKit
|
tomore_wanqing
一般會員 發表:1 回覆:3 積分:0 註冊:2008-06-24 發送簡訊給我 |
應工作需要現正在需要通過進程外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 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|
tomore_wanqing
一般會員 發表:1 回覆:3 積分:0 註冊:2008-06-24 發送簡訊給我 |
感謝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 發送簡訊給我 |
對於這個問題我有三中想法:
第一種是: 創建一個一唯的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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |