我們希望跨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編輯器 '測試連接')
只是一個想法:辦你有可能將你的Ado數據轉移到TClientDataSet?我想問的原因是CDS數據很容易作爲變體跨DLL邊界傳輸。 – MartynA
@TLama Connection對象沒有被釋放,它只是關閉了 –
@MartynA,但並非沒有大的重做。我們正在嘗試將其作爲一個快速修補程序,將現有代碼提取到一個DLL中,以處理將在Delphi的更高版本中無法編譯的第三方庫。重構使用ClientDataset將需要跨越DLL邊界的大量拆分邏輯 –