我们希望在DLL边界共享一个ADOConnection(目前Delphi到Delphi,但在不久的将来也可能是Delphi的C#)。
由于我们希望将来能够灵活地从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编辑器中“测试连接”
答案 0 :(得分: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