Binary File 或 Stream 如何利用參數傳入 COM Interface?? |
尚未結案
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
請教各位先進 : 先描述一下我的問題,我想將一個 Binary File 轉成 Stream 或是直接以變數(或 TByteDynArray) 的方式將參數傳入 COM Interface 中 Method 內的參數.. 請問有什麼適合 COM/COM 宣告的變數可以直接傳遞參數?? 或是有另外打包的方法?? 目前有一超爛解,使用 TClientDataSet ,利用 TBlobField 打包 ...
個人覺得實在是太不優雅了... ----
我只會兩件事,這也不會,那也不會 眼見不一定為真
----
|
speedup
資深會員 發表:19 回覆:259 積分:280 註冊:2003-07-04 發送簡訊給我 |
利用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 發送簡訊給我 |
引言: 利用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 為我詳細解說之前的許多問題.... ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----//將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
資深會員 發表:19 回覆:259 積分:280 註冊:2003-07-04 發送簡訊給我 |
引言: 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呼叫,即可閃掉此問題,並增加效率 混心雜欲 棄修身~唉
------
唉~ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |