【问题标题】:DataSnap migration from Delphi 7 to XE6DataSnap 从 Delphi 7 迁移到 XE6
【发布时间】:2014-12-30 05:31:12
【问题描述】:

再次对不起我的英语, 我已经迁移了客户端和服务器,一切正常, 直到我注意到服务器的远程数据模块没有按预期工作。当我从需要更多时间的客户端运行查询时,其他远程数据模块仍处于暂停状态(包括主线程)。它的行为就像线程模型是 tmSingle。我环顾四周,尝试了我发现的一切,但没有成功。更奇怪的是,在我注册新服务器(使用 XE6 构建)的地方,旧服务器(使用 D7 构建)开始出现相同的症状。

在已经运行我使用的旧服务器的机器上安装新服务器时

xxxxx.exe /unregserver(旧的)和

xxxxx.exe /regserver(对于新的),然后是明显的问题。即使我取消注册新服务器并注册旧服务器,问题仍然存在。

客户端和服务器通过DataSnap Socket(客户端使用TSocketConnection和TConnectionBroker)进行通信。

这是服务器的一些信息

服务器_TLB

unit Server_TLB;
uses Windows, ActiveX, Classes, Graphics, Midas, StdVCL, Variants;
const

  LIBID_Server: TGUID = '{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}';

  IID_IrdmServer: TGUID = '{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}';
  CLASS_rdmServer: TGUID = '{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}';

  IrdmServer = interface;
  IrdmServerDisp = dispinterface;

  rdmServer = IrdmServer;

  IrdmServer = interface(IAppServer)
    ['{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}']
    ........... methods..........


  IrdmServerDisp = dispinterface
    ['{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}']
    ........... methods..........

  CordmServer = class
    class function Create: IrdmServer;
    class function CreateRemote(const MachineName: string): IrdmServer;

implementation

uses ComObj;

class function CordmServer.Create: IrdmServer;
begin
  Result := CreateComObject(CLASS_rdmServer) as IrdmServer;
end;

class function CordmServer.CreateRemote(const MachineName: string): IrdmServer;
begin
  Result := CreateRemoteComObject(MachineName, CLASS_rdmServer) as IrdmServer;
end;

end.

..RDM 的初始化

initialization
  TComponentFactory.Create(ComServer, TrdmServer,
    Class_rdmServer, ciMultiInstance, tmFree);

..创造的顺序

    Forms.Application.ShowMainForm := False;
    Forms.Application.Initialize;
    Forms.Application.CreateForm(TdmServer, dmServer);
    Forms.Application.CreateForm(TfMain, fMain);
    windows.PostMessage(fMain.Handle, MSG_INITIALIZE, 0, 0);
    Forms.Application.Run;

使用标准的 SocketDispatcher 和标准的 SConnect

也尝试过设置键

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}\InprocServer32]
"ThreadingModel"="Free" or "Both"

我想念别的东西?

感谢您的帮助!

【问题讨论】:

    标签: delphi delphi-7 delphi-xe6 datasnap


    【解决方案1】:

    在这种情况下,我将使用正确的线程模型创建一个简单的 DataSnap 客户端/服务器应用程序,对其进行测试,然后将自动生成的服务器模块代码与迁移项目中的代码进行比较。

    这样,您可以检测到关键差异,将代码调整为测试项目服务器模块中的等效代码。

    【讨论】:

    • 我已经使用新的简单创建的 DataSnap 服务器/客户端进行了测试,并且似乎工作正常。但是 D7 和 XE6 服务器的架构是不同的。我觉得那里无法比较。明天再看。谢谢。
    【解决方案2】:

    我建议你检查一下:

    Midas / DataSnap 服务器上的安全性:http://qc.embarcadero.com/wc/qcmain.aspx?d=8814

    此外,套接字服务器已被弃用并且有一些缺点:

    • 它绕过了 DCOM 安全。一切都在运行服务器的用户的安全上下文中运行(如果它是本地系统,它具有最强大的权限 - 请注意这一点)
    • 除非您为其编写模块,否则连接不会加密,该模块缺乏基本的安全密钥交换功能。 DCOM 可以加密和验证数据包(尽管它现在的加密不是很强大) - 您只需要在 dcomcnfg 中配置它。
    • 不支持64位值和其他类型,见http://qc.embarcadero.com/wc/qcmain.aspx?d=69924

    【讨论】:

    • 我已经在项目的 UpdateRegistry 中应用了修复。问题不存在。 10x
    • 您是否检查了同一台机器上的客户端和服务器是否直接使用 DCOM 工作?
    • 另外,事件查看器什么也没报告?我还建议使用调试工具(远程调试、sysinternals debugview/ProcessMonitor 等)来跟踪服务器实际执行的操作以及挂起的位置。还要检查 dcomcnfg 设置。至少从 D5-D6 开始,Delphi DCOM Datasnap 并没有真正改变,但 Windows 做到了。你在什么操作系统上运行?
    • 事件查看器中没有事件记录,在调试中 - 从第一个客户端调用方法到达断点,此时从第二个客户端调用另一个方法 - 当第一个方法完成时进入第二个方法。在 DCOMConfig 中,我没有发现任何有用的东西。谢谢
    • 请注意QualityCentral has now been shut down,因此您无法再访问qc.embarcadero.com 链接。如果您需要访问旧的 QC 数据,请查看 QCScraper
    猜你喜欢
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多