主题:<插件式>的中间层框架 第二节
时间: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)
整理框架的动力来源都是以客户端命令来驱动的

dkFramework_gif_1.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 ~!

转载于:https://www.cnblogs.com/DKSoft/articles/96244.html

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

  1. 主题:的中间层框架 第一节

    主题:<插件式>的中间层框架 时间:2004-12-31 15:00 主讲:D10.天地弦 2004-12-31 14:56:15 /:>D10.天地弦(185511468) 开始吧 ...

  2. 第二节认识计算机教案,第二章 第二节 局域网的构建 教学设计_博客

    <第二章 第二节 局域网的构建 教学设计_博客>由会员分享,可在线阅读,更多相关<第二章 第二节 局域网的构建 教学设计_博客(3页珍藏版)>请在装配图网上搜索. 1.第二章 ...

  3. 基于Html5的爱情主题网站–表白神器(第二版)

    2019独角兽企业重金招聘Python工程师标准>>> 第二版在第一版的基础上增加了一个动态3D的白云效果背景,鼠标悬浮在页面上云朵会向屏幕Z轴方向运动,在第一人称视角看来向着云朵方 ...

  4. 《如何搭建小微企业风控模型》第二节 建模所需知识

    <如何搭建小微企业风控模型>第二节 建模所需知识 第一章 小微企业数据风控技术的框架 小微企业数据贷发展情况概述 搭建小微企业风控模型所需知识 风控模型概览 第二章 强相关变量:企业经营数 ...

  5. GO语言-第二节-顺序编程

    目录 2.1变量 2.1.1变量声明 2.1.2 变量初始化 2.1.3 变量赋值 2.1.4 匿名变量 2.2 常量 2.2.1 字面常量 2.2.2 常量定义 2.2.3 预定义常量 2.2.4 ...

  6. iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门

    iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门 文章目录 iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门 PDF报表入门 3 ...

  7. 高红梅 第二章 第二节 性别焦虑、两性关系与个人身份认同的困境

    第二节 性别焦虑.两性关系与个人身份认同的困境 女尊男卑的原生家庭结构使得海明威陷入了性别焦虑,这不仅影响了他个人的婚姻爱情生活,而且使得他笔下的男女两性关系呈现出独特的风貌,这无疑也让他难以摆脱其个 ...

  8. 高红梅:第一章 ​​​​​​​第二节 文学创作与自我身份认同问题

    第二节   文学创作与自我身份认同问题 海明威身份意识的产生,不仅受到家庭.美国乃至西方文化氛围的影响,而且还与美国文学思潮以及海明威个人创作风格息息相关. 美国文学思潮与青年作家对自我的探寻 历经1 ...

  9. AOSP>设计>测试(第二节)测试开发工作流

    AOSP>设计>测试 第二节 测试开发工作流 一.概览 测试类型 测试用例准则 二.简单配置 示例 设置 三.复杂配置 目标准备器 测试类 四.插桩测试 概览 主要概念 步骤总结 自插桩测 ...

最新文章

  1. 超全!深度学习在计算机视觉领域的应用一览
  2. NLP工程师平均月薪3W起,如何从文本情感分析入坑NLP?
  3. 我是架构师--设计模式-单例模式
  4. python基础知识整理-整理了27个新手必学的Python基础知识点
  5. memcache和memcached的区别
  6. STM32开发 -- WIFI那些事儿(一)
  7. Java 操纵XML之修改XML文件
  8. Lucene入门程序
  9. 世界上最漂亮的写作工具Typora(创作者必备软件)
  10. Python 2.x vs Python 3.x(四)—— TypeError: unhashable type
  11. EEPlat的元数据驱动的运行引擎
  12. 浏览器工作原理--浏览器中的页面循环系统
  13. 基于Kears的Reuters新闻分类
  14. 软件测试之蚂蚁金服面试题,含答案
  15. NetBeans的下载与安装
  16. CheckBox 如何改变背景色和选中时的背景颜色
  17. java 查找英语单词相似度,用于单词匹配,法1
  18. 如何提取复杂多引脚芯片的引脚编号及引脚名称
  19. 如何在IntelliJ IDEA中添加JDK?
  20. 删除一个字符串中指定位置上的字符

热门文章

  1. 计算机网络应用答题卡,2020年计算机软件水平考试答题卡填涂技巧
  2. linux下使用UDP发送接收数据
  3. 如何将phpMyAdmin设置为禁止外网
  4. 关于弹塑性DP模型参数设置的一点体会
  5. postgresql 吕宏庆_南阳义工吕宏庆荣登“好人365”封面人物
  6. VB.net中文字符串转拼音
  7. QT选择颜色的调色板功能
  8. EPLMN in attach accept NAS signaling
  9. 2. android 直接使用hal库播放pcm demo
  10. idea类名为红色的解决办法