DataSnap从Delphi 7迁移到XE6

时间:2014-11-03 14:32:26

标签: delphi delphi-7 delphi-xe6 datasnap

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

在运行旧版本的机器上安装新服务器时,我使用

xxxxx.exe / unregserver(旧版)和

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

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

以下是服务器的一些信息

Server_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"

我想念别的什么?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我建议你查一下:

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

此外,不推荐使用套接字服务器,它有一些缺点:

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