天天看點

主題:的中間層架構 第二節 |DLL的Exception你如何處理?|不同宿主内如果接口抛出異常,怎麼處理

主題:<插件式>的中間層架構 第二節

時間:2005-01-21 15:00

主講:D10.天地弦

A1.老大

(一).DLL的Exception你如何處理?

(二).不同宿主内如果接口抛出異常,怎麼處理 

2005-01-21 15:03:07 /:>D10.天地弦(185511468)

先回顧一下上一堂課的内容

2005-01-21 15:04:37 /:>D10.天地弦(185511468)

沒有什麼回頭客,我自己來帶大家回顧一下上一堂上吧

2005-01-21 15:05:07 /:>D10.天地弦(185511468)

<a href="http://www.cnblogs.com/dksoft/articles/85708.html">http://www.cnblogs.com/dksoft/articles/85708.html</a>

上一堂課的筆記

2005-01-21 15:06:01 /:&gt;D10.天地弦(185511468)

上一堂課主要講了一下,整個架構的運作。

2005-01-21 15:06:38 /:&gt;D10.天地弦(185511468)

整理架構的動力來源都是以用戶端指令來驅動的

主題:的中間層架構 第二節 |DLL的Exception你如何處理?|不同宿主内如果接口抛出異常,怎麼處理

2005-01-21 15:08:13 /:&gt;D10.天地弦(185511468)

整個架構的運作是這樣子的

2005-01-21 15:08:48 /:&gt;D10.天地弦(185511468)

上次說到了

2005-01-21 15:09:14 /:&gt;D10.天地弦(185511468)

這一部分,用戶端發送指令到中間層上

2005-01-21 15:09:59 /:&gt;D10.天地弦(185511468)

還有誰記得中間層的任務不

2005-01-21 15:10:39 A3.武稀松(42088303)

子產品管理

2005-01-21 15:10:48 A3.武稀松(42088303)

統一分派指令

2005-01-21 15:11:06 /:&gt;D10.天地弦(185511468)

差不多了

2005-01-21 15:11:17 /:&gt;D10.天地弦(185511468)

我還總結一下

中間層的任務就是

找到對應的子產品接口,接參數傳遞到子產品進行處理 

2005-01-21 15:12:57 /:&gt;D10.天地弦(185511468)

找到相應的子產品,使用接口,轉發指令,參數

2005-01-21 15:13:36 /:&gt;D10.天地弦(185511468)

今天主要講中間層架構與子產品通訊這一部分

2005-01-21 15:14:56 /:&gt;D10.天地弦(185511468)

看看子產品是怎麼樣叫子產品來處理資料的

2005-01-21 15:15:19 /:&gt;D10.天地弦(185511468)

上一堂課講了中間層與子產品進行通訊的幾個接口

2005-01-21 15:15:37 /:&gt;D10.天地弦(185511468)

這幾個接口,就是中間層與子產品進行通訊的協定

2005-01-21 15:16:24 /:&gt;D10.天地弦(185511468)

  IModelService = interface //子產品操作接口

    function ProcessData(OwnId: Cardinal; ActionIndex: Integer; var Data, Msg: OleVariant):

HResult; stdcall;

    //主程式調用此函數關閉子產品操作

    function CloseModel(): HResult; stdcall;

  end;

2005-01-21 15:16:59 /:&gt;D10.天地弦(185511468)

主要是通個這個接口來告訴子產品進行處理資料的

2005-01-21 15:17:54 /:&gt;D10.天地弦(185511468)

我現在開始講代碼了。

2005-01-21 15:18:06 /:&gt;D10.天地弦(185511468)

宏觀講完了

2005-01-21 15:18:27 /:&gt;D10.天地弦(185511468)

大家請打開工程

2005-01-21 15:19:23 /:&gt;D10.天地弦(185511468)

打開工程MiddleLayer.bpg

2005-01-21 15:21:58 /:&gt;D10.天地弦(185511468)

好,上次講到

procedure TMLRDataModule.RemoteDataModuleCreate(Sender: TObject);

begin

  FThreadID := dkHandle.NewHandle; //為每個用戶端建立一個Handle

  CurrentUser := TUser.Create(FThreadID); //建立使用者類

  TUsers.Users.Add(CurrentUser); //添加至使用者清單

  TRemoteDataModules.ItSelf.Add(Self); //添加目前子產品到清單

  FModels := TModels.Create(false);   //自己負責釋放對象

  FService := TFrameworkService.Create(FModels, ID); //建立目前service;

  TFrameworkServices.ItSelf.Add(FService);           //添加到架構集裡面,

end;

2005-01-21 15:22:32 /:&gt;D10.天地弦(185511468)

講到中間層資料子產品的建立這部分代碼

2005-01-21 15:23:11 /:&gt;D10.天地弦(185511468)

提幾個問,活躍一下

2005-01-21 15:23:40 /:&gt;D10.天地弦(185511468)

FThreadID

是做什麼用的

2005-01-21 15:24:01 /:&gt;D10.天地弦(185511468)

上堂課講過了的

2005-01-21 15:24:14 來吧!朋友(264123192)

我要幹活,誰幫我做一下筆記[:L]

2005-01-21 15:24:16 hellfire(149902352)

全局編号

2005-01-21 15:24:29 hellfire(149902352)

錯了.别砸我

2005-01-21 15:24:30 /:&gt;D10.天地弦(185511468)

講完我會整理

2005-01-21 15:24:42 西門吹風㊣(48542332)

 FThreadID := dkHandle.NewHandle; //為每個用戶端建立一個Handle

2005-01-21 15:24:44 湖北人(364076660)

使用者連接配接時,系統為其配置設定的ID号

2005-01-21 15:24:44 A3.武稀松(42088303)

也不算錯吧

