主题:的中间层框架 第二节 |DLL的Exception你如何处理?|不同宿主内如果接口抛出异常,怎么处理

简介: 主题:的中间层框架 第二节 时间:2005-01-21 15:00 主讲:D10.天地弦 A1.老大 (一).DLL的Exception你如何处理? (二).不同宿主内如果接口抛出异常,怎么处理  2005-01-21 15:03:07 /:>D10.

主题:<插件式>的中间层框架 第二节
时间: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)
http://www.cnblogs.com/dksoft/articles/85708.html
上一堂课的笔记

2005-01-21 15:06:01 /:>D10.天地弦(185511468)
上一堂课主要讲了一下,整个框架的运作。

2005-01-21 15:06:38 /:>D10.天地弦(185511468)
整理框架的动力来源都是以客户端命令来驱动的

img_ba8427c094af84a65520124802f318ab.gif
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)
这样,为了便于让框架找到每一个客户端连结,所以在
procedure TMLRDataModule.RemoteDataModuleCreate(Sender: TObject);
这个事件里,为每个客户端连编一个号

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)
  FService := TFrameworkService.Create(FModels, ID); //创建当前service;

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)
  IModelService = interface //模块操作接口
这个

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;    //
  end;

2005-01-21 16:08:49 /:>D10.天地弦(185511468)
是这一段了

2005-01-21 16:08:49 /:>D10.天地弦(185511468)
function TMLRDataModule.ProcessData(ModuleIndex, ActionIndex: Integer;
  var Data, Msg: OleVariant): WordBool;
begin
  try
    result := TFrameworkServices.ItSelf[ID].ModelService[ModuleIndex].ProcessData(Id,

ActionIndex, Data, Msg) = S_OK;
    result := true;
  except
    result := false;    //
  end;
end;

2005-01-21 16:09:17 /:>D10.天地弦(185511468)
    result := TFrameworkServices.ItSelf[ID].ModelService[ModuleIndex].ProcessData(Id,

ActionIndex, Data, Msg) = S_OK;

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)
TFrameworkServices.ItSelf[ID].ModelService[ModuleIndex]是找到对应的模块提供的接口

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]这一句就实现了
TFrameworkServices-->TFrameWorkService->TModels->TModel->IModelService

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}
    function ProcessData(OwnId: Cardinal; ActionIndex: Integer; var Data, Msg: OleVariant):

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

  public
    class function ItSelf: TModelService; virtual;
    property FrameworkServices: IFrameworkServices read FFrameworkServices write

FFrameworkServices;
  end;
 
2005-01-21 16:17:09 /:>D10.天地弦(185511468)
这个类

2005-01-21 16:17:19 /:>D10.天地弦(185511468)
    {IModelService Implement}
    function ProcessData(OwnId: Cardinal; ActionIndex: Integer; var Data, Msg: OleVariant):

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

2005-01-21 16:17:24 /:>D10.天地弦(185511468)
看这一部分就行了

2005-01-21 16:17:31 /:>D10.天地弦(185511468)
    function ProcessData(OwnId: Cardinal; ActionIndex: Integer; var Data, Msg: OleVariant):

HResult; stdcall;

2005-01-21 16:17:59 /:>D10.天地弦(185511468)
function TMLRDataModule.ProcessData(ModuleIndex, ActionIndex: Integer;
  var Data, Msg:OleVariant): WordBool;
begin
  try
    result := TFrameworkServices.ItSelf[ID].ModelService[ModuleIndex].ProcessData(Id,

ActionIndex, Data, Msg) = S_OK;
    result := true;
  except
    result := false;    //
  end;
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;
begin
  result := InnerOperator(OwnId, ActionIndex, Data, Msg);
end;

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,
  Msg: OleVariant): HResult;
begin
end;

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):

HResult; virtual;

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;
begin
  AModelService := TSelfService.ItSelf;
  result := IModelService(AModelService);
end;

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)
    result := TFrameworkServices.ItSelf[ID].ModelService[ModuleIndex].ProcessData(Id,

ActionIndex, Data, Msg) = S_OK;
//执行的应该是
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)
var
  FParams: tdkHashTools;
