Delphi編寫COM+簡介(轉)


  (1) idispatch是COM object的接口, 在Delphi中通常指一個OleObject.

   (2) OleVariant是一種COM object兼容的Variant類型, 可以通用任何Ole Automation 類型, 他與CreateOleObject創建的idispatch兼容

1:Com+的編寫:

    1:File---->New---->Other....---->ActiveX Library 標籤 下的 Transactional Object

    2: 然後填寫: CoClss Name :類的名字,比如:ComPlus Threading Modal :線程模式:Apartment 選項: Supports transactions

    3:然後在View--->Library的對話框中增加方法 注意:如果參數爲輸出的話,則類型要是指針型,比如:Long * ,然後修改後面的參數in :out,ret

    4:最後完善增加的方法就ok了

2:客戶端調用的編寫:

    1:先倒入Com+的接口類型. Project --->import Type Library---->選中你編寫的Com+的類型,然後選擇:Create Unit

3、安裝COM+組件有兩種方式,

    第一種(推薦):如果是在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+應用程序包中,只需重複以上步驟即可。

4、“導出客戶端組件包”指的是把已經註冊的組件導出爲.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+對象 ???


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章