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

Binary File 或 Stream 如何利用參數傳入 COM Interface??

尚未結案
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-01 00:15:12 IP:211.76.xxx.xxx 未訂閱
請教各位先進 : 先描述一下我的問題,我想將一個 Binary File 轉成 Stream 或是直接以變數(或 TByteDynArray) 的方式將參數傳入 COM Interface 中 Method 內的參數.. 請問有什麼適合 COM/COM 宣告的變數可以直接傳遞參數?? 或是有另外打包的方法?? 目前有一超爛解,使用 TClientDataSet ,利用 TBlobField 打包 ... 個人覺得實在是太不優雅了... ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-01 09:05:06 IP:210.241.xxx.xxx 未訂閱
利用Variant型態
//將Stream資料轉入variant
procedure StreamToVariant(Source:TStream;var Destination:Variant);
var  p:^ByteArray;
begin
 Destination:=VarArrayCreate([0,Source.size-1],VarByte);
 P:=VarArrayLock(Destination);
 Source.Seek(0,soBeginning);
 Source.ReadBuffer(p^,Source.size);
 VarArrayUnLock(Destination);
end;    //將Variant資料轉入Stream
procedure VariantToStream(Source:Variant;var Destination:TStream);
var  p:^ByteArray;
     pos :Int64;
begin
 P:=VarArrayLock(Source);
 pos := Destination.Seek(0,soBeginning);
 Destination.WriteBuffer(p^,VarArrayHighBound(Source,1) 1);
 Destination.Seek(pos,soBeginning);
 VarArrayUnLock(Source);
end;
...
var
 s:TStream;
 v:Variant;
 aComInft : IXXXX;
begin
 aComInft := CoXXX.Create;
 s := TFileStream.Create('Filename1.xxx');
 try
  StreamToVariant(s,v);
  aComInft.SomeMethod(v); 
 finally
  s.Free;
  aComInft := nil;
 end;    end;    
要注意的是,若你設計的COM支援Dual Interface,妳如果用LateBinding呼叫物件方法時,若該方法含Variant參數,建議轉型成IDispPatch介面呼叫,如此可避免某些狀況Delphi誤傳Variant參數 混心雜欲 棄修身~唉
------
唉~
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-02 18:19:50 IP:203.66.xxx.xxx 未訂閱
引言: 利用Variant型態
//將Stream資料轉入variant
procedure StreamToVariant(Source:TStream;var Destination:Variant);
var  p:^TByteArray;
begin
 Destination:=VarArrayCreate([0,Source.size-1],VarByte);
 P:=VarArrayLock(Destination);
 Source.Seek(0,soBeginning);
 Source.ReadBuffer(p^,Source.size);
 VarArrayUnLock(Destination);
end;    //將Variant資料轉入Stream
procedure VariantToStream(var Source:Variant;Destination:TStream);
var  p:^TByteArray;
     pos :Int64;
begin
 P:=VarArrayLock(Source);
 pos := Destination.Seek(0,soBeginning);
 Destination.WriteBuffer(p^,VarArrayHighBound(Source,1) 1);
 Destination.Seek(pos,soBeginning);
 VarArrayUnLock(Source);
end;
...
var
 s:TStream;
 v:Variant;
 aComInft : IXXXX;
begin
 aComInft := CoXXX.Create;
 s := TFileStream.Create('Filename1.xxx');
 try
  StreamToVariant(s,v);
  aComInft.SomeMethod(v); 
 finally
  s.Free;
  aComInft := nil;
 end;    end;    
要注意的是,若你設計的COM支援Dual Interface,妳如果用LateBinding呼叫物件方法時,若該方法含Variant參數,建議轉型成IDispPatch介面呼叫,如此可避免某些狀況Delphi誤傳Variant參數 混心雜欲 棄修身~唉
Speedup Sir: 紅色的地方應該是您筆誤,Fix 後 Code 執行正確無誤,有幾個問題想請教 Sir,就是 : 1. TByteArray 的原型宣告為 : TByteArray = array[0..32767] of Byte; 我上傳一個 Binary File 超過 80 K ,我覺得應該會出現存取超出陣列範圍的錯誤,但 Run 的結果卻沒有,是否我觀念有誤? 2. Dual Interface 是指一個 COM Object 上宣告兩個 interface 嗎?? 可否舉例說明一下 LateBinding 手法?? 3. 有哪些狀況 Delphi 可能會誤傳Variant參數 抱歉,我是寫 COM 的新手,很多很問題待釐清,感謝 Speedup Sir 為我詳細解說之前的許多問題.... ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-02 19:05:50 IP:210.243.xxx.xxx 未訂閱
引言: 1. TByteArray 的原型宣告為 : TByteArray = array[0..32767] of Byte; 我上傳一個 Binary File 超過 80 K ,我覺得應該會出現存取超出陣列範圍的錯誤,但 Run 的結果卻沒有,是否我觀念有誤? 2. Dual Interface 是指一個 COM Object 上宣告兩個 interface 嗎?? 可否舉例說明一下 LateBinding 手法?? 3. 有哪些狀況 Delphi 可能會誤傳Variant參數
1.不會,因為VarArrayLock(V) 傳回的指標是Variant變數所配置記憶體的指標,而不是array[0..32767] of Byte 2.Dual Interface 是指該COM物件同時支援vTable(就是你設計的Interface啦)和IDisptach(用來作LateBinding) 簡單的說,當我們在程式中要呼叫Dll,COM的方法時,基本上一定要有該方法的宣告(就是Interface啦),Compiler才能決定要如何傳遞參數(再這種機制下你一定要取得該COM物件的TypeLibrary才能用它),但COM若有提供IDispatch介面,則可在執行期才決定要如何傳遞參數(這就是所謂的lateBinding,這種呼叫方式不需事先uses XXX_TLB) 3.不知,在需要late_binding環境下(例如用SocketConnection),反正所有LateBinding全部轉型IDisp_xxx呼叫,即可閃掉此問題,並增加效率 混心雜欲 棄修身~唉
------
唉~
系統時間:2024-05-05 2:54:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!