2015-07-06 35 views
4

我們希望跨DLL邊界共享一個ADOConnection(Delphi到Delphi,但在不久的將來也可能是C#到Delphi)。我們希望將來能夠靈活地從c#中調用DLL,我們希望能夠使用_Connection作爲參數來定義DLL調用。喜歡的東西:通過DLL邊界共享一個ADO連接

procedure DoStuff (ADOConnection: _Connection) 
var 
    InnerConnection: TADOConnection; 
begin 
    InnerConnection := TADOConnection.create(nil); 
    try 
    InnerConnection.ConnectionObject := ADOConnection; 
    DoMoreStuff(InnerConnection); 
    finally 
    InnerConnection.free; 
    end; 
end; 

不幸的是,TADOConnection析構函數代碼將關閉傳遞給它的連接,這是不必要的副作用。免費

InnerConnection.ConnectionObject := nil 

之前將不會做任何事情,因爲它是由

if Assigned(Value) = nil 

在TADOConnection.SetConnectionObject,導致沒有做任何事情通話抓獲。

有沒有更好的方法來實現這一目標?傳遞連接字符串是另一種選擇,但意味着我們必須處理跨越邊界的用戶名/密碼問題和加密。通過TADOConnection是另一種選擇,但阻止其他語言的調用。

編輯:爲清楚起見,原始TADOConnection對象的用戶名/密碼使用.Open例程設置,因此這些詳細信息不在連接字符串中(實際上,通常存儲錯誤的用戶名,因爲它是名稱用於在MS UDL編輯器 '測試連接')

+1

只是一個想法:辦你有可能將你的Ado數據轉移到TClientDataSet?我想問的原因是CDS數據很容易作爲變體跨DLL邊界傳輸。 – MartynA

+0

@TLama Connection對象沒有被釋放,它只是關閉了 –

+0

@MartynA,但並非沒有大的重做。我們正在嘗試將其作爲一個快速修補程序,將現有代碼提取到一個DLL中,以處理將在Delphi的更高版本中無法編譯的第三方庫。重構使用ClientDataset將需要跨越DLL邊界的大量拆分邏輯 –

回答

0

你可以試試這個方法:

type TInit_StFattDLL = procedure(var DataBase:TAdoConnection); 
    var Init_StFattDLL:TInit_StFattDll; 

來電者是:

Function ConnectDll():Boolean; 
var 
    handleDll:THandle; 

begin 
    handleDll := LoadLibrary('mydll.DLL'); 
    @Init_StFattDLL := GetProcAddress(handleDll , 'myConnectFunction'); 

     if @Init_StFattDLL <> nil then 
     begin 
      Init_StFattDLL(ADOConnection1); 
      result:=true; 
     end 
     else 
     result:=false; 
end; 

到該dll放如下:

在項目文件

把出口:

Exports myConnectFunction; 

全局部分:

var Database:TAdoConnection; 

導出過程如下:

procedure myConnectFunction(var MyDataBase:TAdoConnection);export; 
begin 
    Database:=MyDataBase; 
end 
+0

這是不是隻是通過DLL邊界傳遞TADOConnection對象?正如我在這個問題中所說的那樣,這是一個選項,但是隻生成了只有Delphi的結果。 –

+0

是的,以這種方式傳遞Adoconnection類的指針。 無論如何,我很抱歉。我的思緒停下來在「德爾福到德爾福」的時刻讀到你的問題;) –