2005-01-21 15:24:49 /:&gt;D10.天地弦(185511468)

hellfire(149902352) 15:24:16

全局編号 ==&gt;是個編号

2005-01-21 15:25:07 /:&gt;D10.天地弦(185511468)

湖北人(364076660) 15:24:44

使用者連接配接時,系統為其配置設定的ID号==&gt;這個正解

2005-01-21 15:25:35 /:&gt;D10.天地弦(185511468)

initialization

  TComponentFactory.Create(ComServer, TMLRDataModule,

    Class_MLRDataModule, ciMultiInstance, tmApartment);

2005-01-21 15:26:12 /:&gt;D10.天地弦(185511468)

用這種模式建立遠端資料子產品。每個用戶端連結資料庫都會建立一次

2005-01-21 15:26:13 /:&gt;D10.天地弦(185511468)

是不是

2005-01-21 15:26:39 D11.飛去找你(419070954)

Y

2005-01-21 15:26:42 hellfire(149902352)

2005-01-21 15:27:03 熊科智(65464106)

不知道

2005-01-21 15:27:08 西門吹風㊣(48542332)

O~ Y~

2005-01-21 15:27:52 /:&gt;D10.天地弦(185511468)

這樣,為了便于讓架構找到每一個用戶端連結,是以在

這個事件裡,為每個用戶端連編一個号

2005-01-21 15:28:28 /:&gt;D10.天地弦(185511468)

再提第二個問題

2005-01-21 15:28:43 /:&gt;D10.天地弦(185511468)

TFrameworkServices

2005-01-21 15:28:49 /:&gt;D10.天地弦(185511468)

這個類是做什麼的

2005-01-21 15:29:04 西門吹風㊣(48542332)

//架構集接口

2005-01-21 15:29:14 西門吹風㊣(48542332)

IFrameworkServices = interface //架構集接口(通過該接口查得到架構服務接口

2005-01-21 15:29:30 /:&gt;D10.天地弦(185511468)

對,

2005-01-21 15:29:58 A3.武稀松(42088303)

西門吹雪,真不是吹的

2005-01-21 15:30:00 /:&gt;D10.天地弦(185511468)

這個類實作了IFrameworkServices架構集接口

2005-01-21 15:30:24 西門吹風㊣(48542332)

武松,錯了哦,我是吹風

2005-01-21 15:30:27 /:&gt;D10.天地弦(185511468)

是用來管理所有服務的類

2005-01-21 15:30:38 /:&gt;D10.天地弦(185511468)

  TFrameworkServices = class(TdkObjectList, IFrameworkServices)

2005-01-21 15:30:55 /:&gt;D10.天地弦(185511468)

2005-01-21 15:31:35 /:&gt;D10.天地弦(185511468)

是為每個用戶端連結建立一個服務

2005-01-21 16:04:01 /:&gt;D10.天地弦(185511468)

再看看,子產品裡如何收到指令進行處理的

2005-01-21 16:04:30 /:&gt;D10.天地弦(185511468)

大家打開一個子產品

2005-01-21 16:04:40 /:&gt;D10.天地弦(185511468)

AccountMgr

2005-01-21 16:05:35 /:&gt;D10.天地弦(185511468)

中間層是通過操作哪個接口方法

2005-01-21 16:05:52 /:&gt;D10.天地弦(185511468)

告訴子產品進行處理的

2005-01-21 16:06:09 B2.TCP INFO(31329846)

這個

2005-01-21 16:06:11 /:&gt;D10.天地弦(185511468)

中間層是通過操作哪個接口方法 告訴子產品進行處理的?

2005-01-21 16:06:18 西門吹風㊣(48542332)

IModelService

2005-01-21 16:06:27 西門吹風㊣(48542332)

ProcessData

2005-01-21 16:07:23 /:&gt;D10.天地弦(185511468)

是能過IModelService.ProcessData告訴子產品處理資料的

2005-01-21 16:08:01 /:&gt;D10.天地弦(185511468)

看看中間層接到用戶端指令做了什麼事

2005-01-21 16:08:10 /:&gt;D10.天地弦(185511468)

誰來貼一下

2005-01-21 16:08:42 西門吹風㊣(48542332)

 try

    result := TFrameworkServices.ItSelf[ID].ModelService[ModuleIndex].ProcessData(Id,

ActionIndex, Data, Msg) = S_OK;

    result := true;

  except

    result := false;    //

2005-01-21 16:08:49 /:&gt;D10.天地弦(185511468)

是這一段了

function TMLRDataModule.ProcessData(ModuleIndex, ActionIndex: Integer;

  var Data, Msg: OleVariant): WordBool;

  try

2005-01-21 16:09:17 /:&gt;D10.天地弦(185511468)

2005-01-21 16:09:23 /:&gt;D10.天地弦(185511468)

主要是這一句了

2005-01-21 16:09:44 /:&gt;D10.天地弦(185511468)

TFrameworkServices.ItSelf[ID].ModelService[ModuleIndex]是找到對應的子產品提供的接口

2005-01-21 16:09:47 西門吹風㊣(48542332)

沒錯,開始暈了,準備運車藥

2005-01-21 16:09:59 /:&gt;D10.天地弦(185511468)

2005-01-21 16:10:14 /:&gt;D10.天地弦(185511468)

明白吧,上堂課講的

2005-01-21 16:11:24 B2.TCP INFO(31329846)

TFrameworkServices.ItSelf[ID] 取得子產品服務

2005-01-21 16:11:35 /:&gt;D10.天地弦(185511468)

找對應的子產品提供的接口是這樣的流程

TFrameworkServices--&gt;TFrameWorkService-&gt;TModels-&gt;TModel-&gt;IModelService

2005-01-21 16:11:56 /:&gt;D10.天地弦(185511468)

