【问题标题】:Sharing an ADO Connection across a DLL boundary跨 DLL 边界共享 ADO 连接
【发布时间】: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/密码

标签: delphi ado delphi-xe


【解决方案1】:

你可以试试这个方法:

  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

【讨论】:

  • 这不只是将 TADOConnection 对象跨过 DLL 边界吗?正如我在问题中所说,这是一个选项,但生成的 dll 仅限 Delphi。
  • 是的,这样你就传递了Adoconnection类的指针。无论如何我很抱歉。我的思绪停下来阅读您在“Delphi to Delphi at the moment”中的问题;)
猜你喜欢
  • 1970-01-01
  • 2013-12-12
  • 2011-11-09
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
相关资源
最近更新 更多