【发布时间】:2015-09-23 12:07:42
【问题描述】:
我们希望跨 DLL 边界共享 ADOConnection(目前是 Delphi 到 Delphi,但在不久的将来也可能是 C# 到 Delphi)。
由于我们希望将来能够灵活地从 c# 调用 DLL,我们希望能够使用 _Connection 作为参数来定义 DLL 调用。比如:
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 边界传输。
-
@TLama Connection 对象没有被释放,它只是被关闭了
-
@MartynA 可能,但并非没有大的返工。我们正在尝试将其作为一个快速补丁来将现有代码提取到 DLL 中,以处理无法在更高版本的 Delphi 中编译的第三方库。重组以使用 ClientDataset 将需要跨 DLL 边界进行大量拆分逻辑
-
怎么样:
InnerConnection.ConnectionString := ADOConnection.ConnectionString? -
@MattAllwood,(编辑后)您看不到密码,因为您使用的是
Persist Security Info=False(默认),而不是因为您使用.Open和用户ID/密码