(1) idispatch是COM object的接口, 在Delphi中一般指一個OleObject.數據庫
(2) OleVariant是一種COM object兼容的Variant類型, 能夠通用任何Ole Automation 類型, 他與CreateOleObject建立的idispatch兼容express
1:Com+的編寫:數組
1:File---->New---->Other....---->ActiveX Library 標籤 下的 Transactional Object服務器
2: 而後填寫: CoClss Name :類的名字,好比:ComPlus Threading Modal :線程模式:Apartment 選項: Supports transactionsapp
3:而後在View--->Library的對話框中增長方法 注意:若是參數爲輸出的話,則類型要是指針型,好比:Long * ,而後修改後面的參數in :out,ret分佈式
4:最後完善增長的方法就ok了ide
2:客戶端調用的編寫:工具
1:先倒入Com+的接口類型. Project --->import Type Library---->選中你編寫的Com+的類型,而後選擇:Create Unitui
三、安裝COM+組件有兩種方式,spa
第一種(推薦):若是是在IDE環境裏,點擊「Run->Install COM+ Objects」便可把打開的Active Library項目安裝到COM+環境中,注意:若是打開的項目是 一個普通的Application項目,是不能被安裝到COM+環境中的。 將要安裝的com+打上勾,而後在application中有兩個選項:install to existing application :表示你的com+安裝在com服務器的哪一個組件包中, install to New application:表示將當前com+組件安裝到一個新的組件包中.
第二種辦法:打開控制面板-> 管理工具->組件服務->計算機->個人電腦->COM+應用程序,在COM+應用程序的樹項上點擊 鼠標右鍵,選擇「新建->應用程序」->建立一個空的應用程序,併爲此應用程序命名,接下 來點擊「下一步」直到結束便可。創建了空的COM+應用程序後,接下來就是把COM DLL安裝 到COM+應用程序中了。在剛創建的空應用程序的樹項中新建一個組件,選擇「安裝新組件」, 在打開文件對話框中選擇要安裝到COM+環境中的DLL文件,以後跟着嚮導作均可以了,要把 多個COM DLL安裝到同一個COM+應用程序包中,只需重複以上步驟便可。
四、「導出客戶端組件包」指的是把已經註冊的組件導出爲.msi格式的文件,這些文件在客 戶端安裝後,只會在客戶端註冊組件,而不會安裝多餘的文件。若是不在客戶端註冊組件, 是不不能調用位於服務器上的組件的(此指服務器和客戶端分佈在不一樣的機器上時)。
5:調試Com+程序 ---ok
1.打開Windows中的組件管理,找到要調試的組件包,點右鍵,選擇屬性,在高級這頁裏選擇調試選項,打勾; 而後在下面的調試路徑中找到/processID:{xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 複製出來
2.在dephi中Run | Parameters… HOST APPLICATION 填入 {系統路徑}\system32\dllhost.exe PARAMETERS 粘巾 /processID:{xxxxxxxxxxxxxxxxxxxxxxxxxxxxx}
3。很關鍵的一點:組件程序:project|option|linker|Include TD32 debug info 和Include remote debug symbols打勾
4.啓動delphi,運行要調試的Com+程序,設置斷點,而後運行客戶端程序便可進入到Com+斷點.
5.調試完後記得要在 Windows中的組件管理中的高級這頁裏調試選項勾去掉喲.
6:Com+須要注意的地方:
1:客戶機運行就會報 interface not supported 錯誤 大體緣由:輕舞肥羊 (2004-05-09 11:00:01) COM+的權限依賴於Windows的權限配置,在服務器須要有客戶機的用戶名和密碼。 若是還不行,就在服務器上從新安裝com+,從新導出.
2:創建工程時,com+不能包含在工程組中.(個人實踐)
3:COM+不支持Oracle嗎?在用事務的時候出錯:Using Oracle with Microsoft Transaction Server and COM+
7:在Com+中添加遠程數據模塊
1:File---->New---->Other....---->Multitier 標籤 下的 Transactional Data Module
2:而後在View--->Library的對話框中增長方法.
8:Com+中傳遞數組
先定義數組: type TDataRecord = record A: Byte; B: LongWord; C: Word; D: LongWord; end; 1:server: function GetData: OleVariant; var P: Pointer; begin VarClear(Result);//不知D5有沒。 try Result := VarArrayCreate([0, SizeOf(TDataType)], varByte); P := VarArrayLock(Result); //Data: TDataType爲你要傳的記錄類型 Move(Data, P^, SizeOf(TDataType)); finally VarArrayUnLock(Result); end; end; 2:Client procedure GetFile(const FileName: string); var P: Pointer; V: OleVariant; Data: TDataType; begin FillChar(Data, SizeOf(Data), 0); V := SocketConnection1.AppServer.GetData; try P := VarArrayLock(V); Move(P^, Data, SizeOf(Data)); finally VarArrayUnLock(V); end; end; 9:Com+中傳遞記錄集 下面xeen 實驗成功 uses ADOInt******************************************************************************************* 能夠;你能夠將ADO的數據做爲一個Variant類型的變量進行傳送:adodataset1.RecordSet這是原生的ado數據 這是服務端的一個方法的代碼:把CodeSet的類型改成Variant*[in,out] function TADORec.getData: OleVariant; begin AdoDataSet1.Open; result := adodataset1.RecordSet; end; ************************************************************************************************************************ 客戶端 uses adoint; var MyRecordset :_recordset; begin MyRecordset := IUnknown(CodeSet) as _recordset ************************************************************************************************************************** Com基本概念:
1:COM是一個基於二進制的標準。打個比方,咱們用Delphi實現了一個對象,通常狀況下,咱們只能在Delphi來生成這個對象的實例並調用,而若是咱們用Delphi實現了一個COM對象的話,咱們能夠用VC、VB或者其餘任何一種支持COM對象的語言來生成實例和調用。反過來也同樣,咱們能夠在Delphi中使用各類COM對象,而不用介意它是用什麼語言編寫的。COM提供了分佈式COM對象的機制,形象地說你能夠調用另外一臺機器中的COM對象。COM+則是MTS的一個升級,在COM的基礎上進一步提供了事務處理和其餘不少Pool技術。
2:線程模式:Apartment:多個線程服務.
3:當創建Com+時選擇的事務模式爲Requires a Transaction,Com+會根據客戶的的請求創建相應的事務,不只僅時數據庫,還會有系統資源等事務.成功SetComplete.回滾SetAbort. 選擇Requires a Transaction表示當用戶調用這個COM+組件時,COM+環境會爲這個組件創建一個新的事務上下文,這和數據庫的事務不是一回事。當你的COM+組件提交數據時若是出錯,應該告訴事務上下文,只要調用COM+組件的SetAbort方法就能夠。這樣一來,處於同一個事務上下文的全部COM+組件都會Rollback。若是數據提交成功,應該調用SetComplete,不調用這個方法也能夠,由於在默認狀況下,COM+組件的事務狀態設置爲EnableCommite。當處於同一事務上下文的全部COM+組件對象都調用了SetComplete時,該事務上下文才會真正的向數據庫提交數據。
4:SetAbort合SetComplete是否正確調用
5:(阿朱) 建議:多個DLL在一個包,一個DLL中的COM公用一個ADOCONNECTION 6:問題:我已經在Transactional Data Module的Pooled屬性裏面設置了True了,可是在Win2000的組件服務管理的「組件屬性」的「激活」一欄裏面,仍然沒法打開「啓用對象共用」的選項 --->您能夠將線程模式設置爲tmNeutral或者tmBoth均可以。
Com有須要研究和有疑問的地方:
1:Com+的模式:
2:到Com+的資源Pooling機制
3:用delphi6 開發Com+,用Neutral模式,儘可能用Object Pooling,固然就是要無狀態了,事務要儘可能短,避免死鎖,用ADO不要用BDe.Dbexpress等.
4:個人作法是,按功能劃分組件,把查詢和更新分爲兩個功能組件,由於查詢不須要事務,因此只要支持事務就好了。更新通常須要事務
5:COM+的事務屬性 COM+的事務默認級別是序列 Read,而不是咱們認爲的commit Read,並且咱們設置AdoConnection的隔離級是不 管用的,只能強制用顯式的SQL才能起效果。 例如: 一箇中間層COM select * from a where py_code like 'S%' 繼續下面有不少代碼 另外一箇中間層COM update a set py_code=py_code where py_code like 'B%' 這時這個COM將會死鎖等待,雖然改動的不是一個數據也會死鎖 用Commit Read 或UnCommit Read不會 建議: 因此被多個子系統更新或讀的表要在最後打開和更新,不要早。另外能夠強制改變ADOCONNECTION的隔離級
6:Com+中如何進行事務處理??? 在COM+中,如何使用SetComplete和SetAbort進行事務管理?? 老兄,SetComplete和SetAbort怎麼能在客戶端調用呢?這樣確定是不行的。要保證事務,就在服務器端聲明一個專門保存的接口方法,例如: procedure UpdateMyData(var AData1, AData2: OleVariant; var AMaxError, AErrorCount: Integer); begin try DataSetProvider1.Data := AData1; DataSetProvider1.ApplyUpdate(AMaxError, AErrorCount); DataSetProvider2.Data := AData2; DataSetProvider2.ApplyUpdate(AMaxError, AErrorCount); SetComplete; except SetAbort; end; end;
7:,在組件管理器中的「事務列表」裏也看不到事務(應該有事務的時候),怎麼看?
8:Com+的兩大研究:事務 和 pooling
9:作一個提交用的COM+對象和一個協調用的COM+對象 ???