上一页 1 ··· 140 141 142 143 144 145 146 147 148 ··· 196 下一页
摘要: 其实不论什么方法,归根揭底都是通过传递对象的指针来达到效果的。方法一:procedure SendString(strMSG: string);var Data: tagCOPYDATASTRUCT; pBuf: PChar;begin GetMem(pBuf, Length(strMSG) + 1); try ZeroMemory(pBuf, Length(strMSG) + 1); StrPCopy(pBuf, strMSG); Data.cbData:= Length(strMSG); Data.dwData:= Length(strMSG); Data.lpData:= pBuf; S 阅读全文
posted @ 2012-03-03 08:41 delphi中间件 阅读(889) 评论(0) 推荐(0) 编辑
摘要: 主控程序(通常是EXE程序),各插件(DLL/BPL),它们都是独立的工程,它们组成一个工程组。1. 主控程序和各插件工程中,BUILD WITH RUNTIME PACKAGE都勾选上。整个程序运行的时候,保障了所有的VCL对象只有唯一的一份,杜绝了VCL对象相互之间发生冲突的可能性。此种方式最为稳定和安全,建议使用此方式。但此种方式有一个缺点:发布程序的时候,DELPHI RTL包,第三方控件的BPL运行时包要一起打包发布,否则程序将不能运行。此种方式编译出来的EXE/DLL/BPL一般体积会比较小,往往只有几百K,因为运行时包没有编译进来。2. 主控程序和各插件工程中,BUILD WIT 阅读全文
posted @ 2012-02-26 15:26 delphi中间件 阅读(2370) 评论(1) 推荐(0) 编辑
摘要: 网上有一些讲以RAD方式设置主从表的演示,但是在实际当中不实用。function TsvrDM.ApplyUpdates(const ModuleId: WideString;sqlId:ShortInt; Delta0, Delta1, Delta2, Delta3: OleVariant): Shortint;const sql='Select * from %s where 1<>1'; var aData: array of OleVariant; i:integer; conn:TADOConnection; qry:TADOQuery; dsp:TDat 阅读全文
posted @ 2012-02-26 14:23 delphi中间件 阅读(2038) 评论(0) 推荐(1) 编辑
摘要: TCLIENTDATASET.DATA, TCLIENTDATASET.DELTA, TDATASETPROVIDER.DATA,它们的DATA属性的类型都是OLEVARIANT。中间层和客户端之间通过OLEVARIANT来传递数据集的数据。为了提高数据传输的效率,发送方在传输之前可以先压缩数据,然后把压缩的数据发送给接收方。接收方收到发送方送来的压缩数据,先进行数据解压。使用开源的ZLIB进行数据的压缩和解压。XE2已经自带此控件,需要引用system.zlib单元。原理:将OLEVARIANT数据流化,然后对流进行压缩,还原成OLEVARIANT以后再发送。procedure Stream 阅读全文
posted @ 2012-02-26 14:20 delphi中间件 阅读(1887) 评论(1) 推荐(1) 编辑
摘要: midas支持使用OLEVARIANT序列化对象,最新的DATASNAP支持使用OLEVARAINT和JSON来序列化对象。下面的代码演示OLEVARINAT序列化TPARAMS, TPARAMETERS对象。OLEVARIANT本质上是一个BYTE数组。还原TPARAMS对象procedure VariantToParams(input:OleVariant;par:TParams);// TParam 's property: fieldType, paramName, ParamType, value, size// paramType default value ptinput 阅读全文
posted @ 2012-02-26 14:04 delphi中间件 阅读(2059) 评论(0) 推荐(0) 编辑
摘要: 最近在写一个基于XE2 DATASNAP的中间层,以前也写过基于DCOM的MIDAS中间层,看到网上一些同仁对中间层的提问。我摘录俩个典型的提问,如下:第一个提问:Midas三层程序,如何支持大量用户同时请求连接?系统结构: TClientDataSet -> TSocketServer -> scktsrvr.exe -> RemoteDataModule -> ADO 要求:允许500-1000个客户端同时“请求”连接,服务器和客户端均不能死掉。现状:在现有的程序中,只要同时“请求”连接的客户端达到一个较大的数量,例如80或100,应用服务器就停止响应了。客户端尝试 阅读全文
posted @ 2012-02-25 09:30 delphi中间件 阅读(5926) 评论(1) 推荐(1) 编辑
摘要: 获得客户端的信息 记得datasnap 2009时,要得到客户端信息,非官方的方法,要去搞什么DSConnectEventObject.ChannelInfo.Id,弄成 TIdTCPConnection。xe2就好得多了。仍然是在DSServer的OnConnect 事件里,DSConnectEventObject.ChannelInfo.ClientInfo就是客户端的信息。能得到啥? 看代码 TDBXClientInfo = recordIpAddress: String;ClientPort: String;Protocol: String;AppName: String;end;也就 阅读全文
posted @ 2012-02-23 22:50 delphi中间件 阅读(1355) 评论(0) 推荐(1) 编辑
摘要: 服务器端如何防止DDOS 前面说到DSServer的OnConnect是socket已经完全搭好client都调用connect的服务器方法了才触发的,如果我们到这里才来想起拒绝不合法的ip连接,已经挺晚了:socket已经连接好了,都已经创建线程开始通讯了。怎么做才能在最开始的socket握手里,就让捣蛋鬼死在萌芽中呢。要解决这个问题,当然得从TDSTCPServerTransport下手,因为ServerTransport才是真正负责通讯的,可以在它的OnConnect事件下手procedure TServerContainer1.DSTCPServerTransport1Connect( 阅读全文
posted @ 2012-02-23 22:49 delphi中间件 阅读(1356) 评论(0) 推荐(1) 编辑
摘要: TDSAuthenticationManager的用法 xe开始有了TDSAuthenticationManager,这个主要用来做用户认证,用法也很简单 服务器端 1.TDSAuthenticationManager有两个主要的事件 在这个事件里面,看看检测连上来的用户名,密码是否合法,valid 阅读全文
posted @ 2012-02-23 22:47 delphi中间件 阅读(3131) 评论(0) 推荐(1) 编辑
摘要: 要深刻理解TclientDataSet的两个重要属性:Data、Delta要深刻理解并区分开Tfield的4个重要属性:Value、OldValue、CurValue、NewValueTField的事件触发顺序: 显示时触发:OnGetText 编辑时触发:OnSetText->OnValidate->OnChange (1) OnGetText事件是访问DisplayText或Text时触发。如果数据库中存储的值和要显示给用户看的值不一样,如数据库中存储的是bool型的值,要显示给用户“真”或“假”,可以在这个事件里进行处理。 (2) OnSetText事件是设置字段的值时触发。 阅读全文
posted @ 2012-02-21 20:24 delphi中间件 阅读(2162) 评论(0) 推荐(0) 编辑
上一页 1 ··· 140 141 142 143 144 145 146 147 148 ··· 196 下一页