跨DLL边界共享ADO连接

Mat*_*ood 5 delphi ado delphi-xe

我们希望在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;
Run Code Online (Sandbox Code Playgroud)

不幸的是,TADOConnection析构函数代码关闭了传递给它的连接,这是不希望的副作用。新增中

InnerConnection.ConnectionObject := nil
Run Code Online (Sandbox Code Playgroud)

在免费之前,它什么也没做,因为它被

if Assigned(Value) = nil
Run Code Online (Sandbox Code Playgroud)

在TADOConnection.SetConnectionObject中,这导致调用不执行任何操作。

有没有更好的方法来实现这一目标?传递连接字符串是一种替代方法,但是这意味着我们将不得不处理用户名/密码问题以及跨边界的加密。传递TADOConnection是另一个选项,但是它阻止了从其他语言进行的调用。

编辑:为清楚起见,使用.Open例程设置了原始TADOConnection对象的用户名/密码,因此这些详细信息不在连接字符串中(实际上,通常存储了错误的用户名,因为它是用于'测试连接”(在MS UDL编辑器中)

Gia*_*mbo 0

你可以尝试这样的方法:

  type TInit_StFattDLL = procedure( var DataBase:TAdoConnection);
  var  Init_StFattDLL:TInit_StFattDll;
Run Code Online (Sandbox Code Playgroud)

来电者是:

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;
Run Code Online (Sandbox Code Playgroud)

到dll中输入以下内容:

在项目文件中放置导出:

Exports myConnectFunction;
Run Code Online (Sandbox Code Playgroud)

全局部分:

var Database:TAdoConnection;
Run Code Online (Sandbox Code Playgroud)

导出过程如下:

procedure myConnectFunction( var MyDataBase:TAdoConnection);export;
begin
   Database:=MyDataBase;
end
Run Code Online (Sandbox Code Playgroud)