begin
  SeparateDataAndParams(FParams, Data);
  case ActionIndex of
    aiAccountMgr:
      begin
        result := AccountMgr(OwnId, FParams, Data, Msg);
      end;
    aiTest:
      begin
        result := Test(Data); //
      end;
    aiGetTestData: result := GetTestData(Data);
    aiSetTestData: result := SetTestData(Data);
  else    //子类没有处理,则交由父类进行处理
    Result := inherited InnerOperator(OwnId, ActionIndex, Data, Msg);
  end;
  FParams.Free;

2005-01-21 16:33:06 /:>D10.天地弦(185511468)
function TSelfService.InnerOperator(OwnId: Cardinal; ActionIndex: Integer; var Data,
  Msg: OleVariant): HResult;
var
  FParams: tdkHashTools;
begin
  SeparateDataAndParams(FParams, Data);
  case ActionIndex of
    aiAccountMgr:
      begin
        result := AccountMgr(OwnId, FParams, Data, Msg);
      end;
    aiTest:
      begin
        result := Test(Data); //
      end;
    aiGetTestData: result := GetTestData(Data);
    aiSetTestData: result := SetTestData(Data);
  else    //子类没有处理,则交由父类进行处理
    Result := inherited InnerOperator(OwnId, ActionIndex, Data, Msg);
  end;
  FParams.Free;
end;

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
可否讲一下  TUsers.Users.Add(CurrentUser); //添加至用户列表
里面具体怎么工作的,[: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;
var
  i: integer;
  TmpModel: TModel;
begin
  result := nil;
  for i := 0 to Count - 1 do
  begin
    if TModel(Items[i]).ModelIndex = index then
    begin
      result := TModel(Items[i]);
      break;
    end;
  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)
[:L]

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)
2282902(A1.笑熬糨糊) 15:53:42
当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)
raise错误?

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)
[:L]

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)
[:L]

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)
[:L]

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

2005-01-21 16:01:43 /:>D10.天地弦(185511468)
好,等一下,私底下被你踹几下

2005-01-21 16:01:48 /:>D10.天地弦(185511468)
[:D]

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)
[:D]

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)
[:L]

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)
[:L]

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)
[:L]

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)
[:L]

2005-01-21 17:07:37 /:>D10.天地弦(185511468)
function TModelService.ProcessData(OwnId: Cardinal; ActionIndex: Integer; var Data,
  Msg: OleVariant): HResult;
begin
  try
    result := InnerOperator(OwnId, ActionIndex, Data, Msg);
  except
    result := S_FALSE;
  end;
end;

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)
[:L]

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)
A.exe 调用 B.dll (接口) ,B.dll 调用 c.dll (接口),  结果 c.dll 抛出异常,这时,如果不处理的话,A和

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)
[;P]

2005-01-21 17:22:58 B2.TCP INFO(31329846)
[:D],"垃圾"电脑没事

2005-01-21 17:27:52 西门吹风㊣(48542332)
各位观众:又到时间讲Bye~ Bye ~!

目录
相关文章
|
7月前
|
Web App开发 前端开发 JavaScript
如何根据 SAP UI5 框架代码抛出的错误消息,反查出是哪一行代码引起的错误消息试读版
如何根据 SAP UI5 框架代码抛出的错误消息,反查出是哪一行代码引起的错误消息试读版
32 0
|
Java 编译器 程序员
Java异常处理(1)--异常概述与异常体系结构
Java异常处理(1)--异常概述与异常体系结构
81 1
Java异常处理(1)--异常概述与异常体系结构
NestJS 7.x 折腾记: (6) 异常过滤器,取其精华去其糟粕!比如响应异常数据的包装~
正如官方所说: 内置的异常层负责处理整个应用程序中的所有抛出的异常。 当捕获到未处理的异常时,最终用户将收到友好的响应。
391 0
C#(二十六)之C#异常
异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理时建立在四个关键词之上的:try、catch、finally 和 throw。
99 0
C#(二十六)之C#异常
|
安全 C++ Windows
C++调用外部应用程序的方法的整理总结(常用)
一、三个SDK函数:  WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。
2790 0

热门文章

最新文章