自己需要封裝一個COM,能夠實現類似於ADODB相似的功能,然後綜合想來,感覺直接的基於UniDac封裝比較好,於是馬上動手就做,在封裝的過程中碰到如下問題
1 //數據庫連接類
2 TCnConnection = class(TAutoObject, ICnConnection)
3 private
4 FConn: TConnection;
5 function GetConnObj: TConnection;
6 protected
7 public
8 destructor Destroy; override;
9 procedure Initialize; override;
10 property ConnObj: TConnection read GetConnObj;
11 end;
12
13 TCnQuery = class(TCnDataBase, ICnQuery)
14 private
15 FQuery: TQuery;
16 protected
17 public
18 procedure Set_Connection(const Param1: ICnConnection); safecall;
19 end;
TCnConnection就是ICnConnection接口的類實現
然後TCnQuery是ICnQuery接口的類實現,現在要實現直接的將ICnConnection作為連接屬性傳給TQuery。
在TUniQuery中,默認的賦值Connection語句應該為
TUniQuery.Connection= TUniConnection
如果再封裝一個一模一樣的IUniConnection代碼量比較大,因此想著能夠直接的傳入一個接口,然後自動的得到接口的類實例,然後在接口的類實現當中,串出來一個TUniConnection,方案找到,接下來困難點就是從接口轉到類對象
經過多次測試,得出最後的實現方法為
1 procedure TCnDataBase.Set_Connection(const Param1: ICnConnection);
2 var
3 FConnObj: TCnConnection;
4 eAutoObjFactory: TAutoObjectFactory;
5 eEntry: PInterfaceEntry;
6 begin
7 //得到類工廠,Class_CnConnection就是在創建COM的時候,自動生成的
8 eAutoObjFactory:= TAutoObjectFactory(ComClassManager.GetFactoryFromClassID(Class_CnConnection));
9 //得到接口標識的接口項
10 eEntry:= eAutoObjFactory.DispIntfEntry;
11 //IOffset為接口的偏移地址,eResource減去IOffset所得到的地址就是對象實例
12 FConnObj:= TCnConnection(Integer(Param1)-eEntry.IOffset);
13 FDataSet.Connection:= FConnObj.ConnObj;
14 end;
至此,得到所需要的結果
摘自 cntlis