我对“com形式的dll文件”没有什么概念,我说点肤浅看法,别笑话我啊:
1、TADOConnection 是 Delphi 的一个类,将类作为参数传入 dll 中是件比较费力的事情。
2、如果用 ADO 接口代替 TADOConnection(Import ActiveX),实际上还是要生成一个类——TConnection。
3、我想用原生 ADO 接口是不是会好些。例如,原本在 dll 中的一些功能函数可以声明成如下的样子:
procedure GetData(Connection: Variant);
var
rst: OleVariant;
begin
rst := CreateOleObject('ADODB.Recordset');
rst.Open(sql, Connection, adOpenStatic, adLockOptimistic, adCmdText);
...
rst := Unassigned;
end;
4、而你所谓的那个“共用的TADOConnection”,可以在调用 dll 的主程序中生成,然后作为参数传递给各个 dll。
var
cnn: OleVariant;
procedure CreateConnection;
begin
cnn := CreateOleObject('ADODB.Connection');
cnn.CursorLocation := adUseServer;
cnn.IsolationLevel := adXactCursorStability;
cnn.Mode := adModeReadWrite;
cnn.Provider := 'SQLOLEDB.1';
if cnn.State <> adStateClosed then
cnn.Close;
cnn.ConnectionString :=
'Provider=SQLOLEDB.1;Persist Security Info=True;Initial Catalog=' +
db + ';Data Source=' + srv + ';Connect Timeout=10;' +
'Use Procedure for Prepare=1';
cnn.Open(cnn.ConnectionString, uid, pwd, adConnectUnspecified);
end;
或者,更简单点,直接使用 ADOConnection.ConnectionObject,这样可以照常使用 Delphi 的 ADOConnection 组件,只是向 dll 传递参数时用 ADOConnection.ConnectionObject 而不是直接传递 TADOConnection 类。
5、说的不对别笑话我啊,我对 Com 一无所知。