B2.TCP INFO(31329846) 16:11:24

TFrameworkServices.ItSelf[ID] 取得子產品服務 =&gt;對

2005-01-21 16:12:22 乾隆(7891551)

我給忘記了,好可惜啊

2005-01-21 16:12:29 /:&gt;D10.天地弦(185511468)

TFrameworkServices.ItSelf[ID].ModelService[ModuleIndex]這一句就實作了

2005-01-21 16:12:45 B2.TCP INFO(31329846)

有一個完整的UML類圖就好了

2005-01-21 16:13:04 /:&gt;D10.天地弦(185511468)

找接口的任務,忘記了的同志可以跟蹤下源碼。

2005-01-21 16:13:36 /:&gt;D10.天地弦(185511468)

B2.TCP INFO(31329846) 16:12:45

有一個完整的UML類圖就好了 ==》我想畫一個,UML,不熟,畫不出來

2005-01-21 16:14:05 /:&gt;D10.天地弦(185511468)

好了,看看,子產品裡面哪一個類實作了IModelService

2005-01-21 16:14:35 B2.TCP INFO(31329846)

用ModelMaker 拽一個,我看看

2005-01-21 16:14:59 /:&gt;D10.天地弦(185511468)

呵呵,好

2005-01-21 16:15:18 /:&gt;D10.天地弦(185511468)

看看子產品裡面哪一個類實作了IModelService 

2005-01-21 16:15:31 西門吹風㊣(48542332)

TModelService 

2005-01-21 16:15:34 /:&gt;D10.天地弦(185511468)

大家可以打開子產品,看看,哪一個類實作了

2005-01-21 16:15:41 西門吹風㊣(48542332)

TModelService = class(TdkInterfacedObject, IModelService)

2005-01-21 16:16:05 /:&gt;D10.天地弦(185511468)

[strong]獎勵西門

2005-01-21 16:16:27 /:&gt;D10.天地弦(185511468)

好看看這個類

2005-01-21 16:16:37 /:&gt;D10.天地弦(185511468)

MLIntsBaseImp

2005-01-21 16:16:38 西門吹風㊣(48542332)

unit MLIntsBaseImp;

2005-01-21 16:16:46 /:&gt;D10.天地弦(185511468)

對在這個單元裡面

2005-01-21 16:17:00 /:&gt;D10.天地弦(185511468)

  TModelService = class(TdkInterfacedObject, IModelService)

  private

    FFrameworkServices: IFrameworkServices; //可通過該服務調用其它子產品服務和架構服務

  protected

    procedure SeparateDataAndParams(var Params: TdkHashTools; Data: OleVariant);

    function InnerOperator(OwnId: Cardinal; ActionIndex: Integer; var Data, Msg: OleVariant):

HResult; virtual;

    function GetMsg(OwnId: Cardinal; MsgID: Integer): WideString;

    function GetSql(OwnId: Cardinal; SqlID: Integer): WideString;

    //擷取更新表資訊

    function GetUpdateInfo(OwnId: Cardinal; FId: Integer): WideString;

  public

    constructor Create();

    destructor Destroy(); override;

    {IModelService Implement}

    {IModelService Implement}//

    class function ItSelf: TModelService; virtual;

    property FrameworkServices: IFrameworkServices read FFrameworkServices write

FFrameworkServices;

2005-01-21 16:17:09 /:&gt;D10.天地弦(185511468)

這個類

2005-01-21 16:17:19 /:&gt;D10.天地弦(185511468)

    function CloseModel(): HResult; stdcall;        {IModelService Implement}

2005-01-21 16:17:24 /:&gt;D10.天地弦(185511468)

看這一部分就行了

2005-01-21 16:17:31 /:&gt;D10.天地弦(185511468)

2005-01-21 16:17:59 /:&gt;D10.天地弦(185511468)

  var Data, Msg:OleVariant): WordBool;

end; 

2005-01-21 16:18:27 西門吹風㊣(48542332)

回到中間層了

2005-01-21 16:19:10 /:&gt;D10.天地弦(185511468)

中間層這樣

result := TFrameworkServices.ItSelf[ID].ModelService[ModuleIndex].ProcessData(Id, ActionIndex,

Data, Msg) = S_OK;

實質上就是執行了TModelService.ProcessData

2005-01-21 16:19:16 /:&gt;D10.天地弦(185511468)

不用回

2005-01-21 16:19:37 /:&gt;D10.天地弦(185511468)

我貼一下中間層接到指令執行的那一段

2005-01-21 16:20:03 /:&gt;D10.天地弦(185511468)

實質上就是執行了子產品裡面TModelService.ProcessData這個函數

2005-01-21 16:20:26 /:&gt;D10.天地弦(185511468)

大家都明白吧

2005-01-21 16:22:12 /:&gt;D10.天地弦(185511468)

TFrameworkServices.ItSelf[ID].ModelService[ModuleIndex]==&gt;是找到接口。

執行接口方法實際上是執行實作該接口類的方法

這應該是比較好了解的

2005-01-21 16:23:05 西門吹風㊣(48542332)

繼續

2005-01-21 16:23:05 /:&gt;D10.天地弦(185511468)

乾隆(7891551) 16:22:07

我來晚了,現在一點都聽不懂了,好着急啊 ==》沒有複習一下。隔得太久了,可能淡忘了

2005-01-21 16:23:25 /:&gt;D10.天地弦(185511468)

function TModelService.ProcessData(OwnId: Cardinal; ActionIndex: Integer; var Data,

  Msg: OleVariant): HResult;

  result := InnerOperator(OwnId, ActionIndex, Data, Msg);

2005-01-21 16:24:26 /:&gt;D10.天地弦(185511468)

子產品收到指令後,要執行的函數是哪一個函數

2005-01-21 16:25:01 /:&gt;D10.天地弦(185511468)

