主題:<插件式>的中間層架構 第二節
時間: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 /:>D10.天地弦(185511468)
上一堂課主要講了一下,整個架構的運作。
2005-01-21 15:06:38 /:>D10.天地弦(185511468)
整理架構的動力來源都是以用戶端指令來驅動的

2005-01-21 15:08:13 /:>D10.天地弦(185511468)
整個架構的運作是這樣子的
2005-01-21 15:08:48 /:>D10.天地弦(185511468)
上次說到了
2005-01-21 15:09:14 /:>D10.天地弦(185511468)
這一部分,用戶端發送指令到中間層上
2005-01-21 15:09:59 /:>D10.天地弦(185511468)
還有誰記得中間層的任務不
2005-01-21 15:10:39 A3.武稀松(42088303)
子產品管理
2005-01-21 15:10:48 A3.武稀松(42088303)
統一分派指令
2005-01-21 15:11:06 /:>D10.天地弦(185511468)
差不多了
2005-01-21 15:11:17 /:>D10.天地弦(185511468)
我還總結一下
中間層的任務就是
找到對應的子產品接口,接參數傳遞到子產品進行處理
2005-01-21 15:12:57 /:>D10.天地弦(185511468)
找到相應的子產品,使用接口,轉發指令,參數
2005-01-21 15:13:36 /:>D10.天地弦(185511468)
今天主要講中間層架構與子產品通訊這一部分
2005-01-21 15:14:56 /:>D10.天地弦(185511468)
看看子產品是怎麼樣叫子產品來處理資料的
2005-01-21 15:15:19 /:>D10.天地弦(185511468)
上一堂課講了中間層與子產品進行通訊的幾個接口
2005-01-21 15:15:37 /:>D10.天地弦(185511468)
這幾個接口,就是中間層與子產品進行通訊的協定
2005-01-21 15:16:24 /:>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 /:>D10.天地弦(185511468)
主要是通個這個接口來告訴子產品進行處理資料的
2005-01-21 15:17:54 /:>D10.天地弦(185511468)
我現在開始講代碼了。
2005-01-21 15:18:06 /:>D10.天地弦(185511468)
宏觀講完了
2005-01-21 15:18:27 /:>D10.天地弦(185511468)
大家請打開工程
2005-01-21 15:19:23 /:>D10.天地弦(185511468)
打開工程MiddleLayer.bpg
2005-01-21 15:21:58 /:>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 /:>D10.天地弦(185511468)
講到中間層資料子產品的建立這部分代碼
2005-01-21 15:23:11 /:>D10.天地弦(185511468)
提幾個問,活躍一下
2005-01-21 15:23:40 /:>D10.天地弦(185511468)
FThreadID
是做什麼用的
2005-01-21 15:24:01 /:>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 /:>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 /:>D10.天地弦(185511468)
hellfire(149902352) 15:24:16
全局編号 ==>是個編号
2005-01-21 15:25:07 /:>D10.天地弦(185511468)
湖北人(364076660) 15:24:44
使用者連接配接時,系統為其配置設定的ID号==>這個正解
2005-01-21 15:25:35 /:>D10.天地弦(185511468)
initialization
TComponentFactory.Create(ComServer, TMLRDataModule,
Class_MLRDataModule, ciMultiInstance, tmApartment);
2005-01-21 15:26:12 /:>D10.天地弦(185511468)
用這種模式建立遠端資料子產品。每個用戶端連結資料庫都會建立一次
2005-01-21 15:26:13 /:>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 /:>D10.天地弦(185511468)
這樣,為了便于讓架構找到每一個用戶端連結,是以在
這個事件裡,為每個用戶端連編一個号
2005-01-21 15:28:28 /:>D10.天地弦(185511468)
再提第二個問題
2005-01-21 15:28:43 /:>D10.天地弦(185511468)
TFrameworkServices
2005-01-21 15:28:49 /:>D10.天地弦(185511468)
這個類是做什麼的
2005-01-21 15:29:04 西門吹風㊣(48542332)
//架構集接口
2005-01-21 15:29:14 西門吹風㊣(48542332)
IFrameworkServices = interface //架構集接口(通過該接口查得到架構服務接口
2005-01-21 15:29:30 /:>D10.天地弦(185511468)
對,
2005-01-21 15:29:58 A3.武稀松(42088303)
西門吹雪,真不是吹的
2005-01-21 15:30:00 /:>D10.天地弦(185511468)
這個類實作了IFrameworkServices架構集接口
2005-01-21 15:30:24 西門吹風㊣(48542332)
武松,錯了哦,我是吹風
2005-01-21 15:30:27 /:>D10.天地弦(185511468)
是用來管理所有服務的類
2005-01-21 15:30:38 /:>D10.天地弦(185511468)
TFrameworkServices = class(TdkObjectList, IFrameworkServices)
2005-01-21 15:30:55 /:>D10.天地弦(185511468)
2005-01-21 15:31:35 /:>D10.天地弦(185511468)
是為每個用戶端連結建立一個服務
2005-01-21 16:04:01 /:>D10.天地弦(185511468)
再看看,子產品裡如何收到指令進行處理的
2005-01-21 16:04:30 /:>D10.天地弦(185511468)
大家打開一個子產品
2005-01-21 16:04:40 /:>D10.天地弦(185511468)
AccountMgr
2005-01-21 16:05:35 /:>D10.天地弦(185511468)
中間層是通過操作哪個接口方法
2005-01-21 16:05:52 /:>D10.天地弦(185511468)
告訴子產品進行處理的
2005-01-21 16:06:09 B2.TCP INFO(31329846)
這個
2005-01-21 16:06:11 /:>D10.天地弦(185511468)
中間層是通過操作哪個接口方法 告訴子產品進行處理的?
2005-01-21 16:06:18 西門吹風㊣(48542332)
IModelService
2005-01-21 16:06:27 西門吹風㊣(48542332)
ProcessData
2005-01-21 16:07:23 /:>D10.天地弦(185511468)
是能過IModelService.ProcessData告訴子產品處理資料的
2005-01-21 16:08:01 /:>D10.天地弦(185511468)
看看中間層接到用戶端指令做了什麼事
2005-01-21 16:08:10 /:>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 /:>D10.天地弦(185511468)
是這一段了
function TMLRDataModule.ProcessData(ModuleIndex, ActionIndex: Integer;
var Data, Msg: OleVariant): WordBool;
try
2005-01-21 16:09:17 /:>D10.天地弦(185511468)
2005-01-21 16:09:23 /:>D10.天地弦(185511468)
主要是這一句了
2005-01-21 16:09:44 /:>D10.天地弦(185511468)
TFrameworkServices.ItSelf[ID].ModelService[ModuleIndex]是找到對應的子產品提供的接口
2005-01-21 16:09:47 西門吹風㊣(48542332)
沒錯,開始暈了,準備運車藥
2005-01-21 16:09:59 /:>D10.天地弦(185511468)
2005-01-21 16:10:14 /:>D10.天地弦(185511468)
明白吧,上堂課講的
2005-01-21 16:11:24 B2.TCP INFO(31329846)
TFrameworkServices.ItSelf[ID] 取得子產品服務
2005-01-21 16:11:35 /:>D10.天地弦(185511468)
找對應的子產品提供的接口是這樣的流程
TFrameworkServices-->TFrameWorkService->TModels->TModel->IModelService
2005-01-21 16:11:56 /:>D10.天地弦(185511468)
B2.TCP INFO(31329846) 16:11:24
TFrameworkServices.ItSelf[ID] 取得子產品服務 =>對
2005-01-21 16:12:22 乾隆(7891551)
我給忘記了,好可惜啊
2005-01-21 16:12:29 /:>D10.天地弦(185511468)
TFrameworkServices.ItSelf[ID].ModelService[ModuleIndex]這一句就實作了
2005-01-21 16:12:45 B2.TCP INFO(31329846)
有一個完整的UML類圖就好了
2005-01-21 16:13:04 /:>D10.天地弦(185511468)
找接口的任務,忘記了的同志可以跟蹤下源碼。
2005-01-21 16:13:36 /:>D10.天地弦(185511468)
B2.TCP INFO(31329846) 16:12:45
有一個完整的UML類圖就好了 ==》我想畫一個,UML,不熟,畫不出來
2005-01-21 16:14:05 /:>D10.天地弦(185511468)
好了,看看,子產品裡面哪一個類實作了IModelService
2005-01-21 16:14:35 B2.TCP INFO(31329846)
用ModelMaker 拽一個,我看看
2005-01-21 16:14:59 /:>D10.天地弦(185511468)
呵呵,好
2005-01-21 16:15:18 /:>D10.天地弦(185511468)
看看子產品裡面哪一個類實作了IModelService
2005-01-21 16:15:31 西門吹風㊣(48542332)
TModelService
2005-01-21 16:15:34 /:>D10.天地弦(185511468)
大家可以打開子產品,看看,哪一個類實作了
2005-01-21 16:15:41 西門吹風㊣(48542332)
TModelService = class(TdkInterfacedObject, IModelService)
2005-01-21 16:16:05 /:>D10.天地弦(185511468)
[strong]獎勵西門
2005-01-21 16:16:27 /:>D10.天地弦(185511468)
好看看這個類
2005-01-21 16:16:37 /:>D10.天地弦(185511468)
MLIntsBaseImp
2005-01-21 16:16:38 西門吹風㊣(48542332)
unit MLIntsBaseImp;
2005-01-21 16:16:46 /:>D10.天地弦(185511468)
對在這個單元裡面
2005-01-21 16:17:00 /:>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 /:>D10.天地弦(185511468)
這個類
2005-01-21 16:17:19 /:>D10.天地弦(185511468)
function CloseModel(): HResult; stdcall; {IModelService Implement}
2005-01-21 16:17:24 /:>D10.天地弦(185511468)
看這一部分就行了
2005-01-21 16:17:31 /:>D10.天地弦(185511468)
2005-01-21 16:17:59 /:>D10.天地弦(185511468)
var Data, Msg:OleVariant): WordBool;
end;
2005-01-21 16:18:27 西門吹風㊣(48542332)
回到中間層了
2005-01-21 16:19:10 /:>D10.天地弦(185511468)
中間層這樣
result := TFrameworkServices.ItSelf[ID].ModelService[ModuleIndex].ProcessData(Id, ActionIndex,
Data, Msg) = S_OK;
實質上就是執行了TModelService.ProcessData
2005-01-21 16:19:16 /:>D10.天地弦(185511468)
不用回
2005-01-21 16:19:37 /:>D10.天地弦(185511468)
我貼一下中間層接到指令執行的那一段
2005-01-21 16:20:03 /:>D10.天地弦(185511468)
實質上就是執行了子產品裡面TModelService.ProcessData這個函數
2005-01-21 16:20:26 /:>D10.天地弦(185511468)
大家都明白吧
2005-01-21 16:22:12 /:>D10.天地弦(185511468)
TFrameworkServices.ItSelf[ID].ModelService[ModuleIndex]==>是找到接口。
執行接口方法實際上是執行實作該接口類的方法
這應該是比較好了解的
2005-01-21 16:23:05 西門吹風㊣(48542332)
繼續
2005-01-21 16:23:05 /:>D10.天地弦(185511468)
乾隆(7891551) 16:22:07
我來晚了,現在一點都聽不懂了,好着急啊 ==》沒有複習一下。隔得太久了,可能淡忘了
2005-01-21 16:23:25 /:>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 /:>D10.天地弦(185511468)
子產品收到指令後,要執行的函數是哪一個函數
2005-01-21 16:25:01 /:>D10.天地弦(185511468)
子產品收到指令後,要執行的函數是哪一個函數
2005-01-21 16:25:18 西門吹風㊣(48542332)
result := InnerOperator(OwnId, ActionIndex, Data, Msg);
2005-01-21 16:25:39 /:>D10.天地弦(185511468)
InnerOperator(OwnId, ActionIndex, Data, Msg);
2005-01-21 16:25:50 /:>D10.天地弦(185511468)
這個函數
2005-01-21 16:25:54 /:>D10.天地弦(185511468)
看看這個函數
2005-01-21 16:26:03 乾隆(7891551)
好
2005-01-21 16:26:11 /:>D10.天地弦(185511468)
貼出來
2005-01-21 16:26:37 西門吹風㊣(48542332)
function TModelService.InnerOperator(OwnId: Cardinal; ActionIndex: Integer; var Data,
2005-01-21 16:26:48 /:>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 /:>D10.天地弦(185511468)
可以看到這個函數是一個virtual函數
2005-01-21 16:27:15 西門吹風㊣(48542332)
virtual;
2005-01-21 16:27:23 /:>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 /:>D10.天地弦(185511468)
是用來實作多态的東東了,上次測試還考了
2005-01-21 16:28:10 乾隆(7891551)
就是後面可以OVERRIDE
2005-01-21 16:28:22 西門吹風㊣(48542332)
Y~
2005-01-21 16:28:43 /:>D10.天地弦(185511468)
好這裡我們來看看子產品(DLL)是導出的哪一個類來實作IModelService的
2005-01-21 16:29:03 /:>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 /:>D10.天地弦(185511468)
看到上面西門貼的那段,
2005-01-21 16:30:13 /:>D10.天地弦(185511468)
是TSelfService
2005-01-21 16:31:03 /:>D10.天地弦(185511468)
//執行的應該是
TSelfService.ItSelf.ProcessData這個方法
2005-01-21 16:32:28 西門吹風㊣(48542332)
unit MLIntsImp;
2005-01-21 16:32:45 /:>D10.天地弦(185511468)
因為TSelfService.ProcessData就是調用InnerOperator來處理資料,現在看看
TSelfSerive這個類的InnerOperator方法,他重載了TModelService的InnerOperator方法
2005-01-21 16:33:01 /:>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 /:>D10.天地弦(185511468)
function TSelfService.InnerOperator(OwnId: Cardinal; ActionIndex: Integer; var Data,
2005-01-21 16:34:17 /:>D10.天地弦(185511468)
至此,中間層的任務可以告一段落了,接下來的事情應該由子產品看情況進行處理了
2005-01-21 16:35:34 西門吹風㊣(48542332)
2005-01-21 16:36:21 /:>D10.天地弦(185511468)
OK。子產品處理資料後,要傳回給用戶端的資料,包裝好放到Data裡面,有什麼口信放到Msg裡面,準備回航,捎
給用戶端
2005-01-21 16:36:59 /:>D10.天地弦(185511468)
飛機啟航回去了
2005-01-21 16:37:16 /:>D10.天地弦(185511468)
完了,這個中間層架構講完了
2005-01-21 16:37:26 /:>D10.天地弦(185511468)
任務完成了
2005-01-21 16:38:27 乾隆(7891551)
雖然沒聽懂,但知道講的很好。好着急啊
2005-01-21 16:38:34 /:>D10.天地弦(185511468)
估計聽懂的人不多
2005-01-21 16:38:44 乾隆(7891551)
太好了,簡直給我信心
2005-01-21 16:38:48 /:>D10.天地弦(185511468)
因為,忘記上堂課東西了
2005-01-21 16:40:23 /:>D10.天地弦(185511468)
再回憶一下,整個流程
2005-01-21 16:41:01 /:>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 /:>D10.天地弦(185511468)
用戶端向-->伺服器發送指令-->TFrameworkServices.ItSelf[ID].ModelService[ModuleIndex]中間層找到子產品
提供的接口
2005-01-21 16:42:46 西門吹風㊣(48542332)
AccountMgr 帳套管理
2005-01-21 16:42:59 /:>D10.天地弦(185511468)
B2.TCP INFO(31329846) 16:41:52
AccountMgr主要是做什麼的 ==>是一個基本子產品,管理帳套的
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 /:>D10.天地弦(185511468)
是的
2005-01-21 16:43:55 /:>D10.天地弦(185511468)
都是子產品,要擴充功能,就是添加子產品就行了
2005-01-21 16:44:13 乾隆(7891551)
什麼叫帳套啊,這個我都不懂
2005-01-21 16:44:22 /:>D10.天地弦(185511468)
其實整個思路是很簡單的,
2005-01-21 16:45:10 乾隆(7891551)
整個思路再說次,我就學會個這就知足了
2005-01-21 16:45:40 /:>D10.天地弦(185511468)
中間層就是根據用戶端發過來的指令,然後告訴子產品用戶端要你處理這個指令,快點處理好,交給用戶端
2005-01-21 16:46:26 熊科智(65464106)
中間件也是這個意思嗎?
2005-01-21 16:46:40 乾隆(7891551)
是,好簡單。可做起來就複雜了
2005-01-21 16:47:08 /:>D10.天地弦(185511468)
熊科智(65464106) 16:46:26
中間件也是這個意思嗎? ==>是做這種事的
2005-01-21 16:47:21 熊科智(65464106)
哦
2005-01-21 16:47:22 /:>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 /:>D10.天地弦(185511468)
湖北人(364076660) 16:47:32
裡面具體怎麼工作的,[:L] ==》上次講過了
2005-01-21 16:48:10 /:>D10.天地弦(185511468)
D8。飄塵(43745429) 16:47:46
D10你的中間層有機會過來交流一下了==》好啊
2005-01-21 16:48:20 /:>D10.天地弦(185511468)
不知道什麼時候有機會
2005-01-21 16:48:37 /:>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 /:>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 /:>D10.天地弦(185511468)
是由TModel來加載
2005-01-21 16:53:15 /:>D10.天地弦(185511468)
TModels是負責管理已裝入的子產品
2005-01-21 16:53:16 B2.TCP INFO(31329846)
TModel在哪建立的?
2005-01-21 16:53:26 /:>D10.天地弦(185511468)
FModels.Models[i]
2005-01-21 16:53:35 /:>D10.天地弦(185511468)
如果找不到就開始建立
2005-01-21 16:54:02 /:>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 /:>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 /:>D10.天地弦(185511468)
來了
2005-01-21 15:46:44 /:>D10.天地弦(185511468)
好,出一題
2005-01-21 15:46:59 A1.笑熬糨糊(2282902)
D10,我來提問你好了。
2005-01-21 15:47:11 /:>D10.天地弦(185511468)
2005-01-21 15:47:13 /:>D10.天地弦(185511468)
老大來
2005-01-21 15:47:23 A1.笑熬糨糊(2282902)
你用的也是DLL導出接口,對不?
2005-01-21 15:47:46 /:>D10.天地弦(185511468)
2005-01-21 15:47:55 A1.笑熬糨糊(2282902)
好,問題來了。
2005-01-21 15:48:03 /:>D10.天地弦(185511468)
[:L]
2005-01-21 15:48:09 /:>D10.天地弦(185511468)
什麼問題
2005-01-21 15:48:27 A1.笑熬糨糊(2282902)
(一)。DLL的Exception你如何處理?
2005-01-21 15:48:53 /:>D10.天地弦(185511468)
你好像講過
2005-01-21 15:49:10 A1.笑熬糨糊(2282902)
你講回給我聽聽
2005-01-21 15:49:31 A1.笑熬糨糊(2282902)
講不好你的課就白聽了。
2005-01-21 15:50:26 /:>D10.天地弦(185511468)
三層中的一些“災難性錯誤”的産生原因
2005-01-21 15:50:27 A1.笑熬糨糊(2282902)
這是比較簡單的問題,下面還有進階的問題。
2005-01-21 15:50:44 /:>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 /:>D10.天地弦(185511468)
用try的
2005-01-21 15:52:24 /:>D10.天地弦(185511468)
用踹
2005-01-21 15:52:36 西門吹風㊣(48542332)
[:D]
2005-01-21 15:52:52 A1.笑熬糨糊(2282902)
好,第一題算你過關了。
2005-01-21 15:53:06 /:>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 /:>D10.天地弦(185511468)
死QQ
2005-01-21 15:56:18 A3.武稀松(42088303)
偶徒弟查百渡的能耐更大.差點靠不住她
2005-01-21 15:56:32 /:>D10.天地弦(185511468)
[:L]剛剛QQ死了
2005-01-21 15:56:39 /:>D10.天地弦(185511468)
老大,第二個問題是什麼
2005-01-21 15:56:48 A1.笑熬糨糊(2282902)
暈,白打字了。。。
2005-01-21 15:57:01 /:>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 /:>D10.天地弦(185511468)
當Interface中也出現Exception時,如何處理?
2005-01-21 15:57:50 /:>D10.天地弦(185511468)
raise錯誤?
2005-01-21 15:57:51 A1.笑熬糨糊(2282902)
第二題答不上的話,第三題就算了。
2005-01-21 15:57:58 /:>D10.天地弦(185511468)
2005-01-21 15:58:06 /:>D10.天地弦(185511468)
報上級?
2005-01-21 15:58:35 A1.笑熬糨糊(2282902)
不是raise的錯誤是誰的?
2005-01-21 15:58:36 /:>D10.天地弦(185511468)
今天的課算了吧,好像聽的人太少了。
2005-01-21 15:58:49 /:>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 /:>D10.天地弦(185511468)
2282902(A1.笑熬糨糊) 15:53:4
當Interface中也出現Exception時,如何處理?==>找到錯誤,踹開錯誤
2005-01-21 16:00:04 一無所有/bei(36581474)
[:P]師徒一問一答
的課比較好聽些
2005-01-21 16:00:06 A1.笑熬糨糊(2282902)
算了,等你講完課再踹你好了。
2005-01-21 16:00:14 /:>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 /:>D10.天地弦(185511468)
那繼續了
2005-01-21 16:00:42 /:>D10.天地弦(185511468)
呵呵
2005-01-21 16:01:08 /:>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 /:>D10.天地弦(185511468)
好,等一下,私底下被你踹幾下
2005-01-21 16:01:48 /:>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 /:>D10.天地弦(185511468)
OK
2005-01-21 16:03:20 /:>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 /:>D10.天地弦(185511468)
準備好了
2005-01-21 16:54:37 /:>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 /:>D10.天地弦(185511468)
如果接口中有異常,怎麼處理
2005-01-21 16:55:23 /:>D10.天地弦(185511468)
2005-01-21 16:55:26 A1.笑熬糨糊(2282902)
對。
2005-01-21 16:55:51 A1.笑熬糨糊(2282902)
應該說如果接口抛出異常,怎麼處理
2005-01-21 16:55:54 /:>D10.天地弦(185511468)
這個接口中有異常
2005-01-21 16:56:20 /:>D10.天地弦(185511468)
哦,讓接口用一個方法抛出異常
2005-01-21 16:56:21 /:>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 /:>D10.天地弦(185511468)
AInts.RaiseError
2005-01-21 16:57:13 /:>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 /:>D10.天地弦(185511468)
那就在接口裡面定義一個方法,然後在實作的類裡面實作這個方法
raise expcetion.create('出錯了,救命啦?')
2005-01-21 16:58:22 /:>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 /:>D10.天地弦(185511468)
2005-01-21 16:58:38 /:>D10.天地弦(185511468)
這麼多人踹
2005-01-21 16:58:44 A1.笑熬糨糊(2282902)
我是讓你處理異常,不是抛出異常。
2005-01-21 16:59:21 /:>D10.天地弦(185511468)
處理異常,不是用踹的可以了麼
2005-01-21 16:59:45 A1.笑熬糨糊(2282902)
大概你也是想我踹你了。
2005-01-21 17:00:23 /:>D10.天地弦(185511468)
老大,你給我說說
2005-01-21 17:01:02 A1.笑熬糨糊(2282902)
如果是同一個宿主,用Try可能還可以,如果不同宿主,就很麻煩了。
2005-01-21 17:01:24 /:>D10.天地弦(185511468)
同一個宿主
2005-01-21 17:01:39 /:>D10.天地弦(185511468)
是不是說在同一個Application 裡面
2005-01-21 17:01:51 A1.笑熬糨糊(2282902)
同一個application
2005-01-21 17:02:27 /:>D10.天地弦(185511468)
那子產品DLL算不算是同一個Application
2005-01-21 17:02:53 A1.笑熬糨糊(2282902)
如果不是DLL+BPL的話,就不算了。
2005-01-21 17:04:08 /:>D10.天地弦(185511468)
如果是B子產品->調用A子產品
2005-01-21 17:04:29 /:>D10.天地弦(185511468)
A,B就是你所說的兩個宿主了
2005-01-21 17:05:01 /:>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 /:>D10.天地弦(185511468)
那應該怎麼辦呢
2005-01-21 17:06:00 A1.笑熬糨糊(2282902)
如果是接口,問題就大了。
2005-01-21 17:06:09 /:>D10.天地弦(185511468)
2005-01-21 17:06:16 B1.斜陽(249208513)
讓異常能波及的範圍盡量小
2005-01-21 17:06:16 /:>D10.天地弦(185511468)
還沒有試過
2005-01-21 17:06:23 紫風鈴 /mn(512551)
我剛才睡醒
2005-01-21 17:06:27 紫風鈴 /mn(512551)
寫着寫着睡着了
2005-01-21 17:06:34 /:>D10.天地弦(185511468)
在一個宿舍主把它給搞定
2005-01-21 17:06:38 A1.笑熬糨糊(2282902)
常見的是“災難性錯誤”的産生原因
2005-01-21 17:06:44 /:>D10.天地弦(185511468)
2005-01-21 17:07:37 /:>D10.天地弦(185511468)
result := InnerOperator(OwnId, ActionIndex, Data, Msg);
result := S_FALSE;
2005-01-21 17:07:49 /:>D10.天地弦(185511468)
老大,這個是一個宿主的入口
2005-01-21 17:08:00 /:>D10.天地弦(185511468)
這個是不是在一個宿主裡解決了
2005-01-21 17:08:27 A1.笑熬糨糊(2282902)
InnerOperator是不是調用接口的?
2005-01-21 17:08:45 /:>D10.天地弦(185511468)
不是
2005-01-21 17:08:50 /:>D10.天地弦(185511468)
是内部一個函數
2005-01-21 17:09:02 /:>D10.天地弦(185511468)
ProcessData是實作的一個接口函數
2005-01-21 17:10:12 /:>D10.天地弦(185511468)
??
2005-01-21 17:10:14 /:>D10.天地弦(185511468)
老大
2005-01-21 17:10:30 A1.笑熬糨糊(2282902)
ProcessData是DLL裡的?
2005-01-21 17:10:40 /:>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 /:>D10.天地弦(185511468)
中間層是調用這個函數來處理業務邏輯的
2005-01-21 17:13:48 A3.武稀松(42088303)
出了錯怎麼知道呢
2005-01-21 17:14:35 /:>D10.天地弦(185511468)
傳回S_FALSE
2005-01-21 17:14:38 /:>D10.天地弦(185511468)
呵呆
2005-01-21 17:14:56 /:>D10.天地弦(185511468)
老大,你說應該怎麼樣做
2005-01-21 17:15:13 A1.笑熬糨糊(2282902)
DLL中普通函數的異常并不可怕,怕的是DLL中導出的接口抛出的異常。
2005-01-21 17:15:44 /:>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 /:>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 /:>D10.天地弦(185511468)
B都會Die ==>我用這種情況
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 ~!