精华内容
下载资源
问答
  • 服务程序Delphi XE8开发的httpserver服务器程序,为线上订货系统提供ERP系统库存检查服务。
  • Delphi开发Windows服务程序教程 开发步骤: 1、New->Other->Service Application 2、现在一个服务程序的框架已经搭起来了,打开Service1窗口,有几个属性说明一下: AllowPause:是否允许暂停 AllowStop: 是否...

    Delphi开发Windows服务程序教程

    开发步骤:
    1、New->Other->Service Application
    2、现在一个服务程序的框架已经搭起来了,打开Service1窗口,有几个属性说明一下:
    AllowPause:是否允许暂停
    AllowStop: 是否允许停止
    Dependencies: 设置服务的依存关系,服务的启动是否依赖于某个服务或者组
    DisplayName: 在“服务”窗口显示的名称
    Interactive: 设置为true时可以和Windows桌面进行交互,如果我们想在服务里显示窗体的话此设置就要设置为true,另外ServiceType必须为stWin32
    Password: 密码
    StartType: 启动方式
    3、如果我们想让服务与窗体交互,步骤如下:
    在工程中新建一个窗体fmMain
    然后在Service1的OnStart中写代码
    procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
    begin
    Started := True;
    Svcmgr.Application.CreateForm(TFmMain, fmMain);
    FmMain.show;
    end;

    OnStop的代码
    procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
    begin
    Stopped := True;
    FmMain.Free;
    end;
    这样在服务启动的时候就会显示出新建的那个窗体
    4、编译完成后,我们可以安装服务了,安装方法为:
    在cmd窗口中执行 appname /install,
    如F:\Book\DService\Project1.exe /install
    这样服务就安装完成了
    5、同样,删除时也是在cmd窗口输入命令 appname /uninstall
    如F:\Book\DService\Project1.exe /uninstall

     

    关于其他:
    1、关于服务程序的调试
    如果我们开发的服务有多个窗体,程序的调试无疑是个大问题
    其实服务程序稍微一改就能改成一个标准的Win32工程,为了防止不停的变来变去,我们可以加上一个编译条件,通过编译条件来切换生成服务程序还是普通可执行程序,假设编译条件为 NormalApp,在以下几个地方需要加入编译条件
    工程文件中,单元的引用
    {$IFDEF NormalApp}
    Forms,
    {$ELSE}
    SvcMgr,
    {$ENDIF}

    工程初始化
    {$IFDEF NormalApp}
    Application.Initialize;
    Application.CreateForm(TFmMain, FmMain);
    Application.Run;
    {$ELSE}
    if not Application.DelayInitialize or Application.Installing then
    Application.Initialize;
    Application.CreateForm(TService1, Service1);
    Application.Run;
    {$ENDIF}
    这样我们就可以通过增加/删除NormalApp的编译条件来切换服务程序和普通窗口程序了

    展开全文
  • Delphi开发Windows服务程序教程<一> 开发步骤: 1、New->Other->Service Application 2、现在一个服务程序的框架已经搭起来了,打开Service1窗口,有几个属性说明一下: AllowPause:是否允许暂停 AllowS...

    Delphi开发Windows服务程序教程<一>

    开发步骤:
    1、New->Other->Service Application
    2、现在一个服务程序的框架已经搭起来了,打开Service1窗口,有几个属性说明一下:
    AllowPause:是否允许暂停
    AllowStop: 是否允许停止
    Dependencies: 设置服务的依存关系,服务的启动是否依赖于某个服务或者组
    DisplayName: 在“服务”窗口显示的名称
    Interactive: 设置为true时可以和Windows桌面进行交互,如果我们想在服务里显示窗体的话此设置就要设置为true,另外ServiceType必须为stWin32
    Password: 密码
    StartType: 启动方式
    3、如果我们想让服务与窗体交互,步骤如下:
    在工程中新建一个窗体fmMain
    然后在Service1的OnStart中写代码
    procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
    begin
    Started := True;
    Svcmgr.Application.CreateForm(TFmMain, fmMain);
    FmMain.show;
    end;

    OnStop的代码
    procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
    begin
    Stopped := True;
    FmMain.Free;
    end;
    这样在服务启动的时候就会显示出新建的那个窗体
    4、编译完成后,我们可以安装服务了,安装方法为:
    在cmd窗口中执行 appname /install,
    如F:\Book\DService\Project1.exe /install
    这样服务就安装完成了
    5、同样,删除时也是在cmd窗口输入命令 appname /uninstall
    如F:\Book\DService\Project1.exe /uninstall

     

    关于其他:
    1、关于服务程序的调试
    如果我们开发的服务有多个窗体,程序的调试无疑是个大问题
    其实服务程序稍微一改就能改成一个标准的Win32工程,为了防止不停的变来变去,我们可以加上一个编译条件,通过编译条件来切换生成服务程序还是普通可执行程序,假设编译条件为 NormalApp,在以下几个地方需要加入编译条件
    工程文件中,单元的引用
    {$IFDEF NormalApp}
    Forms,
    {$ELSE}
    SvcMgr,
    {$ENDIF}

    工程初始化
    {$IFDEF NormalApp}
    Application.Initialize;
    Application.CreateForm(TFmMain, FmMain);
    Application.Run;
    {$ELSE}
    if not Application.DelayInitialize or Application.Installing then
    Application.Initialize;
    Application.CreateForm(TService1, Service1);
    Application.Run;
    {$ENDIF}
    这样我们就可以通过增加/删除NormalApp的编译条件来切换服务程序和普通窗口程序了

    展开全文
  • delphi开发服务实例,功能:用于监控另一个应用程序是否被关闭,如果关闭,马上开启 配置方便,很实用
  • Delphi XE程序设计系列 2-开发DataSnap/REST服务器

    在上次的文章中讨论了如何把传统的Delphi 主从架构应用程序逐渐转换为DataSnap JSON服务器,在本篇文章中让我们正式讨论如何使用Delphi XE开发DataSnap/REST服务器,由于这其中牵涉到非常多的技术,因此我们将花数篇的篇幅来讨论。现在就让我们从DataSnap/REST服务器开始。

    开发DataSnap服务器

        Delphi XE版的DataSnap允许开发人员同时在DataSnap服务器中实作RESTful架构的服务器,如此一来DataSnap服务器不但可以在网络内 部做为多层的服务服务器,也可以让网络外部的客户端使用REST的方式来存取服务。 要在Delphi XE中建立DataSnap/REST服务器,请点选Files|New菜单,在DataSnap Server选项中选择DataSnap Server图像,如下图所示:

     

     

     

        Delphi XE提供三种不同的服务器型态,分别是以VCL应用程序实作的服务器,实作为主控程序的服务器以及实作成Windows服务应用程序的服务器,开发人员可根据自己的需求选择建立适当的服务器型态,在本篇文章中让我们建立VCL应用程序型态的服务器:

     

     

        点选Next按钮之后DataSnap精灵会如下图询问需要支持的通讯协议,是否使用安全验证功能以及是否要预先建立范例服务方法,让我们点选下方的Select All以选择建立所有的功能,如下图所示:

     

     

     

     

     

     

        点选Next按钮,DataSnap精灵会如下图询问TCP/IPHTTP使用的通信埠,内定上TCP/IP使用211HTTP则使用 8080,开发人员可根据自己的需求设定这两个通信埠,或是点选Find Open Port按钮让DataSnap精灵帮忙搜寻可使用的通信埠:

     

     

     

        接着DataSnap精灵会询问开发人员实作服务方法的类别,开发人员可以选择实作于TComponent类别,TDataModule类别或是TDSServerModule类别,在本文章中我们选择实作于TDSServerModule:

     

     

        点选Finish按钮之后,Delphi XE便会建立相对应的项目,我们开启ServerContainerUnit的话就可以看到其中包含了如下组件,其中的 TDSServerTDSTCPServerTransport以及TDSServerClass类别组件在Delphi 2010中就存在了,新的TDSHTTPService类别组件则提供了HTTP/HTTPS通讯协议的支持,而新的 TDSAuthenticationManager类别组件则提供安全验证功能,在稍后的文章中我们会说明如何使用它。

     

     

     

     

     

        现在DataSnap精灵会在项目的ServerMethodsUnit程序单元中产生两个范例方法,EchoStringReverseString。现在让我们在这个程序单元中加入一个新的服务方法『取得部落格文章名称』,如下所示:

    public

    { Public declarations }

    function EchoString(Value: string): string;

    function ReverseString(Value: string): string;

    function 取得部落格文章名称 : TJSONArray;

     

    接着实作『取得部落格文章名称』方法,如下所示:

    function TServerMethods2.取得部落格文章名称: TJSONArray;

    begin

    Result := TJSONArray.Create;

    Result.AddElement(TJSONString.Create(‘Delphi XE程序设计系列 1-主从架构, 多层到JSONREST’));

    Result.AddElement(TJSONString.Create(‘从原生APIREST API – 使用C++Builder XE开发REST应用程序’));

    Result.AddElement(TJSONString.Create(‘Delphi XE程序设计系列 2-DataSnap/REST服务器’));

    end;

     

        『取得部落格文章名称』方法建立TJSONArray对象,并且把三篇文章名称以TJSONString对象储存在元素中,最后回传TJSONArray对象给客户端。

     

        最后开启ServerMethodsUnit程序单元的设计接口,在其中放入dbExpress组件以存取储存在MS SQL Server数据库中的范例数据表FishFacts,稍后我们将说明这个DataSnap/REST服务器如何同时以传统DataSnap的架构让用户端使用dbExpress组件存取数据,以及如何以REST的架构让客户端存取它提供的服务。

     

     

     

     

        现在编译并且执行这个DataSnap/REST服务器。

        由于现在这个服务器同时可提供DataSnapREST服务器的功能,因此现在我们可以试着使用浏览器来使用存取这个服务器的服务。让我们使用下面的URI来呼叫『取得部落格文章名称』方法:

    http://localhost:8085/datasnap/rest/TServerMethods2/取得部落格文章名称

     

        我们可以在下图中看到,我们果然可以在浏览器中使用上面的URI成功的呼叫服务器的服务:

     

     

     

     

        而且我们从上图中可以清楚的看到回传的结果是使用JSON格式封装的JSON数组,每一个数组元素是Unicode编码的JSON字符串

    连结使用DataSnap服务器

        现在让我们建立一个客户端VCL应用程序项目,放入TSQLConnection组件,然后设定它的特性值如下(此时DataSnap/REST服务器必须是在执行状态):

     

    特性

    特性值

    Driver

    Datasnap

    Connected

    True

     

     

        点选鼠标右键,选择建立『Generate DataSnap Client Classes』菜单,如下所示,再把产生的程序单元储存为ServerProxy程序单元。

     

     

     

     

    然后在主窗体中放入如下的dbExpressVCL组件:

     

     

     

     

    设定TDSProviderConnection组件的特性值如下:

     

    特性

    特性值

    SQLConnection

    SQLConnection1

    ServerClassName

    TServerMethods2

     

    再设定TClientDataSet的特性值如下:

    特性

    特性值

    RemoteServer

    DSProviderConnection1

    Provider

    dspFishFacts

     

     

        当我们在设定TClientDataSetProvider特性值时,客户端应用程序就会连结到DataSnap/REST服务器并且显示ServerMethodsUnit程序单元中输出的TDataSetProvider组件。

     

        让我们在『更新』按钮的OnClick事件处理函式中撰写如下的程序代码:

    procedure TForm10.Button3Click(Sender: TObject);

    begin

    if (cdsFishFacts.ChangeCount > 0) then

    cdsFishFacts.ApplyUpdates(0);

    end;

     

     

         编译并且执行客户端应用程序,我们就可以看到类似如下的画面:

     

     

     

     

        DataSnap/REST服务器就如同以前的DataSnap/Midas服务器一样可以提供二层和多层的开发架构,客户端应用程序也可以使用dbExpress组件来异动DataSnap/REST服务器中的数据。

    现在我们已经展示了这个DataSnap/REST服务器可以同时使用二层/多层和REST的架构来使用它。

    现在再让我们看看如何在客户端使用程序代码来存取服务器的服务。在前面我们已经藉由TSQLConnection组件自动产生了ServerProxy程序单元,如果我们开启ServerProxy,便会看到下面的类别宣告:

     

    TServerMethods2Client = class(TDSAdminClient)

    private

    FEchoStringCommand: TDBXCommand;

    FReverseStringCommand: TDBXCommand;

    F取得部落格文章名称Command: TDBXCommand;

    public

    constructor Create(ADBXConnection: TDBXConnection); overload;

    constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload;

    destructor Destroy; override;

    function EchoString(Value: string): string;

    function ReverseString(Value: string): string;

    function 取得部落格文章名称: TJSONArray;

    end;

     

    如果我们观察ServerProxy程序单元中的『取得部落格文章名称』方法,就可以看到它也使用dbExpress技术来存取服务器的服务:

    function TServerMethods2Client.取得部落格文章名称: TJSONArray;

    begin

    if F取得部落格文章名称Command = nil then

    begin

    F取得部落格文章名称Command := FDBXConnection.CreateCommand;

    F取得部落格文章名称Command.CommandType := TDBXCommandTypes.DSServerMethod;

    F取得部落格文章名称Command.Text := ‘TServerMethods2.取得部落格文章名称’;

    F取得部落格文章名称Command.Prepare;

    end;

    F取得部落格文章名称Command.ExecuteUpdate;

    Result := TJSONArray(F取得部落格文章名称Command.Parameters[0].Value.GetJSONValue(FInstanceOwner));

    end;

     

    因此在客户端,我们可以使用下面的程序代码藉由ServerProxy程序单元中的『取得部落格文章名称』方法来取得部落格文章信息:

     

    procedure TForm10.Button1Click(Sender: TObject);

    var

    aServer: TServerMethods2Client;

    ja : TJSONArray;

    iIndex: Integer;

    begin

    aServer := TServerMethods2Client.Create(Self.SQLConnection1.DBXConnection);

    try

    ja := aServer.取得部落格文章名称;

    for iIndex := 0 to ja.Size – 1 do

    ListBox1.Items.Add(ja.Get(iIndex).ToString);

    finally

    aServer.Free;

    end;

    end;

     

        下图是客户端应用程序执行上面程序代码的结果:

     

     

     

        但是除了dbExpress技术之外,我们也可以使用RESTJavaScript等技术来存取服务器服务,因为这个服务器就是一个REST服务器。因此让我们更深入的讨论一下如何在客户端自动产生程序代码来支持RESTJavaScript等技术。

    客户端程序代码产生器

        DataSnap XE版目前可自动产生四种客户端程序代码让不同的客户端能够连结和使用DataSnap/REST服务器,这四种是:

    DataSnap XE支持的四种客户端程序代码

    说明

    Delphi DBX

    使用dbExpress技术呼叫DataSnap/REST服务器的客户端Delphi程序代码

    C++Builder DBX

    使用dbExpress技术呼叫DataSnap/REST服务器的客户端C/C++程序代码

    Java Script REST

    使用REST/JSON技术呼叫DataSnap/REST服务器的客户端JavaScript程序代码

    Delphi REST

    使用REST/JSON技术呼叫DataSnap/REST服务器的客户端Delphi程序代码

     

     

     

     

        我们可以轻易的使用下面的程序代码来取得目前能够产生的客户端程序代码:

     

     

    procedure TForm10.ListRegisteredWriter;

     

    var

    sa : TDBXStringArray;

    iIndex : Integer;

    begin

    sa := DSProxyWriter.TDSProxyWriterFactory.RegisteredWritersList;

    for iIndex := 0 to Length(sa) – 1 do

    ComboBox1.Items.Add(sa[iIndex]);

    ComboBox1.ItemIndex := 0;

    end;

     

     

        DSProxyWriter程序单元中 TDSProxyWriterFactory类别的类别方法RegisteredWritersList可以回传目前注册的客户端程序代码种类,目前上表列出的四种客户端程序代码产生器分别位于DSProxyDelphiDSProxyCpp DSProxyJavaScriptDSProxyDelphiRest程序单元中。

     

     

     

        当我们要产生上表四种客户端程序代码以呼叫特定的DataSnap/REST服务器时,我们需要使用IDSProxyMetaDataLoader接口以及TDSProxyGenerator类别。

        IDSProxyMetaDataLoader接口是由TDSProxyMetaDataLoader类别实作的,我们可以使用 TDBXConnection对象建立TDSProxyMetaDataLoader对象,取得它的IDSProxyMetaDataLoader接口, 再建立TDSProxyGenerator对象,设定要产生的特定客户端程序代码目标,最后呼叫TDSProxyGenerator对象的Write方法, 如此一来DataSnap框架就会自动产生连结特定DataSnap/REST服务器的客户端程序代码。

        例如,现在让我们来看看如何能够要求DataSnap框架自动产生Delphi REST或是JavaScript的客户端程序代码。

     

        下面的程序代码首先呼叫GetMetaDataLoader方法取得IDSProxyMetaDataLoader接口,再呼叫GenerateFile藉由IDSProxyMetaDataLoader接口产生使用者特定的客户端程序代码:

    procedure TForm10.Button2Click(Sender: TObject);

    var

    LMetaDataLoader: IDSProxyMetaDataLoader;

    begin

    LMetaDataLoader := GetMetaDataLoader;

    GenerateFile(LMetaDataLoader);

    ShowGeneratedFiles;

    end;

     

        GetMetaDataLoader方法藉由程序中的 TSQLConnectionTDBXConnection对象建立TDSProxyMetaDataLoader对象,再回传 TDSProxyMetaDataLoader对象实作的IDSProxyMetaDataLoader接口:

     

     

    function TForm10.GetMetaDataLoader : IDSProxyMetaDataLoader;

    begin

    Result := TDSProxyMetaDataLoader.Create(

    function: TDBXConnection

    begin

    OpenConnection;

    Result := SQLConnection1.DBXConnection;

    end,

    procedure(AConnection: TDBXConnection)

    begin

    SQLConnection1.Close;

    end

    );

    end;

     

     

        而GenerateFile方法先建立 TDSProxyGenerator对象,设定它的Writer特性值为稍后使用者在程序中设定的特定的客户端程序代码的名称,例如是『Delphi DBX』产生使用dbExpress技术的客户端程序代码,或是『Java Script REST』产生使用REST/JSONJavaScript程序代码,最后呼叫Write方法实际的产生客户端程序代码:

     

     

    procedure TForm10.GenerateFile(AMetaDataLoader: IDSProxyMetaDataLoader);

    var

    LProxyGenerator: TDSProxyGenerator;

    begin

    LProxyGenerator := TDSProxyGenerator.Create(nil);

    try

    LProxyGenerator.Writer := ComboBox1.Text;

    LProxyGenerator.TargetUnitName := ‘GeneratedServerProxy’;

    LProxyGenerator.ExcludeMethods := ;

    LProxyGenerator.ExcludeClasses := ;

    LProxyGenerator.TargetDirectory := ‘.’;

    LProxyGenerator.OnCreatingFiles := ACreatingFiles;

    LProxyGenerator.OnCreatedFiles := ACreatedFiles;

    LProxyGenerator.Write(AMetaDataLoader);

    finally

    LProxyGenerator.Free;

    end;

    end;

     

     

        现在如果我们执行客户端应用程序,可以看到如下的画面,在下面中我选择产生Delphi REST的客户端程序代码:

     

     

     

     

        那么这个范例客户端应用程序便会自动产生使用REST的客户端Delphi程序代码,例如它产生的呼叫范例DataSnap/REST服务器的『取得部落格文章名称』方法的程序代码如下:

     

    function TServerMethods2Client.取得部落格文章名称(const ARequestFilter: string): TJSONArray;

    begin

    if F取得部落格文章名称Command = nil then

    begin

    F取得部落格文章名称Command := FConnection.CreateCommand;

    F取得部落格文章名称Command.RequestType := ‘GET’;

    F取得部落格文章名称Command.Text := ‘TServerMethods2.取得部落格文章名称’;

    F取得部落格文章名称Command.Prepare(TServerMethods2_取得部落格文章名称);

    end;

    F取得部落格文章名称Command.Execute(ARequestFilter);

    Result := TJSONArray(F取得部落格文章名称Command.Parameters[0].Value.GetJSONValue(FInstanceOwner));

    end;

     

     

        看到现在它是使用HTTPGet命令,藉由REST呼叫惯例来呼叫DataSnap/REST服务器的『取得部落格文章名称』方法了。

     

        如果我是选择产生Java Script REST

     

     

     

     

        那么下面就是DataSnap框架自动产生的客户端JavaScript程序代码:

    /*

    * @return result – Type on server: TJSONArray

    */

    this.取得部落格文章名称 = function() {

    var returnObject = this.executor.executeMethod(‘取得部落格文章名称’, GET, [], arguments[0], true, arguments[1], arguments[2]);

    if (arguments[0] == null) {

    if (returnObject != null && returnObject.result != null && isArray(returnObject.result)) {

    var resultArray = returnObject.result;

    var resultObject = new Object();

    resultObject.result = resultArray[0];

    if (returnObject.cacheId != null && returnObject.cmdIndex != null) {

    resultObject._cacheId = returnObject.cacheId;

    resultObject._cmdIndex = returnObject.cmdIndex;

    }

    return resultObject;

    }

    return returnObject;

    }

    };

    this.取得部落格文章名称_URL = function() {

    return this.executor.getMethodURL(『取得部落格文章名称』, GET, [], arguments[0])[0];

    };

    }

    var JSProxyClassList = {

    TServerMethods2″: ["DSServerModuleCreate","DSServerModuleDestroy","EchoString","ReverseString","取得部落格文章名称"]

    };

     

     

     

     

        最后我试着同时使用Delphi客户端应用程序以及浏览器两个不同的客户端来呼叫和使用范例DataSnap/REST服务器,看起来一切都非常的美好:

     

     

     

     

     

        当然,我也可以使用纯粹的Web客户端应用程序来呼叫和使用范例DataSnap/REST服务器,例如下图就是我使用VCL For Web XI来使用范例DataSnap/REST服务器的结果,所有的服务仍然工作良好:

     

     

     

     

     

     

     

        DataSnap XE版藉由扩充多层架构到RESTJSON的技术领域,让DataSnap XE瞬间突破了平台的限制,允许DelphiC/C++BuilderJavaScriptPHPRuby和移动设备等各种客户端能够使用它的服 务,再次赋予了DataSnap框架无限的发展潜能。

    好了,时间已晚,我们也下次再见了。

     

    展开全文
  • 第 1 章:介绍 Delphi 的发展历史及特点,并讲述 Delphi 的新功能及安装、卸载方法。...第 21 章:主要讲解 Delphi 开发数据库程序的大体步骤,并以“图书管理系统”为 例,向读者介绍 Delphi 开发实用程序的一般步骤。
  • Delphi开发的数据库与服务器同步备份程序,使用有VCL控件,在压缩包内,本程序使用起来相对简单,选择数据库,点击复制数据就可实现备份。源代码编译时请导入控件,否则编译出错。
  • Delphi三层程序开发

    2014-01-07 22:10:14
    一年前开发了一个MIDAS的程序,最近修改服务端,可是这个服务无法注册,最后终于找到了解决办法,这个相关文章如下:(算是备份吧) (一)MIDAS是什么?  Delphi中MIDAS到底是什么呢?和他相关组件是什么呢?  MIDAS...

    一年前开发了一个MIDAS的程序,最近修改服务端,可是这个服务无法注册,最后终于找到了解决办法,这个相关文章如下:(算是备份吧)

    (一)MIDAS是什么? 
    Delphi中MIDAS到底是什么呢?和他相关组件是什么呢?  
    MIDAS(Multitiered Distributed Application Services)多层分布式应用服务。
       Delphi所提出的Multi-Tier结构是把原来的Two-Tier前台应用程序内的dbExpress,ADO,BDE,SQL Link,DataMoule,拿到另外一台NT服务器(就是所谓的应用程序服务器),而前台程序只剩下一个可执行文件及MIDAS.DLL,而移到NT 服务器上的DataMoule则变成一个COM程序(Remote DataModule).
       注:前台一定要把MIDAS.DLL发布到系统目录下.
       (1)前台程序会通过调用应用程序服务器提供的方法(接口)提出一个请求
       应用程序服务器会响应这个请求,传送一个相应的SQL命令到后台数据库,而后台数据库会把执行SQL命令产生的DataSet返回给应用程序服务器.
       注:Delphi提供了Type Library来帮助应用程序服务器定义COM方法(接口)
       (2)NT服务器上的COM程序是通过中间软件(dbExpress,ADO,BDE,SQL Link)传送SQL到后台数据库.
          当应用程序服务器要把读取到的DataSet传送给前台时,就必须利用DCOM的机制来进行.Delphi提供的TDataSetProvider组件就会把读取到的DataSet压缩并且分割成一段一段的数据包,通过DCOM或TCP/IP传给前台.
          注:Delphi提供了RemoteDataModule向导来帮你产生COM程序的结构.
          由于Delphi的程序具有传送DataSet的特殊机制,所以Delphi也实现了一个接口叫做IProvider(即TDataSetProvider),来帮助应用程序服务器上的COM程序发送DataSet数据.
       (3)前台程序与NT服务器上的COM程序是通过DCOM的机制互相沟通
          前台的应用程序是通过MIDAS.DLL和应用程序服务器相互沟通,前台的MIDAS.DLL会把接收到的应用程序服务器发过来的数据包再还原成DataSet,丢给前台程序中的TClientDataSet组件.
          注:前台程序必须提供相应的TClientData组件来和应用程序服务器上的每个IProvider(即TDataSetProvider)对应.用户 修改前台数据时,修改的只是Cache(缓存)在前台的Dataset,最后要通过TClientData.ApplyUpdate方法来把前台变动的数 据写回到后台数据库中.
         
    (二)创建并注册MIDAS应用程序服务
       Delphi中如何创建并注册MIDAS应用程序服务器COM程序?  
       Delphi提供一些向导(如:RemoteDataModule,Automation Object,TypeLibrary)来自动产生COM程序的结构.
       (法1)创建一个普通应用程序服务器
            新建一个普通工程,然后通过New->Other->Multitier->Remote DataModule,来自动新建一个COM服务器结构.
            注: 要注册创建的MIDAS应用服务器,可以运行应用程序或者使用/REGSERVER开关运行程序.
       (法2)创建一个NTService类型的应用程序服务器,这样就无需登陆系统也能启动应用程序服务器,避免断电重启带来的无法访问应用程序服务器的问题.
            新建一个NTService工程,然后通过New->Other->Multitier->Remote Data Module,来自动新建一个COM服务器结构.
            注: 要注册创建的NTService服务器,通过/install开关来运行程序.
        注: MIDAS程序需要客户端注册MIDAS.DLL和STDVCL40.DLL动态库.      
       
    (三)MIDAS应用程序COM服务器实例化模型种类
    (1)Internal Instance
         创建一个In-Process的COM程序,即DLL服务器.
    (2)Single Instance
         如果每个客户程序都运行服务器程序的一个实例,则使用该模型.就是每个连上线的前台程序,在服务器上都会有一个对应的应用程序服务器被运行.因此每个前台 发出来的查询都会有各自独立Process的应用程序来处理,根本无所谓排队的问题.但是它会比较占用系统资源,影响服务器整体的运行效率.
    (3)Multiple Instance
         如果客户程序共享服务器程序,则使用该模型.就是一个应用程序服务器可以同时处理好几个前台程序的链接,以技术的层面来解释就是所有前台程序可以共享单一 Process的应用程序服务器.该模式的最大好处是,激活及运行的效率较快,比较不会耗用服务器太多系统资源,而且管理上比较方便.但是它隐藏着一个不 具备多任务处理的问题,如果一个前台用户发出了一个查询请求,而且这个查询要求产生的结果可能多大数MB,这时候,其他在线前台用户发出的查询要求都必须 等待之前的查询要求运行完并得到相应之后,才得以继续运行.这可能会耗用许多时间,而且,如果一旦某个前台程序的查询发生错误,那么其他在后面排队的查询 请求将会跟着死掉.
       注:那么到底采用哪种模式来创建应用程序服务器?答案是:按系统需求而定.简单的说就是,你可以创建两组应用程序服务器,一组是采用Multiple Instance模式,另一组采用Single Instance模式,而你必须把程序的类型分为两种,一种是查询数据量较小或是比较不重要的写入操作,另一种查询数据量较大或是重要数据的写入操作.如 此一来,你的前台程序就可以放置两个TDCOMConection来各自连上两个不同模式的应用程序服务器,进行不同性质的工作.

    (四)MIDAS线程模型
    (1)Single
         代表所产生的In-Process COM程序是一个单一线程的程序,一次只能接收一个client发出来的request,由于是循环的操作,所以不会有多任务同时进行的问题,你的COM程序不需要编写多任务处理的部分.
    (2)Apartment
         代表每一个Remote Data Module所产生的instance一次只能处理一个前台发出的request,可是如果同时创建多个In-Process COM程序,那么每个COM程序都会有一个线程来处理,每个instance所处理的数据是安全的,可是你必须防止一些共享变量的冲突.
    (3)Free
         该线程模式可以让Remote Data Module产生的每个instance通过各自的线程处理每个前台发出的request,所以Remote Data Moudle本身必须采用多线程的程序写法,你必须保护每个instance所处理的数据区域不会互相冲突..当使用ADO数据集时,推荐使用Free模 型.
    (4)Both
         与Free相同,除了所有对应前台界面的callback是连续的以外.
    (5)Neutral
         此种模式允许多个前台程序在同一个时间以不同的线程来调用Remote Data Module,不过COM对象必须确保不会有前台程序调用的冲突,你要确定每个线程在访问全局变量及实例数据时,不会发生任何冲突.这个模式只适用在COM+.

    (五)MIDAS前台程序连接到后台应用程序服务器
    (1)SocketConnection:
         只要前台计算机安装有TCP/IP的通信协议即可,但是Application Server上必须要有对应的SocketServer程序scktsrvr.exe
    (2)DCOMConnection:
         如果前台计算机系统是Win95,则必须安装DCOM form Win95(去Microsoft网站下载),如果系统是Win98,Me,NT等,则已经包含DCOM Library
    (3)Corbaconnection:
         必须安装Visic Broker即Delphi专用的Corba ORB文件,这些文件名称分别是:Orbpas.dll,cw3240mt.dllorb_r.dll,请把这些文件复制到前台计算机的的系统目录下.同 样的Application Server上也不需安装.
    (4)WebConnection:
         只要前台计算机安装有TCP/IP协议即可,但是Application Server上必须安装一套Web Server,并且必须把httpsrvr.dll文件安装到Web Server虚拟目录下,再把WebConnection的属性URL指向此虚拟路径即可.
       注:不论采取何种Connection组件,都会用到Midas.dll文件,所以打包时一定要把它分发到前台计算机的系统目录下去.
      
    (五)MIDAS如何控制前台权限
    (1)原理:
         前台程序与应用程序服务器之间是通过DCOM机制的运行来传送数据,DCOM对象的安全机制是以Windows NT的安全模块为构建基础,换句话说,要设置某个用户是否有远程运行DCOM对象的能力,最基本的条件是这个用户一定要被加入Windows NT的用户组内,如此才有资格连上Windows NT Server,并进而依据DCOM的权限来决定是否能够运行指定的应用程序服务器.
    (2)工具:
         在系统目录下有一个DCOMCNFG.EXE工具,可以用来设置应用程序服务器的运行权限.
    (3)自己通过程序控制(也许更可取,避免了配置人员的配置复杂性)

    展开全文
  • Delphi创建服务程序

    2019-09-23 01:09:21
    Windows 2000/XP和2003等支持一种叫做"服务程序"的东西.程序作为服务启动有以下几个好处: (1)不用登陆进系统即可运行. (2)具有SYSTEM特权.所以你在进程管理器里面是无法结束它的. 笔者在2003年为一公司开发机...
  • Delphi开发Web服务数据库程序

    千次阅读 2012-01-27 20:33:23
    第一步:编写服务器的应用程序 首先在Delphi的IDE中选择”File|New|Other…”,然后在WebServices页面中选择Soap Server Application图标。 然后在New Soap Server Application对话框中选择Web App Debugger ...
  • Delphi服务程序

    2011-10-24 17:06:00
    如何用 Delphi 创建系统服务程序? Windows 2000/XP和2003等支持一种叫做"服务程序"的东西.程序作为服务启动有以下几个好处: (1)不用登陆进系统即可运行. (2)具有SYSTEM特权.所以你在进程管理器里面是无法...
  • Service Application2、现在一个服务程序的框架已经搭起来了,打开Service1窗口,有几个属性说明一下:AllowPause:是否允许暂停AllowStop: 是否允许停止Dependencies: 设置服务的依存关系,服务的启动是否依赖于某个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 973
精华内容 389
关键字:

delphi服务程序开发