子產品收到指令後,要執行的函數是哪一個函數 

2005-01-21 16:25:18 西門吹風㊣(48542332)

 result := InnerOperator(OwnId, ActionIndex, Data, Msg);

2005-01-21 16:25:39 /:&gt;D10.天地弦(185511468)

InnerOperator(OwnId, ActionIndex, Data, Msg); 

2005-01-21 16:25:50 /:&gt;D10.天地弦(185511468)

這個函數

2005-01-21 16:25:54 /:&gt;D10.天地弦(185511468)

看看這個函數

2005-01-21 16:26:03 乾隆(7891551)

2005-01-21 16:26:11 /:&gt;D10.天地弦(185511468)

貼出來

2005-01-21 16:26:37 西門吹風㊣(48542332)

function TModelService.InnerOperator(OwnId: Cardinal; ActionIndex: Integer; var Data,

2005-01-21 16:26:48 /:&gt;D10.天地弦(185511468)

不是貼原型

2005-01-21 16:26:53 西門吹風㊣(48542332)

function InnerOperator(OwnId: Cardinal; ActionIndex: Integer; var Data, Msg: OleVariant):

2005-01-21 16:27:09 /:&gt;D10.天地弦(185511468)

可以看到這個函數是一個virtual函數

2005-01-21 16:27:15 西門吹風㊣(48542332)

 virtual; 

2005-01-21 16:27:23 /:&gt;D10.天地弦(185511468)

大家都知道virtual;的作用吧

2005-01-21 16:27:41 乾隆(7891551)

知道

2005-01-21 16:27:44 乾隆(7891551)

哈哈

2005-01-21 16:27:46 西門吹風㊣(48542332)

虛的 man最怕的[:P]

2005-01-21 16:27:59 /:&gt;D10.天地弦(185511468)

是用來實作多态的東東了,上次測試還考了

2005-01-21 16:28:10 乾隆(7891551)

就是後面可以OVERRIDE

2005-01-21 16:28:22 西門吹風㊣(48542332)

Y~

2005-01-21 16:28:43 /:&gt;D10.天地弦(185511468)

好這裡我們來看看子產品(DLL)是導出的哪一個類來實作IModelService的

2005-01-21 16:29:03 /:&gt;D10.天地弦(185511468)

找到的貼一下

2005-01-21 16:29:21 西門吹風㊣(48542332)

function GetModelService: IModelService; //擷取子產品服務接口

var

  AModelService: TModelService;

  AModelService := TSelfService.ItSelf;

  result := IModelService(AModelService);

2005-01-21 16:29:35 乾隆(7891551)

西門學的好快啊

2005-01-21 16:30:04 /:&gt;D10.天地弦(185511468)

看到上面西門貼的那段,

2005-01-21 16:30:13 /:&gt;D10.天地弦(185511468)

是TSelfService

2005-01-21 16:31:03 /:&gt;D10.天地弦(185511468)

//執行的應該是

TSelfService.ItSelf.ProcessData這個方法

2005-01-21 16:32:28 西門吹風㊣(48542332)

unit MLIntsImp; 

2005-01-21 16:32:45 /:&gt;D10.天地弦(185511468)

 因為TSelfService.ProcessData就是調用InnerOperator來處理資料,現在看看

  TSelfSerive這個類的InnerOperator方法,他重載了TModelService的InnerOperator方法

2005-01-21 16:33:01 /:&gt;D10.天地弦(185511468)

  FParams: tdkHashTools;

  SeparateDataAndParams(FParams, Data);

  case ActionIndex of

    aiAccountMgr:

      begin

        result := AccountMgr(OwnId, FParams, Data, Msg);

      end;

    aiTest:

        result := Test(Data); //

    aiGetTestData: result := GetTestData(Data);

    aiSetTestData: result := SetTestData(Data);

  else    //子類沒有處理,則交由父類進行處理

    Result := inherited InnerOperator(OwnId, ActionIndex, Data, Msg);

  FParams.Free;

2005-01-21 16:33:06 /:&gt;D10.天地弦(185511468)

function TSelfService.InnerOperator(OwnId: Cardinal; ActionIndex: Integer; var Data,

2005-01-21 16:34:17 /:&gt;D10.天地弦(185511468)

至此,中間層的任務可以告一段落了,接下來的事情應該由子產品看情況進行處理了

2005-01-21 16:35:34 西門吹風㊣(48542332)

2005-01-21 16:36:21 /:&gt;D10.天地弦(185511468)

OK。子產品處理資料後,要傳回給用戶端的資料,包裝好放到Data裡面,有什麼口信放到Msg裡面,準備回航,捎

給用戶端

2005-01-21 16:36:59 /:&gt;D10.天地弦(185511468)

飛機啟航回去了

2005-01-21 16:37:16 /:&gt;D10.天地弦(185511468)

完了,這個中間層架構講完了

2005-01-21 16:37:26 /:&gt;D10.天地弦(185511468)

任務完成了

2005-01-21 16:38:27 乾隆(7891551)

雖然沒聽懂,但知道講的很好。好着急啊

2005-01-21 16:38:34 /:&gt;D10.天地弦(185511468)

估計聽懂的人不多

2005-01-21 16:38:44 乾隆(7891551)

太好了,簡直給我信心

2005-01-21 16:38:48 /:&gt;D10.天地弦(185511468)

因為,忘記上堂課東西了

2005-01-21 16:40:23 /:&gt;D10.天地弦(185511468)

再回憶一下,整個流程

2005-01-21 16:41:01 /:&gt;D10.天地弦(185511468)

用戶端向伺服器發送指令

2005-01-21 16:41:03 乾隆(7891551)

好,開始回憶

2005-01-21 16:41:24 b7.leo(122045231)

d3在嗎

2005-01-21 16:41:52 B2.TCP INFO(31329846)

AccountMgr主要是做什麼的

2005-01-21 16:42:23 西門吹風㊣(48542332)

陛下?服務端接下來做什麼

2005-01-21 16:42:24 /:&gt;D10.天地弦(185511468)

用戶端向--&gt;伺服器發送指令--&gt;TFrameworkServices.ItSelf[ID].ModelService[ModuleIndex]中間層找到子產品

提供的接口

2005-01-21 16:42:46 西門吹風㊣(48542332)

AccountMgr 帳套管理

2005-01-21 16:42:59 /:&gt;D10.天地弦(185511468)

B2.TCP INFO(31329846) 16:41:52

AccountMgr主要是做什麼的 ==&gt;是一個基本子產品,管理帳套的

2005-01-21 16:43:01 乾隆(7891551)

服務端開始執行啊相應的方法啊

2005-01-21 16:43:25 B2.TCP INFO(31329846)

和TestModel.dll沒什麼差別吧,都是子產品

2005-01-21 16:43:33 /:&gt;D10.天地弦(185511468)

是的

2005-01-21 16:43:55 /:&gt;D10.天地弦(185511468)

都是子產品,要擴充功能,就是添加子產品就行了

2005-01-21 16:44:13 乾隆(7891551)

什麼叫帳套啊,這個我都不懂

2005-01-21 16:44:22 /:&gt;D10.天地弦(185511468)

其實整個思路是很簡單的,

2005-01-21 16:45:10 乾隆(7891551)

整個思路再說次,我就學會個這就知足了

2005-01-21 16:45:40 /:&gt;D10.天地弦(185511468)

中間層就是根據用戶端發過來的指令,然後告訴子產品用戶端要你處理這個指令,快點處理好,交給用戶端

2005-01-21 16:46:26 熊科智(65464106)

中間件也是這個意思嗎?

2005-01-21 16:46:40 乾隆(7891551)

是,好簡單。可做起來就複雜了

2005-01-21 16:47:08 /:&gt;D10.天地弦(185511468)

熊科智(65464106) 16:46:26

中間件也是這個意思嗎? ==&gt;是做這種事的

2005-01-21 16:47:21 熊科智(65464106)

哦 

2005-01-21 16:47:22 /:&gt;D10.天地弦(185511468)

我講解的是我做的這個架構

2005-01-21 16:47:32 湖北人(364076660)

可否講一下  TUsers.Users.Add(CurrentUser); //添加至使用者清單

裡面具體怎麼工作的,[:L]

2005-01-21 16:47:46 D8。飄塵(43745429)

D10你的中間層有機會過來交流一下了

2005-01-21 16:48:01 /:&gt;D10.天地弦(185511468)

湖北人(364076660) 16:47:32

裡面具體怎麼工作的,[:L] ==》上次講過了

2005-01-21 16:48:10 /:&gt;D10.天地弦(185511468)

D8。飄塵(43745429) 16:47:46

D10你的中間層有機會過來交流一下了==》好啊

2005-01-21 16:48:20 /:&gt;D10.天地弦(185511468)

不知道什麼時候有機會

2005-01-21 16:48:37 /:&gt;D10.天地弦(185511468)

TUsers.Users==》是得到一個TUsers執行個體

2005-01-21 16:48:41 乾隆(7891551)

書上老說三層中間層要把業務抽象成一個個組建,就是說做成一個個接口的意思吧,更通俗說就是做成一個個

類中的方法,供調用對吧

2005-01-21 16:49:14 A3.武稀松(42088303)

他說的元件指服務

2005-01-21 16:49:30 乾隆(7891551)

我們能不能從最基本的來講大家學習下,比如從類講,高手們有熱心人嗎

2005-01-21 16:50:32 /:&gt;D10.天地弦(185511468)

湖北人==》叫西門親自說給你聽聽

2005-01-21 16:52:03 B2.TCP INFO(31329846)

D10你的子產品在哪加載的

2005-01-21 16:52:24 B2.TCP INFO(31329846)

FModels := TModels.Create(false);   //自己負責釋放對象

2005-01-21 16:52:41 /:&gt;D10.天地弦(185511468)

是由TModel來加載

2005-01-21 16:53:15 /:&gt;D10.天地弦(185511468)

TModels是負責管理已裝入的子產品

2005-01-21 16:53:16 B2.TCP INFO(31329846)

TModel在哪建立的?

2005-01-21 16:53:26 /:&gt;D10.天地弦(185511468)

FModels.Models[i]

2005-01-21 16:53:35 /:&gt;D10.天地弦(185511468)

如果找不到就開始建立

2005-01-21 16:54:02 /:&gt;D10.天地弦(185511468)

function TModels.GetModelFromIndex(Index: Integer): TModel;

  i: integer;

  TmpModel: TModel;

  result := nil;

  for i := 0 to Count - 1 do

  begin

    if TModel(Items[i]).ModelIndex = index then

    begin

      result := TModel(Items[i]);

      break;

    end;

2005-01-21 16:54:13 /:&gt;D10.天地弦(185511468)

    property Model[index: Integer]: TModel read GetModelFromIndex; default;

-----A1老大提問...

2005-01-21 15:42:40 A1.笑熬糨糊(2282902)

A3,來讨論一個接口的問題不?

2005-01-21 15:44:51 D3天之痕若虹(86278566)

聽..

2005-01-21 15:45:55 西門吹風㊣(48542332)

源碼空間不知道有沒有

2005-01-21 15:46:11 C03.MUSIC(281361369)

位址多少?

----------------A1老大提問題

2005-01-21 15:46:17 /:&gt;D10.天地弦(185511468)

來了

2005-01-21 15:46:44 /:&gt;D10.天地弦(185511468)

好,出一題

2005-01-21 15:46:59 A1.笑熬糨糊(2282902)

D10,我來提問你好了。

2005-01-21 15:47:11 /:&gt;D10.天地弦(185511468)

2005-01-21 15:47:13 /:&gt;D10.天地弦(185511468)

老大來

2005-01-21 15:47:23 A1.笑熬糨糊(2282902)

你用的也是DLL導出接口,對不?

2005-01-21 15:47:46 /:&gt;D10.天地弦(185511468)

2005-01-21 15:47:55 A1.笑熬糨糊(2282902)

好,問題來了。

2005-01-21 15:48:03 /:&gt;D10.天地弦(185511468)

[:L]

2005-01-21 15:48:09 /:&gt;D10.天地弦(185511468)

什麼問題

2005-01-21 15:48:27 A1.笑熬糨糊(2282902)

(一)。DLL的Exception你如何處理?

2005-01-21 15:48:53 /:&gt;D10.天地弦(185511468)

你好像講過

2005-01-21 15:49:10 A1.笑熬糨糊(2282902)

你講回給我聽聽

2005-01-21 15:49:31 A1.笑熬糨糊(2282902)

講不好你的課就白聽了。

2005-01-21 15:50:26 /:&gt;D10.天地弦(185511468)

三層中的一些“災難性錯誤”的産生原因

2005-01-21 15:50:27 A1.笑熬糨糊(2282902)

這是比較簡單的問題,下面還有進階的問題。

2005-01-21 15:50:44 /:&gt;D10.天地弦(185511468)

是說災難性錯誤的時候講的

2005-01-21 15:50:57 A3.武稀松(42088303)

估計D10在那裡流汗呢[;P]

2005-01-21 15:51:03 A1.笑熬糨糊(2282902)

算你還有一些記性。

2005-01-21 15:51:05 西門吹風㊣(48542332)

[;P]

2005-01-21 15:51:40 A1.笑熬糨糊(2282902)

好,當時我講的是如何處理的?

2005-01-21 15:52:17 /:&gt;D10.天地弦(185511468)

用try的

2005-01-21 15:52:24 /:&gt;D10.天地弦(185511468)

用踹

2005-01-21 15:52:36 西門吹風㊣(48542332)

[:D]

2005-01-21 15:52:52 A1.笑熬糨糊(2282902)

好,第一題算你過關了。

2005-01-21 15:53:06 /:&gt;D10.天地弦(185511468)

2005-01-21 15:53:06 A1.笑熬糨糊(2282902)

第二題,難度加深一些了。

2005-01-21 15:55:55 A3.武稀松(42088303)

肯定了

2005-01-21 15:55:57 西門吹風㊣(48542332)

有可能

2005-01-21 15:56:17 /:&gt;D10.天地弦(185511468)

死QQ

2005-01-21 15:56:18 A3.武稀松(42088303)

偶徒弟查百渡的能耐更大.差點靠不住她

2005-01-21 15:56:32 /:&gt;D10.天地弦(185511468)

[:L]剛剛QQ死了

2005-01-21 15:56:39 /:&gt;D10.天地弦(185511468)

老大,第二個問題是什麼

2005-01-21 15:56:48 A1.笑熬糨糊(2282902)

暈,白打字了。。。

2005-01-21 15:57:01 /:&gt;D10.天地弦(185511468)

QQ,斷開了,發不出資訊

2005-01-21 15:57:02 D3天之痕若虹(86278566)

2282902(A1.笑熬糨糊) 15:53:42

當Interface中也出現Exception時,如何處理?

2005-01-21 15:57:08 A3.武稀松(42088303)

A1算了,要不讓D10講下去吧

2005-01-21 15:57:37 /:&gt;D10.天地弦(185511468)

當Interface中也出現Exception時,如何處理? 

2005-01-21 15:57:50 /:&gt;D10.天地弦(185511468)

raise錯誤?

2005-01-21 15:57:51 A1.笑熬糨糊(2282902)

第二題答不上的話,第三題就算了。 

2005-01-21 15:57:58 /:&gt;D10.天地弦(185511468)

2005-01-21 15:58:06 /:&gt;D10.天地弦(185511468)

報上級?

2005-01-21 15:58:35 A1.笑熬糨糊(2282902)

不是raise的錯誤是誰的?

2005-01-21 15:58:36 /:&gt;D10.天地弦(185511468)

今天的課算了吧,好像聽的人太少了。

2005-01-21 15:58:49 /:&gt;D10.天地弦(185511468)

2005-01-21 15:59:01   冷俊(76437853)

我在看呢

2005-01-21 15:59:09 B2.TCP INFO(31329846)

[:)]

2005-01-21 15:59:11 A3.武稀松(42088303)

都在聽

2005-01-21 15:59:12 B3.Locet(2212967)

在在````

2005-01-21 15:59:18 D3天之痕若虹(86278566)

[share]

2005-01-21 15:59:20 A3.武稀松(42088303)

不過很多家夥都在潛水

2005-01-21 15:59:23 湖北人(364076660)

[strong]

2005-01-21 15:59:41 D5.笑看風雲(22308456)

7CF483

2005-01-21 15:59:42 /:&gt;D10.天地弦(185511468)

2282902(A1.笑熬糨糊) 15:53:4

當Interface中也出現Exception時,如何處理?==&gt;找到錯誤,踹開錯誤

2005-01-21 16:00:04 一無所有/bei(36581474)

[:P]師徒一問一答

的課比較好聽些

2005-01-21 16:00:06 A1.笑熬糨糊(2282902)

算了,等你講完課再踹你好了。

2005-01-21 16:00:14 /:&gt;D10.天地弦(185511468)

2005-01-21 16:00:16 A3.武稀松(42088303)

這樣就對了

2005-01-21 16:00:25 A3.武稀松(42088303)

D10繼續吧.你師父饒了你了

2005-01-21 16:00:40 /:&gt;D10.天地弦(185511468)

那繼續了

2005-01-21 16:00:42 /:&gt;D10.天地弦(185511468)

呵呵

2005-01-21 16:01:08 /:&gt;D10.天地弦(185511468)

講到哪裡了

2005-01-21 16:01:12 A1.笑熬糨糊(2282902)

不過,得和你說,這三個問題不算理好,你的那個架構就不好用了。

2005-01-21 16:01:14 A3.武稀松(42088303)

2005-01-21 16:01:39 A1.笑熬糨糊(2282902)

處理

2005-01-21 16:01:43 /:&gt;D10.天地弦(185511468)

好,等一下,私底下被你踹幾下

2005-01-21 16:01:48 /:&gt;D10.天地弦(185511468)

2005-01-21 16:01:59 TY(123612838)

[圖檔]

2005-01-21 16:02:10 A3.武稀松(42088303)

[:T]

2005-01-21 16:02:32 A3.武稀松(42088303)

TY不要搗亂,我們這講課呢

2005-01-21 16:02:48 西門吹風㊣(48542332)

有組織,無紀律

2005-01-21 16:03:18 /:&gt;D10.天地弦(185511468)

OK

2005-01-21 16:03:20 /:&gt;D10.天地弦(185511468)

開始

2005-01-21 16:03:37 A3.武稀松(42088303)

好,斷點續傳

2005-01-21 16:03:47 西門吹風㊣(48542332)

---講完沒有講完的課

2005-01-21 16:54:18 A1.笑熬糨糊(2282902)

D10,準備好了嗎?

2005-01-21 16:54:25 /:&gt;D10.天地弦(185511468)

準備好了

2005-01-21 16:54:37 /:&gt;D10.天地弦(185511468)

做好了被踹的準備

2005-01-21 16:54:41 A1.笑熬糨糊(2282902)

好,先回答我第二個問題。

2005-01-21 16:54:42 西門吹風㊣(48542332)

2005-01-21 16:55:16 B1.斜陽(249208513)

呵呵A1還記着呢,挺記仇的噢![:D]

2005-01-21 16:55:21 /:&gt;D10.天地弦(185511468)

如果接口中有異常,怎麼處理

2005-01-21 16:55:23 /:&gt;D10.天地弦(185511468)

2005-01-21 16:55:26 A1.笑熬糨糊(2282902)

對。

2005-01-21 16:55:51 A1.笑熬糨糊(2282902)

應該說如果接口抛出異常,怎麼處理 

2005-01-21 16:55:54 /:&gt;D10.天地弦(185511468)

這個接口中有異常

2005-01-21 16:56:20 /:&gt;D10.天地弦(185511468)

哦,讓接口用一個方法抛出異常

2005-01-21 16:56:21 /:&gt;D10.天地弦(185511468)

2005-01-21 16:56:32 A1.笑熬糨糊(2282902)

也可以這樣說。

2005-01-21 16:57:04 B1.斜陽(249208513)

他要是敢有異常,就把他“腿打折、毛拔淨,翅膀挂在燈管上”[:D]

2005-01-21 16:57:05 /:&gt;D10.天地弦(185511468)

AInts.RaiseError

2005-01-21 16:57:13 /:&gt;D10.天地弦(185511468)

2005-01-21 16:57:18 西門吹風㊣(48542332)

[;-D]

2005-01-21 16:57:38 A1.笑熬糨糊(2282902)

249208513(B1.斜陽) 16:57:04

D10要是敢有異常,就把D10“腿打折、毛拔淨,翅膀挂在燈管上”[:D] 

2005-01-21 16:58:18 /:&gt;D10.天地弦(185511468)

那就在接口裡面定義一個方法,然後在實作的類裡面實作這個方法

raise expcetion.create('出錯了,救命啦?')

2005-01-21 16:58:22 /:&gt;D10.天地弦(185511468)

這樣行不行

2005-01-21 16:58:23 A1.笑熬糨糊(2282902)

D10的方向倒了。

2005-01-21 16:58:26 B1.斜陽(249208513)

不關我的事啊

2005-01-21 16:58:31 /:&gt;D10.天地弦(185511468)

2005-01-21 16:58:38 /:&gt;D10.天地弦(185511468)

這麼多人踹

2005-01-21 16:58:44 A1.笑熬糨糊(2282902)

我是讓你處理異常,不是抛出異常。

2005-01-21 16:59:21 /:&gt;D10.天地弦(185511468)

處理異常,不是用踹的可以了麼

2005-01-21 16:59:45 A1.笑熬糨糊(2282902)

大概你也是想我踹你了。

2005-01-21 17:00:23 /:&gt;D10.天地弦(185511468)

老大,你給我說說

2005-01-21 17:01:02 A1.笑熬糨糊(2282902)

如果是同一個宿主,用Try可能還可以,如果不同宿主,就很麻煩了。

2005-01-21 17:01:24 /:&gt;D10.天地弦(185511468)

同一個宿主

2005-01-21 17:01:39 /:&gt;D10.天地弦(185511468)

是不是說在同一個Application 裡面

2005-01-21 17:01:51 A1.笑熬糨糊(2282902)

同一個application

2005-01-21 17:02:27 /:&gt;D10.天地弦(185511468)

那子產品DLL算不算是同一個Application

2005-01-21 17:02:53 A1.笑熬糨糊(2282902)

如果不是DLL+BPL的話,就不算了。

2005-01-21 17:04:08 /:&gt;D10.天地弦(185511468)

如果是B子產品-&gt;調用A子產品

2005-01-21 17:04:29 /:&gt;D10.天地弦(185511468)

A,B就是你所說的兩個宿主了

2005-01-21 17:05:01 /:&gt;D10.天地弦(185511468)

如果在A裡産生錯誤,B踹就會扭到腳?

2005-01-21 17:05:24 A1.笑熬糨糊(2282902)

2005-01-21 17:05:51 A1.笑熬糨糊(2282902)

如果是普通函數,問題不大

2005-01-21 17:05:55 /:&gt;D10.天地弦(185511468)

那應該怎麼辦呢

2005-01-21 17:06:00 A1.笑熬糨糊(2282902)

如果是接口,問題就大了。

2005-01-21 17:06:09 /:&gt;D10.天地弦(185511468)

2005-01-21 17:06:16 B1.斜陽(249208513)

讓異常能波及的範圍盡量小

2005-01-21 17:06:16 /:&gt;D10.天地弦(185511468)

還沒有試過

2005-01-21 17:06:23 紫風鈴 /mn(512551)

我剛才睡醒

2005-01-21 17:06:27 紫風鈴 /mn(512551)

寫着寫着睡着了

2005-01-21 17:06:34 /:&gt;D10.天地弦(185511468)

在一個宿舍主把它給搞定

2005-01-21 17:06:38 A1.笑熬糨糊(2282902)

常見的是“災難性錯誤”的産生原因

2005-01-21 17:06:44 /:&gt;D10.天地弦(185511468)

2005-01-21 17:07:37 /:&gt;D10.天地弦(185511468)

    result := InnerOperator(OwnId, ActionIndex, Data, Msg);

    result := S_FALSE;

2005-01-21 17:07:49 /:&gt;D10.天地弦(185511468)

老大,這個是一個宿主的入口

2005-01-21 17:08:00 /:&gt;D10.天地弦(185511468)

這個是不是在一個宿主裡解決了

2005-01-21 17:08:27 A1.笑熬糨糊(2282902)

InnerOperator是不是調用接口的?

2005-01-21 17:08:45 /:&gt;D10.天地弦(185511468)

不是

2005-01-21 17:08:50 /:&gt;D10.天地弦(185511468)

是内部一個函數

2005-01-21 17:09:02 /:&gt;D10.天地弦(185511468)

ProcessData是實作的一個接口函數

2005-01-21 17:10:12 /:&gt;D10.天地弦(185511468)

??

2005-01-21 17:10:14 /:&gt;D10.天地弦(185511468)

老大

2005-01-21 17:10:30 A1.笑熬糨糊(2282902)

ProcessData是DLL裡的?

2005-01-21 17:10:40 /:&gt;D10.天地弦(185511468)

2005-01-21 17:12:00 A1.笑熬糨糊(2282902)

那你的異常都已經給截止了,反應不到主程式。

2005-01-21 17:13:14 A1.笑熬糨糊(2282902)

我的意思是EXE知道DLL已經抛出異常了,EXE和DLL要如何處理這個異常。

2005-01-21 17:13:27 /:&gt;D10.天地弦(185511468)

中間層是調用這個函數來處理業務邏輯的

2005-01-21 17:13:48 A3.武稀松(42088303)

出了錯怎麼知道呢

2005-01-21 17:14:35 /:&gt;D10.天地弦(185511468)

傳回S_FALSE

2005-01-21 17:14:38 /:&gt;D10.天地弦(185511468)

呵呆

2005-01-21 17:14:56 /:&gt;D10.天地弦(185511468)

老大,你說應該怎麼樣做

2005-01-21 17:15:13 A1.笑熬糨糊(2282902)

DLL中普通函數的異常并不可怕,怕的是DLL中導出的接口抛出的異常。

2005-01-21 17:15:44 /:&gt;D10.天地弦(185511468)

那樣,是有點可怕,DA8C0A

2005-01-21 17:16:00 B2.TCP INFO(31329846)

目前系統中運作着A,B程式

A.exe 調用 c.dll

B.exe 調用 c.dll

此時c.dll抛出一個異常

A1,是這個意思嗎?

2005-01-21 17:16:34 A1.笑熬糨糊(2282902)

2005-01-21 17:17:51 西門吹風㊣(48542332)

異常結束,再運作[;-D]

2005-01-21 17:18:07 /:&gt;D10.天地弦(185511468)

2005-01-21 17:18:10 A1.笑熬糨糊(2282902)

最嚴重的異常是:

A.exe 調用 B.dll (接口) ,B.dll 調用 c.dll (接口),  結果 c.dll 抛出異常,這時,如果不處理的話,A和

B都會Die

2005-01-21 17:18:53 B1.斜陽(249208513)

c怎麼這麼壞啊[:D]

2005-01-21 17:19:18 B1.斜陽(249208513)

死了還拉一大堆墊背的

2005-01-21 17:19:31 A1.笑熬糨糊(2282902)

[shake]

2005-01-21 17:19:35 /:&gt;D10.天地弦(185511468)

B都會Die ==&gt;我用這種情況

2005-01-21 17:20:30 B2.TCP INFO(31329846)

那就是說 接口調用 最好在實作内部處理異常了

2005-01-21 17:20:40 A1.笑熬糨糊(2282902)

2005-01-21 17:21:18 A1.笑熬糨糊(2282902)

但,有些異常是不得不給回調用它的程式的。

2005-01-21 17:21:39 B2.TCP INFO(31329846)

這個沒試過,回去試試[:)]

2005-01-21 17:22:07 A1.笑熬糨糊(2282902)

别把你的電腦折騰壞了。[:D]

2005-01-21 17:22:16 西門吹風㊣(48542332)

2005-01-21 17:22:58 B2.TCP INFO(31329846)

[:D],"垃圾"電腦沒事

2005-01-21 17:27:52 西門吹風㊣(48542332)

各位觀衆:又到時間講Bye~ Bye ~!

繼續閱讀