2017-02-14 34 views
0

我正在使用Delphi 7,我想在不同的Delphi應用程序之間共享ADO連接對象。如何使用類型庫來做到這一點?如何從COM返回TADOConnection(類型庫)

創建方法時,我只能返回字符串/整數/某些數據類型,我沒有看到任何TADOConnection。如何返回tADOConnection?

enter image description here

+2

你不能只是把一個Delphi類變成一個COM對象。 COM只返回它支持的某些類型,而Delphi類不是其中之一。從表面上看,你所要做的似乎比它值得的更麻煩。爲什麼你認爲你需要跨應用程序「共享」一個AdoConnection?你期望它提供什麼好處? – MartynA

+0

@MartynA:我們有一個需要始終運行的基本應用程序。所以我想創建一個TADOConnection對象並連接到基本應用程序中的數據庫並在所有其他應用程序中使用相同的連接。 – DelphiLearner

+0

你知道COM「marshalling」嗎? – MartynA

回答

1

甲TAdoConnection,隨着AdoDB.PAS定義的所有其它TAdoxxx目的, 「位於的頂部」,並使用其在Windows的ADO子系統創建的對象。 如果您查看D7源單元AdoInt.Pas,這是C:\ PROGRAM FILES \ COMMON FILES \ SYSTEM \ ADO \ MSADO15.DLL的類型庫導入 。在其中定義的一個對象接口 是_Connection,並且它是一個爲TAdoConnection執行所有工作 的實例。

在一些AdoInt.Pas定義的接口的對象的跨進程邊界, 最引人注目的是RecordSet對象,這是ADO級對象中間體服務器並且Delphi側AdoCustomDataset後代像TAdoQuery之間 , 工作等等。在David Sceppa的「Programming ADO」一書(微軟出版社) 中有一章介紹了這方面的內容,我寫了一個測試COM服務器,它可以通過COM使用RecordSet對象,並且工作正常。

但是,據我已經能夠通過實驗建立,不可能 獲得TAdoConnection或其基礎ConnectionObject使用COM跨越進程 邊界工作。

但是,如果最初激發你的想法朝着這個方向發展,那簡直就是不得不在每個新項目中都以同樣的方式繼續設置AdoConnections,我個人會做的只是派生一個定製的TAdoConnection後裔,您始終在代碼中使用的屬性,然後使用Delphi註冊它,以便它顯示在Component Palette上。

+0

http://stackoverflow.com/questions/3266532/ok-to-use-tadoconnection -in-threads – kobik

+0

@kobik:謝謝,但我不確定這些答案是否正確,因爲我在不同線程中的AdoConnections之間共享了一個ConnectionObject,以簡化在後臺檢索查詢結果。 – MartynA

+1

@ kobik:看到更新,也許抵制說「我已經告訴過你」的誘惑; =) – MartynA