線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1893
推到 Plurk!
推到 Facebook!

TypeLibrary中的Read/Write By Ref 為何用途

答題得分者是:mustapha.wang
suda
一般會員


發表:17
回覆:63
積分:16
註冊:2002-05-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-23 22:30:31 IP:218.170.xxx.xxx 未訂閱
請問大家,TypeLibrary中的Read/Write By Ref 為何用途 是否與 Delphi中的var方式相同,而在遠端如dcom/Socket中可否使用?
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-24 12:31:53 IP:218.1.xxx.xxx 未訂閱
引言: 請問大家,TypeLibrary中的Read/Write By Ref 為何用途 是否與 Delphi中的var方式相同,而在遠端如dcom/Socket中可否使用?
是的,write by ref是以var参数传递,如:
  ITest = interface(IAppServer)
    ['{59B4041B-42CE-49DA-96DF-619861F02E2B}']
    function Get_Property1: Integer; safecall;
    procedure Set_Property1(Value: Integer); safecall;
    function Get_Property2: Integer; safecall;
    procedure Set_Property2(Value: Integer); safecall;
    procedure _Set_Property2(var Value: Integer); safecall;
    property Property1: Integer read Get_Property1 write Set_Property1;
    property Property2: Integer read Get_Property2 write Set_Property2;
  end;
注意Property2,它的write方法为Set_Property2,而不是_Set_Property2,因此如果要传回值,不要写AppServer.Property2:=xxx;而应该用AppServer._Set_Proeprty2(xxx); 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
suda
一般會員


發表:17
回覆:63
積分:16
註冊:2002-05-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-24 17:02:37 IP:61.221.xxx.xxx 未訂閱
感謝你再次解惑! 那在param 中使用 variant* 或 variant** 與by ref 有何不同 還只是寫法的不同? 我想如果透過SocketServer 或 DCOM.createRemote 使用by ref, 把遠端的資料位址對應過來本機可行嗎?還是我的想法太天真
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-24 17:37:35 IP:218.1.xxx.xxx 未訂閱
引言: 感謝你再次解惑! 那在param 中使用 variant* 或 variant** 與by ref 有何不同 還只是寫法的不同? 我想如果透過SocketServer 或 DCOM.createRemote 使用by ref, 把遠端的資料位址對應過來本機可行嗎?還是我的想法太天真
write by ref是定义property时使用的,与variant *都在delphi映射为var,都是可以传回值的,当然Socket/DCOM可以用它传回资料,不是天真想法。 variant**映射为POLEVariant;企图传递一个指针,不支持,编译不过。 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
suda
一般會員


發表:17
回覆:63
積分:16
註冊:2002-05-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-24 22:35:20 IP:218.170.xxx.xxx 未訂閱
write by ref是定义property时使用的,与variant *都在delphi映射为var,都是可以传回值的,当然Socket/DCOM可以用它传回资料,不是天真想法。 variant**映射为POLEVariant;企图传递一个指针,不支持,编译不过。 那麼 ** 只是用來傳遞Interface的指標對吧! 而 使用 *或by ref 是相同的作用結果只是使用方式不同 以 by ref 的方式read/write遠端的property ,dcom 會將遠端的指標 對應到本地端的指標,以減少資料的傳遞,所以在傳遞大的資料時會增加效率 這樣的結論對嗎? 而以Socket的方式也可以嗎?我想Dcom是用RPC的方式所以沒問題吧! 我有作過一個測試用DCOM及Socket的方式呼叫IAppserver的一個Interface A ,再由Interface A傳回Intercace B,是個無聊的測試,結果DCom可 ,而Socket不可故推測以socket不可操作遠端的指標 另請教TypeLibrary中的節點是否可以移動順利,我有試過直接搬[TEXT]的文字資料,不過會產生錯誤,不知你是否有方法 謝謝!! 發表人 - suda 於 2003/12/24 22:56:59
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-25 10:10:14 IP:218.1.xxx.xxx 未訂閱
引言: 那麼 ** 只是用來傳遞Interface的指標對吧! 而 使用 *或by ref 是相同的作用結果只是使用方式不同 以 by ref 的方式read/write遠端的property ,dcom 會將遠端的指標 對應到本地端的指標,以減少資料的傳遞,所以在傳遞大的資料時會增加效率 這樣的結論對嗎? 而以Socket的方式也可以嗎?我想Dcom是用RPC的方式所以沒問題吧! 我有作過一個測試用DCOM及Socket的方式呼叫IAppserver的一個Interface A ,再由Interface A傳回Intercace B,是個無聊的測試,結果DCom可 ,而Socket不可故推測以socket不可操作遠端的指標 另請教TypeLibrary中的節點是否可以移動順利,我有試過直接搬[TEXT]的文字資料,不過會產生錯誤,不知你是否有方法 謝謝!!
是的,**为以var的方式传递指针,如“IAppServer **”映射为var Param1:IAppServer。 var方式在COM里与一般的vcl不太一样,不可能是内存指针的传递(一台机器的地址如何映射到另一台,这个你我都要详细看看COM原理)。因此也不会“减少资料传递,提高效率”,你可以试试DCOM下,比较传递ADO的_RecordSet回Client和把资料save到_Stream,再变成OLEVariant传递回Client。 我认为DCOM和Socket功能应该是一样的。 “TypeLibrary中的節點是否可以移動順利”,不明白你的意思。 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
suda
一般會員


發表:17
回覆:63
積分:16
註冊:2002-05-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-12-25 16:28:32 IP:61.221.xxx.xxx 未訂閱
是的,我有參考一些COM的書籍不過資質不夠參不透其中道理,如你所述的我會測試看看,用兩台機器以DCOM及Socket的方式測試 TypeLibrary中的節點是否可以移動順利(這個字我打錯了)”,不明白你的意思。 我指的是typelibrary中的樹狀編輯窗節點是否可以移動〔順序〕
系統時間:2024-04-27 10:36:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!