DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: gtgtfgtgdsf12S
今日帖子: 18
在线用户: 14
导航: 论坛 -> Web应用开发 斑竹:bodies  
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/3 21:26:50
标题:
Intraweb 笔记 浏览:29811
加入我的收藏
楼主: IWBase.js =
 IWBrowser.js + IWPreScript.js + jQuery.js + jQueryMaskedInput.js. 

IWLib.js =
 IWCommon.js + IWCL.js + IWAjax.js.
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/3 21:28:28
1楼: function processAjaxResponse(aXmlDoc)
{
  var xData = aXmlDoc.getElementsByTagName("response");

  if (xData == null || xData.length != 1) {
    return;
  }

  // Set track ID for next submit
  var xTrackID = aXmlDoc.getElementsByTagName("submit");
  if (xTrackID.length > 0 && xTrackID[0].lastChild != null) {
    var xSubmitForm = getSubmitForm();
    if (xSubmitForm) {
        xSubmitForm.action = xTrackID[0].lastChild.nodeValue;
    }
  }
  // process rewrite tag first
  var xRewrite = aXmlDoc.getElementsByTagName("rewrite");
  if (xRewrite.length > 0 && xRewrite[0].childNodes.length > 0) {
    processAjaxRewrite(xRewrite[0].childNodes);
  }
  // process udpate tag
  var xUpdate = aXmlDoc.getElementsByTagName("update");
  if (xUpdate.length > 0 && xUpdate[0].childNodes.length > 0) {
    processAjaxUpdate(xUpdate[0].childNodes);
  }
  // process execute tag
  var xExecute = aXmlDoc.getElementsByTagName("execute");
  if (xExecute.length > 0 && xExecute[0].childNodes.length > 0) {
    processAjaxExecute(xExecute[0].childNodes);
  }
}
----------------------------------------------
-
作者:
女 blbz (冰力不足) ▲▲▲▲▲ -
普通会员
2015/5/4 0:00:35
2楼: 谢谢分享, 新手求demo下载.
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/4 11:28:57
3楼: 大家知道IWMenu控件页面展示很难控制,效果很差。发一个通过CSS+IWText展现系统主菜单的演示,包含全部原代码,在IW14.0.37+XE6下编译。
此帖子包含附件:c5soft_201554112855.rar 大小:1.64M
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/4 11:30:22
4楼: 这是效果图。通过修改app.css,可以达到你希望的任何效果。这里提供二级菜单的展示,其中class="Current"只支持一次菜单。
此帖子包含附件:
JPEG 图像
大小:16.1K
----------------------------------------------
-
作者:
男 szlbz (szlbz) ★☆☆☆☆ -
盒子活跃会员
2015/5/4 12:00:48
5楼: 谢谢分享iw使用经验。
----------------------------------------------
-
作者:
男 hwkjzyh (汉卿) ★☆☆☆☆ -
盒子活跃会员
2015/5/4 12:27:44
6楼: 难得见的iw经验,谢谢分享!
----------------------------------------------
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/4 13:59:42
7楼: IECompatibilityMode设置方法
IE9以上版本,可以强制工作在低版本网页解析模式,在IWServerController中的IECompatibilityMode属性就是用来控制网页希望用于解析的IE版本的,IECompatibilityMode的有效值如下:
IE=5
IE=7
IE=8
IE=9
IE=10
IE=EDGE
最后一个值IE=EDGE,使用当前IE能够支持的最高版本。
IECompatibilityMode的设置值在哪里可以看到呢?通过显示玩野的源代码,看不到,IECompatibilityMode包含自HTTP返回文档的文件头中,显示源代码仅能看到HTTP返回的主体部分:
HTTP/1.1 200 OK
Connection: close
Content-Encoding: gzip
Content-Type: text/html; charset=UTF-8
Content-Length: 1509
Date: Mon, 04 May 2015 05:45:54 GMT
Cache-Control: no-cache
Pragma: no-cache
X-UA-Compatible: IE=EDGE
Vary: Accept-Encoding
Set-Cookie: IW_MyApp=jztUgBQB6eg0OLL74ZPdVG_2; Path=/
----------------------------------------------
-
作者:
男 gdsa (文稠紧) ★☆☆☆☆ -
盒子活跃会员
2015/5/4 14:27:48
8楼: 楼上写的有IW相关的书吗?感觉你的水平可以写点系统的东西了。以你发贴的质量,你要出书,我一定购买正版支持。。按此在新窗口浏览图片
----------------------------------------------
-
作者:
男 tonzi (tonzi) ▲▲▲▲△ -
注册会员
2015/5/4 14:45:30
9楼: 感谢分享
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/4 15:01:22
9楼: 目前没有,如果要写,想写一本《Intraweb Inside》,有没有相同想法的同学,咱们共同来干吧。写书者需要报一个目的:不图钱,图个乐。电子版免费下载。
Intraweb玩了多年。前一阵,玩了一把Nodejs,本着Nodejs平台前后台用Javascript一种语言,受JavaScript语言的限制,项目搞大后很难调试,回头来继续搞Intraweb。
前贴说Intraweb的菜单是短板,可用CSS补齐,Intraweb还有一个很短很短的短板,DBGrid,不支持Ajax,不支持分页。目前可以用JQGrid,Flexigrid,这些都太复杂,还要求预先定义表格栏目结构。我正搞一个更简单的,取名叫FlatGrid,无需定义栏目结构,表格完全根据后台数据重建。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/4 15:18:41
10楼: 发一个FlatGrid外观图:
此帖子包含附件:
JPEG 图像
大小:166.6K
----------------------------------------------
-
作者:
男 hwkjzyh (汉卿) ★☆☆☆☆ -
盒子活跃会员
2015/5/4 15:30:30
11楼: c5soft (走遍天下)
能通过jquery弥补iw的不足,那iw用起来就方便多了。

对于会delphi的朋友,不会Javascript提供方便。

建议 c5soft (走遍天下) 就iw不足写成书。

谢谢 c5soft (走遍天下) 共享自己的资源。
----------------------------------------------
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2015/5/4 16:34:13
12楼: c5soft (走遍天下),你推荐大家用intraweb+jQuery,这样虽然可以改善界面,但有一个很大的机制性障碍:iw与jq的通讯是个很大的问题,jq无法使用iw的内核,在jq中搞的操作,iw是无法知晓的,反之亦然。
用iw+tms iw,虽然效果差点,但tms与 iw共用内核,两者通讯是没有任何问题的。
如果您对iw内核熟悉,建议您花精力用在tms iw组件的改善上,tms iw的一些组件做得很周到了,但是一些东西存在不少BUG,如果能做些改善,完全可用iw+tms iw做web项目、手机应用和网站、电子商务类应用 。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/4 17:13:18
13楼: 我对TMS研究得很少,粗浅的认识是:TMS与IW一样,在用户界面方面设计上没有优势。但不同意sxqwhxq (步惊云)的看法,jQuery与IW能够很好的协作,JQuery本质上就是Javascript的一个简便语法表达,本质上讲,使用jQuery就相当于你在前端使用Javascript编程,IW的本质就是通过Delphi向浏览器输出HTML+Javascript。IW完全允许你添加自己的Javascript代码,并提供了Javascript调用Delphi代码与Delphi调佣Javascript的双重机制。
----------------------------------------------
-
作者:
男 zzh2000 (zzh2000) ★☆☆☆☆ -
注册会员
2015/5/4 17:17:21
13楼: 楼主思路很好。楼上的说法也成立。单纯依界面美化而言,嵌入CSS是不错的方法。而界面丑恰是 Intraweb被长期诟病的地方。期待楼主的FlatGrid。
----------------------------------------------
-
作者:
女 blbz (冰力不足) ▲▲▲▲▲ -
普通会员
2015/5/4 17:40:01
14楼: @c5soft大侠, 能否给一个最简单的账户密码登陆的demo? 

另,您给的例子在IW14.0.38可以运行, 在IW14.0.32也可以编译成功,但是exe启动不了. 可否处理一下让IW14.0.32下也可以学习到这个源码.

拜谢!
----------------------------------------------
-
作者:
女 blbz (冰力不足) ▲▲▲▲▲ -
普通会员
2015/5/4 17:45:35
15楼: @sxqwhxq (步惊云) "完全可用iw+tms iw做web项目、手机应用和网站、电子商务类应用"

期待高手们做出简洁的DEMO!

版本多,资料太少了,要学习必须装好几个虚拟机, 这几天装虚拟机,装不同版本给折腾得够呛~
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/4 19:05:59
16楼: 在控件的不同版本间切换应该是分分钟的事情。窍门如下:
将所有控件的BPL放到一个集中的文件夹下,我的在D:\Projects\Bin;
将所有控件的DCU、DFM、DCP、RES、INC、PAS等连接需要的文件放到一个集中的文件夹下,我的在D:\Projects\LibD20\Win32;
将D:\Projects\Bin加到操作系统的PATH环境变量中,将D:\Projects\LibD20\$(Platform)加到Delphi系统设置的Library Path中。
要切换控件的不同版本,无非是退出Delphi,执行一个批处理,将有关的文件复制到上述文件夹而已。

 附件是菜单演示在IW14.0.32下编译通过并正常运行的压缩包。
此帖子包含附件:c5soft_20155419551.rar 大小:1.64M
----------------------------------------------
-
作者:
男 robinson2006 (Leo) ▲▲▲▲▲ -
普通会员
2015/5/4 19:07:57
17楼: 顶楼主
----------------------------------------------
-
作者:
男 gdsa (文稠紧) ★☆☆☆☆ -
盒子活跃会员
2015/5/4 19:10:29
16楼: 此贴对还在用IW的朋友来说,很有营养,看到名声响亮的几位朋友之间的对话,很有启发。。
步惊云的担心,也是我现在担心和面对的。

JS和IW后台(或者叫内核)之间的简单通讯肯定没问题,c5soft在以前的帖子中分享的例子、和我借鉴万一博客中写的一些东西都证明是可行的(手法略有不同)。

但是进一步的AJAX交互成了问题(可能也就是步惊云说的“内核”性的东西吧)。

一些更复杂的AJAX回调,比如JS传递了一些数据,交给IW后台操作(例如向DB写了一些数据),界面(客户端、JS)如何主动的得知这些操作完成(或失败)。。。等等类似。。我的目的也是想仅用IW做后台(利于以前桌面开发经验),客户端用当下流行的JS库来做。。。

类似的问题,我看了好多demo,无非都是用sleep(n)、while(1)来解决。。。复杂点的项目这样搞不是个事儿。。。。

另外值得一提的是:已经有一些成功实现、且发布盈利的套件,如unigui(因为ExtJs版权等问题目前发展的也不是很好),还有老在这里做宣传的国产的MVXXX(呵呵不帮你做广告了哈)……他们既然有这样做的,我想比较完美的解决方案还是有的,这些应该是可以克服的困难。。
----------------------------------------------
-
作者:
女 blbz (冰力不足) ▲▲▲▲▲ -
普通会员
2015/5/4 19:44:55
18楼: 谢谢@c5soft 肖老师分享简洁易懂的demo和非常好的技巧!
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/4 22:02:46
19楼: 已查到IW14.0.38/39不支持IE7的原因,这是IE7的一个Bug,这是百度描述:
http://zhidao.baidu.com/link?url=1U96oZyyvn6OeoHV94HaUH9VL_q9cb_Ob3ygdsXV91GjqFUazk9EBE80X0Elz5W1pHyjpzIBtimU_q6497dyU6BmVvNlr4fTXehNz7RF6FC

IW14.0.37以前IW_Action等隐藏字段是通过Delphi直接生成的,IW14.0.38开始,调用form.appendChild来生成,结果产生了:
<input type="HIDDEN" submitName="IW_Action">
<input type="HIDDEN" submitName="IW_ActionParam">等标记,导致后期无法提交,那个动画一直在不停的转,按F12可看到已报错了。
正确的HTML标记应为:
<input type="HIDDEN" name="IW_Action">
<input type="HIDDEN" name="IW_ActionParam">
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/4 23:07:03
20楼: IW14.0.38/39不支持IE7这个Bug补丁:
重写IW.DOM.createHiddenField函数。
在页面上放一个TIWJQueryWidget控件,将该控件的OnReady中录入:
IW.DOM.createHiddenField=function(formName, name, value) {
       var el;
       if (IW.browser.IsIE && (IW.browser.IEDocumentMode <= 7)) 
          el = document.createElement("<input name='"+name+"'>");
       else
          el = window.document.createElement("input");
        el.type = "hidden";
        el.name = name;
        el.value = value;
        var form = IW.getForm(formName);
        if (form) {        
          form.appendChild(el);
        }
}

为避免修改所有页面,请将这个补丁放到一个父页面窗体中,其他所有页面窗体从这里继承。
----------------------------------------------
-
作者:
男 hyongz (lvye) ▲▲▲▲▲ -
普通会员
2015/5/4 23:17:20
21楼: 一定要支持,谢谢楼主
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2015/5/4 23:18:27
22楼: 顶楼主。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/4 23:39:52
23楼: 经测试,使用上述方法,在我的项目中IW38/39这个IE7的Bug的确解决了。使用Win7安装IE9以上版本的同学们,请将ServerController的IECompatibilityMode设置成IE=7,在WebForm页面上放一个IWButton,写一段OnClick事件代码,一运行立马发现这个Bug。

顺便回14楼:我做的项目是真实运行的网站,包含太多敏感数据,不便开通测试账户。同学们无非是想看看IW+jQuery的效果。肖老师负责任的告诉同学们:
只要你努力学习,你作品的视觉效果不会输给用其他任何工具开发的商业网站。
----------------------------------------------
-
作者:
男 drroc (kylixfans) ★☆☆☆☆ -
盒子活跃会员
2015/5/4 23:42:43
21楼: 强扭的瓜不甜
----------------------------------------------
MVCXE中国首个DELPHI MVC WEB框架:http://www.mvcxe.com/
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/5 9:13:48
24楼: 肖老尸再发力,将IW38/39不支持IE7的更正补丁直接打到IW的资源文件IWData.res中,将附件下载, 覆盖IW14.0.38/39控件中的同名文件即可。使用这个补丁后不需要TIWJQueryWidget控件帮忙了,重新编译即可。
此帖子包含附件:c5soft_20155591347.rar 大小:211.8K
----------------------------------------------
-
作者:
男 zswleo (Wisz) ★☆☆☆☆ -
盒子活跃会员
2015/5/5 9:49:58
25楼: 好帖,支持楼主。也许以后会用到这个,关注。
----------------------------------------------
Love computer  love  programming
作者:
男 hwkjzyh (汉卿) ★☆☆☆☆ -
盒子活跃会员
2015/5/5 11:07:48
26楼: 再次看到了iw的春天,在新开发的项目中,不再用d7+iw10.0.23。

权衡了一下新系统选中了xe+iw14.0.32。
----------------------------------------------
作者:
男 z_y_b_delphi (z_y_b_delphi) ▲▲▲▲▲ -
普通会员
2015/5/5 12:43:38
27楼: 看到大家对IW的一些技术讨论,关于IW+JQ我也有一点心得,这是我第一次写博客,多年在盒子潜水,也做点贡献,本想将文章发表在盒子文章里,可怎么也发表不了,也没有专业博客网站能够呈现的效果,只好发在csdn,我只在csdn注册过,博客园申请手续太多。第一写东西,难免出现错漏,请大家多指教。链接:
Intraweb之EasyUI篇
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/5 15:20:53
28楼: EasyUI开源免费,界面漂亮。但是她有一个最大的问题就是代码只能找到以前的开源的版本,到了1.2以后的版本源代码都是经过混淆的(mini版),如果遇到问题修改起来会非常麻烦!RasyUI是一个美人,但是你难以把她琢磨透。搞不透彻的东西,咱们最好不碰。IW的优势是简单,做东西效率很高。IW提供模板开发模式,但一使用模板就让程序变得复杂。拜读了 z_y_b_delphi的文章,不推荐文中提到的开发模式,肖老尸的理念是:美是简单。尽量使用IW提供的控件,对IW不足用Javascript与CSS来补全。
----------------------------------------------
-
作者:
男 zhangpuqing (pupu) ▲▲▲▲△ -
注册会员
2015/5/5 15:33:10
29楼: 数据交互用三层了.
----------------------------------------------
-
作者:
女 blbz (冰力不足) ▲▲▲▲▲ -
普通会员
2015/5/5 16:01:48
30楼: 谢谢 z_y_b_delphi的好介绍!!!

简洁的几个PAS搞定一个站, 非常喜欢!
请问登入的账户名和密码是什么? 新手下了个SqliteDev看里面的Mydata.db3,不知道密码放在哪里.第一次用Sqlite.

也谢谢肖老师的利弊分析!
此帖子包含附件:
PNG 图像
大小:37.0K
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/5 19:23:34
31楼: JQuery速查表
http://hemin.cn/jq/index.html
----------------------------------------------
-
作者:
男 z_y_b_delphi (z_y_b_delphi) ▲▲▲▲▲ -
普通会员
2015/5/5 19:36:43
32楼: Admin
123456
我的源码里有easyui最新的版本,1.4.2。
有一点忘了说,里面提到的yxdJson是QDAC的组件,去QDAC网站下载就可以了。
----------------------------------------------
-
作者:
男 z_y_b_delphi (z_y_b_delphi) ▲▲▲▲▲ -
普通会员
2015/5/5 19:39:04
33楼: “经过混淆的(mini版),”,楼主可以用notepad++打开看一下,没有混淆的。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/5 20:51:52
34楼: 回z_y_b_delphi兄:不能说EasyUI的源代码是混淆的,经过压缩处理后的原代码也很难读,能够拿到未经压缩的吗?
----------------------------------------------
-
作者:
男 z_y_b_delphi (z_y_b_delphi) ▲▲▲▲▲ -
普通会员
2015/5/5 20:57:15
35楼: 用最新版NotePad++打开自动就转化成了非压缩的了
----------------------------------------------
-
作者:
男 hwkjzyh (汉卿) ★☆☆☆☆ -
盒子活跃会员
2015/5/5 21:33:42
36楼: iw14.0.39每次在启动xe7时,在到调iw14.0.39的包时,要等待一会。说明iw14.0.39要上互联网才能运行,断开网线后,在调iw包时,就会停止在那不动了。
----------------------------------------------
作者:
女 blbz (冰力不足) ▲▲▲▲▲ -
普通会员
2015/5/6 3:27:23
37楼: @z_y_b_delphi

大作中说:本文所需要工具:delphiXE7+Intraweb 14.0.38

去QDAC官网下载的
http://blog.qdac.cc/?page_id=139

YxdJson(音儿小白FastJson接口扩展版)Build 20141108 | YxdWorker纯源码包(音儿小白扩展版)Build 20141108

发现仅仅支持到XE6, 用在XE7上编译不通过.

大神可否把您自己用的支持XE7的yxdJson提供下载.

而用xe6装了一个IW, 也是编译不通过.

从下午弄到深夜3:28 恕俺愚钝
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/6 8:42:46
38楼: FlatGrid 1.0.0.0 is ready
1.Conforms to the jQuery Plugin specification;
2.Light weight with 500+ lines source code;
3.Dynamically build grid without structure predefined;
4.Completely free;
此帖子包含附件:c5soft_20155692314.rar 大小:2.24M
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/6 8:45:23
39楼: FlatGrid Snapshot
此帖子包含附件:
JPEG 图像
大小:119.6K
----------------------------------------------
-
作者:
男 hwkjzyh (汉卿) ★☆☆☆☆ -
盒子活跃会员
2015/5/6 8:50:38
40楼: 肖老师这么快就搞定FlatGrid了,下载试一下。
谢谢!
----------------------------------------------
作者:
男 shystep (shys) ▲▲▲▲▲ -
普通会员
2015/5/6 10:11:23
41楼: 帖子里 看到14.0.38 大家都用上了  自己没折腾出来,肖大拿出来接济一下。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/6 11:28:49
42楼: IW14.0.39 XE6 Cracked With IE7 Bug Fixed
http://pan.baidu.com/s/1kTKgpPP
----------------------------------------------
-
作者:
男 glings (glings) ▲▲▲▲△ -
普通会员
2015/5/6 14:15:15
43楼: 支持一下,这样的帖子应该放在那些讨论人品的帖子前面才对
----------------------------------------------
-
作者:
男 gdsa (文稠紧) ★☆☆☆☆ -
盒子活跃会员
2015/5/6 14:57:11
44楼: 是啊,建议管理员置项这个帖子,供大家多聊聊IW
----------------------------------------------
-
作者:
女 blbz (冰力不足) ▲▲▲▲▲ -
普通会员
2015/5/6 15:26:42
45楼: 太谢谢肖老师了
肖老师一出手,都是简洁的精品~~~
此帖子包含附件:
PNG 图像
大小:19.7K
----------------------------------------------
-
作者:
男 z_y_b_delphi (z_y_b_delphi) ▲▲▲▲▲ -
普通会员
2015/5/6 16:22:44
46楼: http://bbs.2ccc.com/topic.asp?topicid=479014
yxdjson放到里面了。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/6 16:49:57
46楼: 冰力兄过奖了,肖老尸雕虫小技,不值一提。50岁的人了,还是喜欢编程。
Intraweb到了14版,渐入佳境,生成的css代码真正遵循了css标准,尤其是14.0.38开始,对Javascript代码进行了重构,引入了命名空间,结构更加清晰,可读性大大加强。
为便于大家研究IW的js代码,肖老尸发布的14.0.39的文件包中有一个IWData文件夹,其中包含IW39所有Javascript代码,对其中任何一个文件修改后可通过MakeRes.bat重新生成IWData.RES。
要了解Intraweb底层,必须分析IW的js代码,IWServerController中JavascriptOptions.UseUncompressedFiles设置为True,使用Chrome/IE11浏览器就能跟踪网页中Javascript的调用关系。
另外肖老尸多次推荐的http协议跟踪工具Fiddler也是作为Web开发不可或缺的兵器。
此帖子包含附件:
JPEG 图像
大小:65.3K
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/6 17:32:55
47楼: 肖老尸(行尸走肉之尸),还有一件兵器,想给兄弟们讲讲:
WebStorm--编写Javascript代码,这个必须有!
1.可以像Delphi中的Ctrl+D格式化代码(WS中是Ctrl+Alt+L);
2.可以像Delphi中按Ctrl+鼠标左键,跳转到函数定义;
3.可以重构,对变量/函数改名;
4.启用JSLint等规范检查工具,帮助你编写更健壮的js代码;
5.还有好多好多你需要的与不需要的功能。
如何搞到?从官网下最新版安装文件,需要先安装java运行坏境(java8可用),用这个算号器。与Delphi一样,Javascript也是一门伟大的语言,冰雪聪明,美丽冻人,不可不玩呀。
此帖子包含附件:c5soft_201556173255.rar 大小:32.4K
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2015/5/6 17:44:40
48楼: 工具很强。顶。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 drroc (kylixfans) ★☆☆☆☆ -
盒子活跃会员
2015/5/6 19:21:21
49楼: 收费的,这样的工具很多。

还是推荐免费的吧,HBuilder,一般人我不告诉他
----------------------------------------------
MVCXE中国首个DELPHI MVC WEB框架:http://www.mvcxe.com/
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/6 21:56:00
50楼: 感谢 drroc(kylixfans)兄推荐HBuilder, 还真不知道有这样一件基于HTML5开发手机应用的国产神器,大开眼见。下载了,试玩了一把。感觉不错。如果要做手机应用,这个应是另一种选择。打开了js与css做了一下编辑,感觉这也是重兵器,需要学习的地方很多,最后放弃了。熟悉了jetbrains的工具,用别的都不顺手。其实尺有所短,寸有所长,没有谁比谁更好,贵在熟练。
编辑文本(有时候做点数据转换什么的)我用UltraEdit, 编辑css我TopStyle Portable与WebStorm并用,TopStyle的好处是你无需记忆css语法,通过css用属性编辑器,你从里边选,新手容易上路;webStorm的好处是可以做格式化,可以优化css定义。编辑js主要用WebStorm,这个是用nodejs做网站最好的开发工具。编辑TSQL我用SQL2K的查询分析器(那个绿色版),不喜欢高版的查询分析器,SQL2005以后查询分析器都是基于dotNet的产品,慢腾腾的。按理说JVM与DotNet都是虚拟机,DotNet跑在微软自家的操作系统上应该有地宜之便,JVM上的产品反而比DotNet上跑得更快。也难怪Delphi从2007到现在的XE8,都运行在DotNet2上,虚拟机再也没有升级过,微软的东西越来越笨重了。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/6 22:55:14
51楼: IW三层例,转至csdn
http://bbs.2ccc.com/topic.asp?topicid=478534
经查验,这个也是肖老尸的货,13年的整的,如有朋友感兴趣,我抽空移植到IW14上来。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/6 23:05:31
52楼: WebStorm 有哪些过人之处
http://zhidao.baidu.com/link?url=do63eOlK4VljNm8h-6UpfE0S5STUJZh6puDhtcpktg2XXt4lPTEjgEZvx2TLvQ1_oy_iOjtpVSiHuuahNrZFcQGLEVtHjukgSVSAnNHY0yK
----------------------------------------------
-
作者:
女 yyzdl (yyzdl) ★☆☆☆☆ -
盒子活跃会员
2015/5/7 9:40:17
53楼: 肖老师,有空整合一下你发布的东西,搞个iw的开发框架造福我们菜鸟吧
----------------------------------------------
-
作者:
男 zhuzh_yuy (华) ▲▲▲▲▲ -
普通会员
2015/5/7 12:49:32
54楼: 楼主建个群吧,大家一些交流下
----------------------------------------------
-
作者:
男 littley (y) ★☆☆☆☆ -
普通会员
2015/5/7 14:26:37
55楼: 已收藏
----------------------------------------------
-
作者:
女 blbz (冰力不足) ▲▲▲▲▲ -
普通会员
2015/5/7 15:47:15
56楼: @c5soft (走遍天下)

Delphi控件手工安装方法:
作者: c5soft (走遍天下) 


一、文件夹结构
创建D:\Projects文件夹
创建D:\Projects\Bin文件夹
创建D:\Projects\LibD7文件夹
创建D:\Projects\Components文件夹
将Intraweb、EhLib、FastReport等控件放置到D:\Projects\Components下,例如:
D:\Projects\Components\IW11063
D:\Projects\Components\IW14039
D:\Projects\Components\EHLib70133
D:\Projects\Components\FR5203
......
将D:\Projects\Bin添加到系统PATH环境变量中。
将你自己的项目也放在D:\Projects下,便于管理,这样将整个D:\Projects后背出来,什么都有了,重装系统的时候也不用重装所有控件。
二、将控件的bpl文件复制到D:\Projects\Bin下,将控件的dcu、dfm.dcp、res等连接需要的文件复制到D:\Projects\LibD7,这个是Delphi7用的,对于XE6, 复制对应文件到D:\Projects\LibD20\Win32、D:\Projects\LibD20\Win64下。
这个就是批处理D7Copyall.bat的用途。


在Delphi的设置中添加环境变量DevDir=D:\Projects
将Library Path设置为$(DELPHI)\Lib;$(DevDir)\LibD7

四、安装控件
这里有两种方法,一般的方法是通过菜单Component/Install Packages...,选择D:\Projects\Bin下的相应文件,一般是dcl*.bpl文件。这是其一,我更愿意使用第二种方法,通过regedit命令直接编辑注册表HKEY_CURRENT_USER\Software\Borland\Delphi\7.0\Known Packages,在里面直接添加控件。更进一步,准备几个reg文件放在D:\Projects\Components,双击直接导入。附近中是三个文件:
Current_User_Delphi7_Environments.reg用于设置环境变量;
Current_User_Delphi7_Packages_Primary.reg用于还愿Delphi7原始控件(清除所有三方控件);
Current_User_Delphi7_Packages_3rdParty.reg用于安装所有三方控件,每次重装系统的时候,导入这个文件就把所有控件装上了,编辑这个文件也就控制装入哪些控件。



反复琢磨 肖老师指点的安装方法, 还是搞不清楚,能否请肖老师提供您使用的3个.reg文件? 感谢!

肖老师请移步这里指点:
http://bbs.2ccc.com/topic.asp?topicid=479435
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/7 16:09:51
57楼: 按照上面的方式建立文件目录,将双击压缩包装文件,导入下列内容到注册表:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Embarcadero\BDS\14.0\Known Packages]
"D:\\Projects\\Bin\\dclIntraweb_14_DXE6.bpl"="IntraWeb 14 Components"
此帖子包含附件:c5soft_20155716951.rar 大小:252B
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/7 16:21:33
58楼: 用IW三层的AppService演示程序移植到IW14.0.39。摘录原来的Readme:
在目前流行的三层构架RemObjects、kmbMW、RealThinClient中RealThinClient以轻量、简单博得不少Delphi使用者的青睐。这里我向大家演示的框架比RealThinClient更轻量,更简单。这就是利用Intraweb作为中间层,Indy HTTP作为客户端,SuperObject作为数据编码格式实现三层构架。这一框架将B/S结构与C/S结构处理逻辑统一在一套源代码中,用同一台服务器既提供网页服务也通过应用服务。为实现这一目标,该框架的关键技术是如何在Dataset与XML间相互转换,这里发布的压缩文件中包含TADODataset与XML相互转换的源代码:
//将TADODataset转换成XML
function RecordsetToXML(const ARecordset: ADOInt._Recordset;
  const AChangesOnly: Boolean = False;
  const aIncludeSchema: Boolean = True): WideString;
//将XML转换成TADODataset
function XMLToRecordset(const AXML: WideString): ADOInt._Recordset;

//将XML变动数据转换成MS SQL的Update/Delete/Insert语句
function XMLChangesToMSSQL(const AXML, ATableName,
  AKeyFlds: WideString): WideString;



基于Intraweb的三层框架,前台数据存取使用TADOdataset,数据编码使用SuperObject。第2版做了如下改进:
1.启用Intraweb的Session;
2.Response改用压缩转送;
4.改进ADO与XML转换算法,使用XPath定位Schama。

下面是新的ADOToXML.Pas函数:
type
  TSQLVendor = (svMSSQL, svAccess, svOracle);

function RecordsetToXML(const ARecordset: ADOInt._Recordset;
  const AChangesOnly: Boolean = False;
  const aIncludeSchema: Boolean = True): WideString;
function ExtractXMLSchema(const AXML: WideString): WideString;
function ExtractXMLData(const AXML: WideString): WideString;
function XMLToRecordset(const AXML: WideString;
  const AXMLSchema: WideString = ''): ADOInt._Recordset;
function XMLChangesToSQLCmd(const AXMLChanges, ATableName, AKeyFlds: WideString;
  const AXMLSchema: WideString = '';
  const ASQLVendor: TSQLVendor = svMSSQL): WideString;
此帖子包含附件:c5soft_201557162120.rar 大小:3.09M
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/7 16:34:38
59楼: 回zhuzh_yuy兄:开群的要求就免了吧,本人极少QQ/微信。在Delphi使用中一般性、入门级的问题,还请同学们自学为主。
----------------------------------------------
-
作者:
女 blbz (冰力不足) ▲▲▲▲▲ -
普通会员
2015/5/7 19:30:55
60楼: 谢谢 肖老师, 终于搞定了!
----------------------------------------------
-
作者:
男 gdsa (文稠紧) ★☆☆☆☆ -
盒子活跃会员
2015/5/7 23:12:03
61楼: c5soft:下了你的IW3Tier测了一下,我理解你的主要目的是利用IW在生成XML,最终还是想以桌面EXE程序来展现,并不侧重浏览器的展现。。。有点datasnap那个意思,不知理解的对不对?
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/8 8:38:54
62楼: W3Tier想展示的是将datasnap类似的功能集成在Intraweb里面,在提供网页服务的同时还为桌面客户端提供应用服务。在数据以桌面EXE程序来展现与数据通过浏览器展现可以同时进行。
----------------------------------------------
-
作者:
女 blbz (冰力不足) ▲▲▲▲▲ -
普通会员
2015/5/8 20:15:16
63楼: @c5soft (走遍天下)

希望大神不要停笔, 继续分享您的宝贵经验, 谢谢介绍的各种武器, 试了很好, 看这个贴子高手们讨论, 受益匪浅, 拜谢!
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/9 13:43:26
64楼: 如果向IW监控窗体中写东西:
use IWMain;
...
FormIWMain.Log('=== Intraweb Inside ===');
此帖子包含附件:
PNG 图像
大小:17.0K
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/9 18:13:34
65楼: 如何将IW监控窗体的Log清空?

uses IWMain;
...
type
  TFormIWMainHelper = class helper for TFormIWMain
    procedure LogClear;
  end;

procedure TFormIWMainHelper.LogClear;
begin
   Self.memoLog.Clear;
end;
...
  FormIWMain.LogClear;
  FormIWMain.Log('=== Intraweb Inside ===');
此帖子包含附件:
JPEG 图像
大小:28.2K
----------------------------------------------
-
作者:
女 blbz (冰力不足) ▲▲▲▲▲ -
普通会员
2015/5/9 23:49:56
66楼: 学习, 这样的例子最容易让新手接受.

另, 请教 c5soft大神, 有没有办法让IW自动判断IE是否处于兼容模式, 如果是兼容模式, 发出提示让客户改为兼容模式? 或者最好能修改IW能代码, 不管兼容不兼容都可以打开. 谢谢!
此帖子包含附件:blbz_201559234956.rar 大小:59.2K
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/10 7:36:56
67楼: 回66楼blbz (冰力不足)的帖子:
  仔细看我在7楼写的东西,另外WebApplication.Browser.StrictMode是用来判断浏览器是出于Strict模式还是Quirks模式的,我用IE9试了一下,好像不好使:
  if not WebApplication.Browser.StrictMode then
     WebApplication.ShowMessage('Switch to Strict Mode please!');
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/10 11:44:31
68楼: WebApplication的四种引用方式:
作为成员变量在两个类定义中:
 TIWBaseForm = class(TIWModuleDsn)
  public
    property WebApplication: TIWApplication read GetWebApplication;
  end;

 TIWUserSessionBase = class(TIWDataModule)
  public
    property WebApplication: TIWApplication read GetWebApplication;
  end;

作为全局变量,在IWInit单元中定义:
threadvar
  WebApplication: IWApplication.TIWApplication;


作为全局变量函数的返回值,在IWApplication单元定义,在IWInit中初始:
在IWApplication单元中有:
type
  TGetWebApplicationThreadVar = function: TIWApplication;
var
  gGetWebApplicationThreadVar: TGetWebApplicationThreadVar = nil;
在IWInit单元中有:
...
use IWApplication;
...
procedure IWInit;
begin
  ...
  gSetWebApplicationTend;=...
  ...
end;

四种引用方式取得的结果是完全一样的,运行下面的代码:
  IWText1.Lines.Add('IWInit.WebApplication=' +
    IntToStr(Integer(Pointer(IWInit.WebApplication))));
  IWText1.Lines.Add('IWApplication.gGetWebApplicationThreadVar()=' +
    IntToStr(Integer(Pointer(IWApplication.gGetWebApplicationThreadVar()))));
  IWText1.Lines.Add('TIWAppForm.WebApplication=' +
    IntToStr(Integer(Pointer(Self.WebApplication))));
  IWText1.Lines.Add('UserSession.WebApplication=' +
    IntToStr(Integer(Pointer(UserSession.WebApplication))));
得到的结果:
IWInit.WebApplication=52858032
IWApplication.gGetWebApplicationThreadVar()=52858032
TIWAppForm.WebApplication=52858032
UserSession.WebApplication=52858032
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/10 11:59:28
69楼: Intraweb破解思路
Intraweb的license管理的类定义:
type
  TLicenseType = (ltInvalid, ltEval, ltPersonal, ltStandard, ltUltimate,
    ltBundledPro, ltBundledEntArch, ltPerStdUpgrade, ltPerUltUpgrade,
    ltStdUltUpgrade);

  TLicenseAbility = (laBoundLocalhost, laUnlimitedConnections, laISAPI,
    laService, laSSL, laProcessDispatch, laIPBinding, laAuthentication,
    laSessionTimeOut, laLibrary);

  TLicenseAbilities = set of TLicenseAbility;

  TIWLicense = class(System.TObject) 
  private
    FLicData: System.UnicodeString;
    fExpirationDate: System.TDateTime;
    fEmail: System.UnicodeString;
    fCustomerName: System.UnicodeString;
    fDeveloperName: System.UnicodeString;
    fCustomerCompany: System.UnicodeString;
    fSerialNo: System.Integer;
    fHashedKey: System.UnicodeString;
    fEdition: System.UnicodeString;
    FAbilities: TLicenseAbilities;
    FBuildDate: System.TDateTime;
    FCount: System.Integer;
    FForceEval: System.Boolean;
    fLicenseType: TLicenseType;
    fMessage: System.Classes.TStringList;
    fValidatingOnly: System.Boolean;
    fLicVersion: System.UnicodeString;
    FIsEmpty: System.Boolean;
    FEvalReason: System.UnicodeString;
    function GetEditionString: System.UnicodeString;
    function GetIsBundled: System.Boolean;
    function GetExpirationDateString: System.UnicodeString;
    function GetIWLicense: System.UnicodeString;
    procedure SetLicenseKey (const Value: System.UnicodeString);
    procedure SetFields (const aLicense: System.UnicodeString);
    function GetMessage: System.UnicodeString;
    procedure ReadLicenseType;
    procedure Crash;
    procedure CheckBlockedKeys (aSerialNo: System.Integer);
    function GetIDEForLicense: System.Integer;
    function GetBuildDateString: System.UnicodeString;
  public
    constructor Create (aStatus: System.Boolean;
      aLicVersion: System.UnicodeString); overload;
    destructor Destroy; override;
    property IsBundled:System.Boolean read TIWLicense.GetIsBundled;
    property Edition:System.UnicodeString read fEdition ;
    property CustomerName:System.UnicodeString read fCustomerName;
    property CustomerCompany:System.UnicodeString read fCustomerCompany;
    property DeveloperName:System.UnicodeString read fDeveloperName;
    property Email:System.UnicodeString read fEmail ;
    property HashedKey:System.UnicodeString read fHashedKey ;
    property ExpirationDate:System.TDateTime read fExpirationDate;
    property SerialNo:System.Integer read fSerialNo;
    property EditionString:System.UnicodeString
      read TIWLicense.GetEditionString ;
    property ExpirationDateString:System.UnicodeString
      read TIWLicense.GetExpirationDateString ;
    property AsString:System.UnicodeString read TIWLicense.GetIWLicense;
    property LicenseType:TLicenseType read fLicenseType;
    property LicenseKey:System.UnicodeString write TIWLicense.SetLicenseKey;
    property BuildDate:System.TDateTime read FBuildDate ;
    property BuildDateString:System.UnicodeString
      read TIWLicense.GetBuildDateString ;
    property IDEForLicense:System.Integer read TIWLicense.GetIDEForLicense;
    property Message:System.UnicodeString read TIWLicense.GetMessage;
    property IsEmpty:System.Boolean read FIsEmpty;
    property EvalReason:System.UnicodeString read FEvalReason ;
    procedure ThirdPartyHook (const AText: System.UnicodeString;
      AEval: System.Boolean);
    function CanIDoThis (AAbility: TLicenseAbility): System.Boolean;
    procedure Reset;
    function GetHTMLMessage: System.UnicodeString;
    procedure GetLog (ALog: System.Classes.TStrings);
    function GetEvalReason: System.UnicodeString;
    function SetSystemLocal: System.UnicodeString;
    function GetLicData: System.UnicodeString;
    class function ValidateLicense
      (var aErrorMessage: System.UnicodeString): TLicenseType;
  end;
这个类定义在IWKlooch单元中,只要修改TIWLicense的实现代码,就能破解IW。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/10 13:41:16
70楼: 其中最重要的一个成员函数是CanIDoThis,这个函数在IWStart中被调用。设法让它始终返回True.另一个class function ValidateLicense也很重要,设法让他始终返回ltUltimate.
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/10 18:01:45
71楼: 汇编语句基础
基础操作
 

基本运算指令

INC/ DEC 自增自减
ADD 目的数,源     源加到目的数上
SUB 目的数,源
NEG 求相反数(按位取反后+1,也就是求补)
符号位影响

CF表示无符号整数运算是否溢出
OF表示有符号整数运算是否溢出
ZF表示结果是否为0
SF表示结果是否为负
PF表示目的操作数最低字节中的1是否偶数个
MOV系列

MOV系列都是数据传送指令,包括MOV, MOVZX, MOVSX

MOV指令有一些规则必须遵守:

两操作数尺寸相同
两操作数不能同时为内存操作数
目的操作数不允许是CS,EIP,IP
立即数不能直接送段寄存器(保护模式下不允许操作段寄存器)
对于尺寸不同的数之间数据传送就必须使用MOVZX和MOVSX,MOVZX是零扩展传送,也就是适用于传送无符号整数,指令会用0填充高位。而对于有符号数则用MOVSX

 

类似一个功能的是XCHG指令,用来交换两个操作数,但是注意它的两个操作数不能同时是内存操作数。

 

其他数据操作符

OFFSET 返回一个变量相对于其所在段的开始地址的偏移量
PTR 重载变量的默认尺寸
TYPE 返回数组中每个原书的大小(字节数)
LENGTHOF 返回数组内元素的个数 
SIZEOF 返回数组初始化时占用的字节数 = lengthof * Type
寻址

[cpp] view plaincopy
; 间接寻址  
.data var BYTE 10h  
.code   
mov esi, OFFSET var    ;esi存放var的偏移地址  
mov al, [esi]          ; mov al, var  
; 间接寻址也可用于方便的遍历数组  
.data   
arr BYTE 10,30,50,80  
.code  
mov esi, OFFSET arr  
mov al, [esi] ; al= 10  
inc esi  
mov ah, [esi] ; ah = 30  
;变址操作数(indexed operand) 把常量和寄存器相加得到一个有效地址,使用任意的32位通用寄存器作为变址寄存器  
; 格式 constant[reg] 或[constant + reg]   
array[esi]  
;等价  
[array + esi]  
;对于不是一个字节的元素  
array2[esi*4] ;第四个DWORD  
 

 

循环和条件
jmp 无条件跳 
loop 使用ecx做计数器每次循环减1. 具体步骤是先ecx自减1,后看看是否为0,不是则调整到目的地址,否则不跳转。loop的跳转范围为-128~127字节(约42条指令)
使用loop做数组求和的例子

[cpp] view plaincopy
TITLE sum (sum.asm)  
INCLUDE Irvine32.inc  
.data  
intarr WORD 100h, 200h, 300h, 400h  
.code  
main PROC  
  mov edi, OFFSET intarr   ; intarr 的地址  
  mov ecx, LENGTHOF intarr ; 循环计数器  
  mov eax, 0          ; 累加器清零  
L1:  
  add eax, [edi]          ;sum += intarr[edi]  
  add edi, TYPE intarr      ; 数组下标+1  
  loop L1  
  exit  
main ENDP  
END main  
 

 

过程和条件处理
前提知识
运行时栈

CPU直接管理的内存数组,使用SS和ESP两个寄存器保护模式下,SS存段选择子ESP存的是只想堆栈内特定位置的一个32位偏移值,也就就是栈顶了。一般无需手工操作。运行时栈的增长是负的,也就是每压入一个值,栈顶指针ESP减小(一般是4)

对运行时栈的操作有PUSH POP, PUSHFD POPFD, PUSHAD PUSHA POPAD POPA这些

PUSH压入16位或32位操作数,保护模式下总是32位的。
PUSHFD用来压入32位的EFLAGS寄存器的值
PUSHAD 按一下顺序压入寄存器:EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI
PUSHA类似的压入:AX, CX, DX, BX, SP, BP, SI, DI
定义和使用过程
汇编里的过程相当于高级语言里的函数。



 

[c-sharp] view plaincopy
procname PROC  
procname ENDP  
; 除了main之外的过程都应该用ret返回  
; main调用了ExitProcess结束进程  
; 过程的返回值和参数通常都用寄存器保存  
; C和C++ 典型情况下使用AL返回8位值,AX返回16位值,EAX返回32位值  
 

    所以,调用过程无法就是给寄存器赋值,再call一下。

此外,还可以使用USES 操作符来为PROC伪指令指定要使用的寄存器,它会自动生成push和pop相应寄存器的命令。这个操作符只需要写在PROC伪指令后面就可以

条件处理
相关指令
AND dest, src   . 总是清除溢出标志和进位标志, 操作数尺寸必须相同
OR          . 总是清除溢出和进位标志
XOR          .异或
NOT reg[mem]  .按位取反
TEST          .在每对操作数之间执行隐含的与操作,并置标志位。和AND的区别在于不修改目的操作数。
BT,BTC,BTR,BTS  . 。。。 暂时用不到
CMP          . 在每对操作数间进行隐含减法操作, 不修改操作数.
[cpp] view plaincopy
;test 来测试位  
test a1, 00001001b  
;测试0和3位是否为0,仅当两个都为0时,ZF = 1  
;cmp 测试源和目标是否相等,隐含把目标数-源, 无符号数情况如下:  
mov ax, 5  
cmp ax, 10 ; ZF= 0 CF  =1  
cmp ax, 5  ; ZF = 1 CF = 0  
cmp ax, 3  ; ZF =  0 CF = 0  
; 有符号数情况如下:  
mov ax, -5  
cmp ax, -3  ; SF!= OF  
cmp ax, -8  ; SF = OF  
cmp ax, -5  ; ZF = 1  
 

条件跳转指令
条件跳转都是成对的比如jz 就对应一个jnz,MASM要求跳转的目的地址在本过程内

jz : if(ZF == 1) jump
jc : if (CF == 1) jump
jo : if (OF == 1) jump
js : if( SF == 1) jump
jp : if( PF == 1) jump
je : 相等(CMP结果)则跳转
jne: cmp 不等则跳
jcxz: cx = 0 则跳
----------无符号数比较
ja : if (left > right ) jump
jae: if(left >= rhight) jump
jb : if( left < right) jump
jbe :..
jnbe = ja
----------有符号数比较
jl : cmp 小于则跳
jg : cmp 大于则跳转
jge :..
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/10 19:32:19
72楼: 如何知道应该在哪里动刀呢?咱们工具箱中的另一件利器出场:DCU32INT.EXE。DCU32INT是伟大的老毛子Alexei Hmelnov的作品,目前已支持XE8,是一个命令行工具,用法:
DCU32INT IWKlooch.dcu
程序运行将生成IWKlooch.int文件,这个文件将告诉你IWKlooch中所有的类定义,以及类实现的汇编代码与二进制代码。有了这个,你就可以将二进制代码输入ultraedit/HexWorkshop中去搜索/替换了。
注意汇编语言一般都使用相对地址,在改动的时候不要破环了DCU/BPL文件结构,你会发现用来填充的NOP(0x90)指令很好用。附DCU32INT.EXE下载:
此帖子包含附件:c5soft_2015510193218.rar 大小:348.4K
----------------------------------------------
-
作者:
男 drroc (kylixfans) ★☆☆☆☆ -
盒子活跃会员
2015/5/11 8:49:13
73楼: 10个IW的问题,9个是破解相关的,本末倒置了
----------------------------------------------
MVCXE中国首个DELPHI MVC WEB框架:http://www.mvcxe.com/
作者:
男 llf (天天打) ★☆☆☆☆ -
盒子活跃会员
2015/5/11 9:21:04
74楼: 大神级人物,收藏。
----------------------------------------------
-
作者:
女 blbz (冰力不足) ▲▲▲▲▲ -
普通会员
2015/5/11 13:00:00
75楼: 太棒了, 感谢 c5soft大神无私分享! 这才是真功夫!
在努力学习理解中, 等俺理解透了再把这个破解教程做成视频教程,这样就方便学IW的同学们.

大神想到什么就写什么,信马由缰,这样教的人思绪酣畅淋漓,学的人也学到真实的知识和考虑问题的风格.
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/11 23:16:22
76楼: OneUnit Website,最简单的IW网站
本实例只用一个ServerController.pas文件,构建了一个网站,虽然这个网站啥也干不了,但他给你展示了IW构建网站的必要元素及它们之间的关系,对于初学者或许有帮助。对于有一定基础的开发人员,本例将告诉你,如何不用TDataModule来存取轻量级的session数据。
此帖子包含附件:c5soft_2015511231622.rar 大小:55.3K
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/12 8:30:29
77楼: 对1楼笔记的求证
1楼笔记摘自atozed官方IntraWeb XIV History 14.0.13,现在到了14.0.39,已时过境迁了,经原代码比较,发现1楼记录的js之间关系的对于14.0.39是错误的。
对于14.0.38/39版:
IWBase.js=IWPreScript.js+IWBrowser.js+IWCommon.js+IWCL.js+IWAjax.js
IWLib.js=jquery.js+jquerymaskedinput.js
----------------------------------------------
-
作者:
男 wrt54gs (wrt54gs) ▲▲▲▲△ -
注册会员
2015/5/12 10:07:51
78楼: c5soft,非常感谢你的帖子。我想从框架方面请教你一些问题:

因为我从你的分享信息看得出来,有一段时间,你研究过RTC,后来转向IW。其中你的一处分享里面也提到,采用IW作为中间件模式。

这里请教一下,RTC如果作为中间件,也可以同时支持移动/WEB/WinApp,那么是什么转向IW?他们各有什么实际的优缺点?

IW问世已经太久了,久的超过.NET,但是发展一直是问题。CSS等都是IW后期出现更不用说JS突然的爆发。而类似IW的unigui也开始走向成熟,从WEB/移动方面,感觉更适合快速开发。

感谢
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/12 11:33:11
79楼: 我没有真正用RTC做过项目,IW用来做过项目的,运行了10多年,一直很稳定。我只能说IW好用,不能说rtc不好用。
至于Web开发框架,最近几年发展很快,选择太多。抛开IW,我用Nodejs+Dojo做了一个项目。Nodejs与IW比其优势在于:前后台使用一门Javascript语言,网页能够控制到任何细节,程序的运行效率很高。Nodejs做开发的劣势在于,受Javascript语言的限制,项目大了很难调试,尤其是那种或有或无的Bug你很难找到。至于Unigui我没摸过,不发表意见。
作为工具,没有最好的,只有你最熟练的。
仅供参考。
----------------------------------------------
-
作者:
男 wrt54gs (wrt54gs) ▲▲▲▲△ -
注册会员
2015/5/12 13:23:56
80楼: c5soft,谢谢你的回复。

说实话,习惯了Windows平台开发,对于网页的控制都比较弱,这或许也是另外一个因素,IW不能快速发展和推广。

因为会Delphi,大部分不擅长网页。

而擅长网页的各种脚本的,却又不擅长Delphi或者在这种情况下,PHP,Javascript.NET,CSS等等更适合满足他们。

并且IW太贵,比Delphi都贵,呵呵
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/12 20:36:13
81楼: 最新版的openssl 1.0.2a win32下的dll,配合iw14.0.39能够正常使用
此帖子包含附件:c5soft_201551220368.zip 大小:1,015.7K
----------------------------------------------
-
作者:
男 hwkjzyh (汉卿) ★☆☆☆☆ -
盒子活跃会员
2015/5/13 13:16:43
82楼: iw14文件上传控件问题:
IntraWeb XIV以后新加了一个TIWFileUploader文件上传控件,替换了以前的TIWFile,iw14的面版上还有TIWFile控件,几乎不能用了。

使用iw14自己带的demo FileUploader上面有TIWFileUploader文件上传控件,试了一下发现:
可以上传:
   txt,word,excel,pdf,bmp图形文件

不能上传:
   jpg图形文件,压缩文件,exe文件

----------
iw14以前版本的TIWFile文件上传控件
   什么文件都可以上传
此帖子包含附件:
JPEG 图像
大小:10.3K
----------------------------------------------
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/13 22:08:21
83楼: 用IW的Demo程序做了以下测试,用IE9上传JPG的确有问题,用Chrome就没问题。通过将原文件与上传保存的文件比较,发现上传保存的文件比原文件大,通过HexWorkShop比较,发现保存的文件在头上插入156字节,在尾多写49字节。这应该是IW的Bug。
----------------------------------------------
-
作者:
男 drroc (kylixfans) ★☆☆☆☆ -
盒子活跃会员
2015/5/14 9:42:57
84楼: 汗,好大的bug
----------------------------------------------
MVCXE中国首个DELPHI MVC WEB框架:http://www.mvcxe.com/
作者:
男 gdsa (文稠紧) ★☆☆☆☆ -
盒子活跃会员
2015/5/15 17:16:04
85楼: 近期发现的一些问题,大家共同探讨:
IW+JS这种模式,如果客户端超期了,即超过了SessionTimeout的设定时间,页面肯定不能预期的接收到AJAX回调内容(下有截图)。这样以来,如何在超时后,让客户端页面有一个很好的显示?
我的思路有两个:
一个是后台(IW)判断,比如自定义类中收到AJAX的模块可以这样处理
if aSession.Terminated then  //我用了这个判断,但不行
  begin
    aReply.WriteString('系统超时。。');
    Result := True;
  end else
  begin
    aReply.ContentType := MIME_HTML;
    s := aRequest.QueryFields.Values['xxx'];
    aReply.WriteString('正常返回');
    Result := True;
  end;
一个是前台收到回调内容后处理(JS),个人感觉这样不好,如下
if spilt(data....

我水平有限,没有很好解决。大家看看如何解决更好,可以研究一下。
此帖子包含附件:
JPEG 图像
大小:258.4K
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/15 19:14:58
86楼: IW+JS模式下IW SessionTimeout的解决方法
1.服务器端,调用WebApplication.MarkAccess,及时延续SessionTimeStamp:
function TCustomContent.Execute(aRequest: THttpRequest; aReply: THttpReply;
  const aPathname: string; aSession: TIWApplication;
  aParams: TStrings): boolean;
begin
  aSession.MarkAccess;
  ...
end;
2.在客户端增加处理服务器端返回的time-out页面,自动跳转到起始页,或给出跳转提示。下面是FlatGrid新的错误处理代码:
errorProcess: function (XMLHttpRequest, textStatus, errorThrown) {
    this.unsetLoading();
    $('.pPageStat', this.divGridPager).html(options.msgError);
    var sessionClosed = XMLHttpRequest.responseText.search(/Click here to start a new session of/) > -1 ? true : false;
    if (options.autoStartOnSessionClosed)
        window.location.replace('/$/start');
    else
        this.setTitle("<a href='/$/start'>由于您长时间未操作,服务器端已关闭,点击这里重新开始系统!</a>");
},//end of  errorProcess
此帖子包含附件:
JPEG 图像
大小:38.0K
----------------------------------------------
-
作者:
男 gdsa (文稠紧) ★☆☆☆☆ -
盒子活跃会员
2015/5/15 23:27:32
87楼: 先说一下,我的测试环境是XE7+IW14,用的套路是盒子另一篇贴子提到的IW+EasyUI的解决方案,主要原因有两个:1、那个方案中提到的很多用法,在官网的例子中都有介绍;2、楼主的水平太高,可能你介绍的这些用法比较低层,我学习起来感觉有些困难(略有复杂)。
所以再说以下:
1、你提供的aSession.MarkAccess;在我那种回调用法中无效,得到的结果和我上面的截图一样;
2、你在客户端的解决方案,就跟我上面讲的一样,由于我没有完全按你这个套路来设计AJAX,所以也无法用你给出的这些JS代码来测。水平有限,更无法取其精华应用之。
但仍然感谢你的回复,希望此贴能给所有在用IW的朋友更多参考,踊跃留言。

我在这里也简单总结一下IW14中实现AJAX的几个关键步骤:
1、继承TContentBase,生成一个自定义类,由Execute函数完成回调;
2、ServerController的Config事件中,用THandlers.Add方法注册(绑定)上面的自定义类;
3、工程中可以不用生成任何IWFrom,直接用wwwroot下的index.html进入主页;
4、页面JS中可用Jquery里的相关AJAX方法,调用前面注册的虚拟脚本,如下
$.ajax({
  type: "post",
  url: "Test.pas",  //THandlers.Add注册的虚拟动作脚本
  data: {
    HtmlTxt: $("#edt1").val()  //客户端传给IW的数据
  },
  async: false,  //zhang_y_b朋友的文章里介绍的一定要这样用,不太明白为何?
  success: function(data) {
    $('#lab1').text(data);  //AJAX成功返回后,写入到页面
  }
});
(以上只是概要,详细的盒子上、网上、官方DEMO里都有,请自查)

个人喜欢这套处理机制的原因,还是觉得其更清晰,好掌握。也建议楼主有空研究一下,对IW14系列中提出的这套新机制,聊聊看法。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/15 23:55:50
88楼: $.ajax({
  type: "post",
  url: "Test.pas",  //THandlers.Add注册的虚拟动作脚本
  data: {
    HtmlTxt: $("#edt1").val()  //客户端传给IW的数据
  },
  async: false,  //zhang_y_b朋友的文章里介绍的一定要这样用,不太明白为何?
  success: function(data) {
    $('#lab1').text(data);  //AJAX成功返回后,写入到页面
  }
  error:function(XMLHttpRequest, textStatus, errorThrown){
  var sessionClosed = XMLHttpRequest.responseText.search(/Click here to start a new session of/) > -1 ? true : false;
  ...
  }


});
----------------------------------------------
-
作者:
男 gdsa (文稠紧) ★☆☆☆☆ -
盒子活跃会员
2015/5/16 1:36:12
89楼: 多谢。
之前误以为function(XMLHttpRequest...是IW的内置函数,原来也是jquery的。
这种判断IW超时错误后返回特定字串的方式,的确可行。我之前想到在success中用,但你这种在error中使用肯定是更合理的。
也大概看明白了你的程序里有全局参数来控制是否主动跳转到主页,所以多了一层if
在没在其它更好的解决方案前,就先这样处理了,足够用了。继续研究。。。
----------------------------------------------
-
作者:
男 pp0123 (pp0123) ▲▲▲▲▲ -
普通会员
2015/5/16 2:47:07
90楼: 请教 c5soft, IWKlooch 的 CanIDoThis 我猜还可以, 但 ValidateLicense 确搞不懂如何强制返回 ltUltimate. 已把 C6 40 3D 01 转为 C6 40 3D 04. 似乎还需什么的?
----------------------------------------------
-
作者:
男 hwkjzyh (汉卿) ★☆☆☆☆ -
盒子活跃会员
2015/5/16 11:58:45
91楼: 走遍天下 老师
请问:
您以前用的Delphi7下的IW9.0.42版本服务器运行稳定不?

我用的iw10.0.23版本,服务器装的是win2003+sql2000+IIS6 运行几个月服务器就死机,通过远程可以进入服务器,重启动后又好了。系统运行好多年了,其他问题没有,就这个服务器死机问题,软件的数据处理量还是比较大。
----------------------------------------------
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/16 13:56:30
92楼: 回91楼hwkjzyh (汉卿)的帖子
我的一个项目Delphi7下开发,用IW9.0.42运行很稳定,运营10多年了,很少出故障。曾尝试升级到10.0.23,11.0.63都存在问题,被迫换回9.0.42。
IW9.0.42问题是IWMenu在Chrome浏览器下显示有问题,仅能较好的支持IE浏览器。
IW14版以下输出的网页主要针对IE浏览器,对css标准未提供很好支持。
前几天我把原来IW9.0.42开发的应用换成采用FlatGrid的新页面,IW14.0.39将接受时间的考验。

回90楼pp0123 (pp0123)的帖子
有关IW破解的内容,点到为止,有条件还是应该支持一下正版,399欧元的价格不算贵。
----------------------------------------------
-
作者:
男 hwkjzyh (汉卿) ★☆☆☆☆ -
盒子活跃会员
2015/5/16 18:54:06
93楼: 谢谢!
我也把iw10.0.23下的换成iw9.0.42试一下。

我也看好IW14.0.39希望是iw9.0.42之后的,又一个稳定的版本。
----------------------------------------------
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/16 19:06:15
94楼: 关于暴力破解中所用到的汇编指令机器码知识
此帖子包含附件:c5soft_201551619615.doc 大小:67.5K
----------------------------------------------
-
作者:
男 robinson2006 (Leo) ▲▲▲▲▲ -
普通会员
2015/5/16 20:08:45
95楼: 楼主你出本IW的书吧,我们一定会大力支持.
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/17 10:03:29
96楼: 在Intraweb 14版中让网站提供静态网页支持
Intraweb 从11版开始通过IPM(Integrited Page Mode)功能,不仅支持静态网页,同时还支持静态网页与动态页面之间相互跳转。下面是14版提供静态网页支持的两者种设置方法。
第一种:通过TIWMimeTypes注册html文件类型
uses IWMimeTypes;
...
procedure TIWServerController.IWServerControllerBaseConfig(Sender: TObject);
begin
  TIWMimeTypes.RegisterType('.html', 'texl/html', True);
  ...
end;
第二种:通过继承TContentBase,重写execute方法实现
uses IW.Content.Base, IW.Content.Handlers;
...
type
  TCustomContent = class(TContentBase)
  protected
    function Execute(aRequest: THttpRequest; aReply: THttpReply;
      const aPathname: string; aSession: TIWApplication; aParams: TStrings)
      : boolean; override;
  public
    constructor Create; override;
  end;
...
constructor TCustomContent.Create;
begin
  inherited;
  mFileMustExist := False;
end;
function TCustomContent.Execute(aRequest: THttpRequest; aReply: THttpReply;
  const aPathname: string; aSession: TIWApplication;
  aParams: TStrings): boolean;
begin
  aSession.MarkAccess;
  if SameText(ExtractFileExt(aPathname),'.html') then
  if FileExists(aPathname) then begin
      aReply.ContentType:='text/html; charset=UTF-8';
      aReply.SendFile(aPathname, True, False);
      Result := True;
  end else begin
      aReply.WriteString('<html><head><title>' +
        '页面' + cName + '不存在' +
        '</title></head><body>' +
        '<img src="/images/404.jpg" />' +
        '</body></html>');
      Result := True;
    end;
 end;
end;
...
initialization
THandlers.Add('/', '', TCustomContent.Create);
...
end.
----------------------------------------------
-
作者:
男 littlestone08 (littlestone08) ▲▲▲▲▲ -
普通会员
2015/5/18 20:08:35
97楼: 好贴,关注学习
----------------------------------------------
我和我追逐的梦,擦肩而过
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/18 22:33:43
98楼: FlatGrid 1.0.0.2 发布
1.支持Session TimeOut处理
2.支持合计显示
此帖子包含附件:c5soft_2015518223340.rar 大小:2.25M
----------------------------------------------
-
作者:
男 wrt54gs (wrt54gs) ▲▲▲▲△ -
注册会员
2015/5/19 10:30:56
99楼: Intraweb 有 XE7版本么?
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/19 17:22:52
100楼: 按照69、70楼的思路,很容易就能暴破14.0.39 for XE7,这不是理论设想,而是实战的总结。出于尊重开发者创造成果的考虑,最新版本的破解版不便发布。
----------------------------------------------
-
作者:
男 hwkjzyh (汉卿) ★☆☆☆☆ -
盒子活跃会员
2015/5/19 18:48:53
101楼: 在iw11以前的版本安装后有一个文件\source\IWResourceStrings.pas
可以进行一些汉化,然后拷贝到\LibD7目录下,程序运行后,对一些对话框导航条就有汉字提示了。

在iw14安装后变成IntraWeb XIV\Interfaces\Lib\IWResourceStrings.Intf
不知那位朋友,处理过这样的事没。
此帖子包含附件:
JPEG 图像
大小:13.6K
----------------------------------------------
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/19 22:55:09
102楼: Intraweb IWResourceStrings Localization

IW14版与以前的版本中的IWResourceStrings.pas结构完全一样,不过条目变化而已,我将IW的IWResourceStrings整理成一个Excel表,前期做了翻译的热心朋友们可以把你们的成果奉献一下,咱们共同来维护这个IWResourceStrings.XLS文件,有了这个文件,就可以自动生成IWResourceStrings.pas文件了。Excel表设Version、Order、Catalog、Name、Value、Chinese六列,Version存放版本号,Order是原始顺序,Catalog是分类,Name是变量名,Value是变量值,Chinese放汉语翻译。为便于维护,Value中的回车换行用#13#10保存。
此帖子包含附件:c5soft_201551922559.rar 大小:21.8K
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/20 5:19:55
103楼: The 2nd Edtion IE7 Bug Fixed for IW14.0.39
上次的补丁仅能在IE7 Quirk模式下工作,在IE7的标准模式下有问题,这次完善了。
此帖子包含附件:c5soft_201552051954.rar 大小:706.7K
----------------------------------------------
-
作者:
女 yyzdl (yyzdl) ★☆☆☆☆ -
盒子活跃会员
2015/5/20 10:30:17
104楼: IntraWeb XIV History

RSS feed here.

14.0.40

Delphi / RAD Studio XE8 support
Bug fix: A JavaScript error caused IW applications to fail under IE7
Bug fix: Change that cause fail of JavaScript when using templates was rolled back
Bug fix: When using start parameters, IW_AjaxID parameter was added to the existing parameter list using '?' as a separator, causing 2 question marks to appear in the url
Bug fix: Under very rare circumstances, the destruction of a IWForm/DataModule could cause an Access violation
Modified: If IWRegion.StyleRenderOptions.RenderBorder = False, no border style attribute is rendered. This is the correct, expected behaviour of this property. As a side effect, when a IWRegion is rendered with StyleRenderOptions.RenderBorder = True, setting it to false during an Async (AJAX) call won't cause the border to be invisible again. In this case, the IWRegion.BorderOptions property should be used instead.


不知道这个,是不是肖老师提报的
Bug fix: A JavaScript error caused IW applications to fail under IE7
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/20 11:08:51
105楼: 这个不是我报的。我感兴趣的是这个bug是如何修复的,是恢复老版本的做法用Delphi来写html还是修改新版的js,官网上14.0.40下载不了。下载连接报404文件不存在错误,是不是atozed刚放上去,因发现新的bug又撤下了。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/20 21:31:34
106楼: IntraWeb was originally designed by Chad Z. HOWER, alias KUDZU, back in 1996/97, and was then called Portcullis/IAG. Chad was the creator of Winshoes, later renamed Indy, which is the actual Socket and TCP/IP Protocol component suite implementation for Delphi. This explains why IntraWeb includes a full featured .HTTP Server, even including the very nice SSL layer.
The current version of IntraWeb is maintained by a developer team at Atozed Software. Chad is no longer actively involved with IntraWeb's further development. He is still an end user of IntraWeb and gives input to the development team.
----------------------------------------------
-
作者:
女 yyzdl (yyzdl) ★☆☆☆☆ -
盒子活跃会员
2015/5/21 12:31:53
107楼: 历史很悠久嘛
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/22 11:25:09
108楼: 限时分享:2015-5-23日上午8:00前有效。
http://pan.baidu.com/s/1ntpADNN
密码:yhjf 阅后即焚汉语拼音首字母
拿到的请注意保存,请勿在网上发布。
错过了的请勿要求再放,机会仅此一次。
----------------------------------------------
-
作者:
男 wpdnxx (执爱delphi) ▲▲▲▲▲ -
普通会员
2015/5/22 15:30:11
109楼:     非常感谢肖老师提供的资料和工具,我是新手,现在正如痴如醉地学习Inraweb,没有最新的相关资料,又不精通英文,只有看D7下的老书,过程相当艰辛,结果相当痛快
在此路上遇到肖老师您这样的好人,感激不尽!
----------------------------------------------
-
作者:
男 gdsa (文稠紧) ★☆☆☆☆ -
盒子活跃会员
2015/5/22 16:50:30
110楼: 108楼,能不能说一下安装步骤?
我以前搞的D版,装起来都可方便:直接装官网上的EXE包,然后替换几个文件就OK了。
这种装法好麻烦,,,简单说下吧

是不是安装官方下的原版,然后整个目录复制过去就OK?
----------------------------------------------
-
作者:
男 gaoyong_gy (gaoyong_gy) ★☆☆☆☆ -
盒子活跃会员
2015/5/22 17:55:16
111楼: 今天在xe7及xe8下试了,一切基本正常。准备删除电脑里的xe7了。只用xe8,节省点空间。
----------------------------------------------
Delphi 的移动程序开发,是您不可再错失的机遇:http://blog.163.com/you888@188/blog/static/6723961920169319529515/
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/22 19:23:42
112楼: 回110楼gdsa的帖子
安装参照56楼,所有文件全包含,无需再去下载。这里有很多帖子讨论,自己翻翻。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/22 22:10:35
113楼: IW的FileUploader引用了一个开源项目,先做一个标记,有空的时候研究一下,看看能不能修复文件上传的Bug
http://valums-file-uploader.github.io/file-uploader/
----------------------------------------------
-
作者:
男 hwkjzyh (汉卿) ★☆☆☆☆ -
盒子活跃会员
2015/5/22 22:33:20
114楼: 确实是这个开源项目,试了一下这个开源项目,我在iw14.0.6版本中试着上传文件后,就有这样的{success:true} 提示
----------------------------------------------
作者:
男 hwkjzyh (汉卿) ★☆☆☆☆ -
盒子活跃会员
2015/5/23 14:04:47
115楼: 请问肖老师
修改查看IWData_Debug.res的资源文件用什么工具好一些?
----------------------------------------------
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/23 14:35:59
116楼: ResHacker
此帖子包含附件:c5soft_2015523143558.rar 大小:898.0K
----------------------------------------------
-
作者:
男 pp0123 (pp0123) ▲▲▲▲▲ -
普通会员
2015/5/23 18:39:15
117楼: 呜哇, 怎么如此突然, 人家求了N年呢 ! ssalhambra@163.com
----------------------------------------------
-
作者:
男 gdsa (文稠紧) ★☆☆☆☆ -
盒子活跃会员
2015/5/23 20:29:51
118楼: 最近这种需求没有了,以前总是用一个叫eXeScope的工具,也不知在你们看来好不好用,,,但看这贴这么火、大家都这么无私,我也发出来吧。。
此帖子包含附件:gdsa_2015523202951.rar 大小:487.6K
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/23 22:34:25
119楼: Delphi XE8 控件手工安装方法

一、文件夹结构与坏境设置
创建下列文件夹:
D:\Projects
D:\Projects\Bin
D:\Projects\LibD22
D:\Projects\LibD22\Win32
D:\Projects\LibD22\Win64
D:\Projects\Components

将Intraweb、EhLib、FastReport等控件放置到D:\Projects\Components下,例如:
D:\Projects\Components\IW14040
D:\Projects\Components\EHLib70133
D:\Projects\Components\FR5203
......

将你自己的项目也放在D:\Projects下,这样将整个D:\Projects后备出来,什么都有了。重装系统的时候只需要通过导入几个reg文件就能重装所有控件。

将D:\Projects\Bin添加到系统PATH环境变量中。我的电脑=>属性=>高级=>环境变量=>PATH

进入Delphi XE8将D:\Projects\LibD22\$(platform)加到Library Path中。如果打算将D:\Projects放到其他位置,可以在在Delphi的设置中添加环境变量DevDir=D:\Projects,这样就可以把D:\Projects\LibD22\$(platform)变为$(DevDir)\LibD22\$(platform)。改变D:\Projects的位置时只需要改变DevDir设置即可。

二、在每个控件的文件夹下准备一个D22CopyAll.bat批处理文件,执行该批处理,将控件的bpl文件复制到D:\Projects\Bin下,将控件的dcu、dfm、dcp、res等连接需要的文件复制到D:\Projects\LibD22\Win32/64下,对于32位与64位的文件分别复制到D:\Projects\LibD20\Win32、D:\Projects\LibD20\Win64下。

三、安装控件
这里有两种方法:
其一是通过Delphi菜单Component/Install Packages,选择D:\Projects\Bin下的相应文件,一般是dcl*.bpl文件。
其二是通过regedit命令直接编辑注册表HKEY_CURRENT_USER\Software\Embarcadero\BDS\16.0\Known Packages,在里面直接添加控件。
我推荐使用第二种方法,这样就可以准备一个Current_User_Delphi22_Packages_3rdParty.reg文件,下次重装系统时直接双击这个文件就把所有第三方控件装入系统了。
为了还原系统的初始状态,可以在导入第三方控件前通过regedit将HKEY_CURRENT_USER\Software\Embarcadero\BDS\16.0\Known Packages注册表分支导出,保存为Current_User_Delphi22_Packages_Primary.reg,在这个文件的前部增加一行,输入:[-HKEY_CURRENT_USER\Software\Embarcadero\BDS\16.0\Known Packages],通过这个命令清除所有的控件,然后通过后续命令将Delphi XE8默认的控件装入,然后再通过编辑Current_User_Delphi22_Packages_3rdParty.reg增减第三方控件。


Current_User_Delphi22_Packages_3rdParty.reg举例:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Embarcadero\BDS\16.0\Known Packages]
;FastReport Components
"D:\\Projects\\Bin\\dclfs22.bpl"="FastScript 1.9 Components"
"D:\\Projects\\Bin\\dclfsDB22.bpl"="FastScript 1.9 DB Components"
"D:\\Projects\\Bin\\dclfsADO22.bpl"="FastScript 1.9 ADO Components"
"D:\\Projects\\Bin\\dclfsIBX22.bpl"="FastScript 1.9 IBX Components"
"D:\\Projects\\Bin\\dclfsTee22.bpl"="FastScript 1.9 Tee Components"
"D:\\Projects\\Bin\\dclfrx22.bpl"="FastReport 5.0 Components"
"D:\\Projects\\Bin\\dclfrxDB22.bpl"="FastReport 5.0 DB Components"
"D:\\Projects\\Bin\\dclfrxADO22.bpl"="FastReport 5.0 ADO Components"
"D:\\Projects\\Bin\\dclfrxIBX22.bpl"="FastReport 5.0 IBX Components"
"D:\\Projects\\Bin\\dclfrxDBX22.bpl"="FastReport 5.0 DBX Components"
"D:\\Projects\\Bin\\dclfrxe22.bpl"="FastReport 5.0 Exports"
"D:\\Projects\\Bin\\dclfrxTee22.bpl"="(untitled)"
"D:\\Projects\\Bin\\dclfrxcs22.bpl"="FastReport 5.0 Client/Server Components"
;Ehlib Components
"D:\\Projects\\Bin\\DclEhLib220.bpl"="EhLib 7.0 Components"
"D:\\Projects\\Bin\\DclEhLibADODataDrivers220.bpl"="EhLib 7.0 DataDrivers for ADO"
;Other 3rd Party Components
"D:\\Projects\\Bin\\dclIntraweb_14_DXE8.bpl"="IntraWeb 14.0 Design Package for RAD Studio XE8"
"D:\\Projects\\Bin\\G114_d220.bpl"="TurboPower OnGuard 1.14 Designtime package - VCL190"
----------------------------------------------
-
作者:
男 lzd123 (昨夜清风) ★☆☆☆☆ -
盒子活跃会员
2015/5/24 15:57:44
120楼: 太突然了呀,求大神发个邮箱吧:lzd123@sina.com

感激万分!
----------------------------------------------
向你学习
作者:
男 shileizi (sl) ▲▲▲▲▲ -
普通会员
2015/5/24 18:53:22
121楼: 虽然没有用到,但是难得在坛上看到这么精彩的帖子,赞一个
----------------------------------------------
-
作者:
男 jiuk (愛像一陣風) ▲▲▲▲△ -
注册会员
2015/5/24 20:55:30
122楼: c5soft (走遍天下)

  IntraWeb v14.0.40  生成Project1.exe在Project1.exe放入index.html以http://127.0.0.1:8888/$/index.html 或者http://127.0.0.1:8888/index.html都开不开

改成放一个ZIP文件http://127.0.0.1:8888/.zip也打不开

设计的静态网页
<table width="980" height="40" border="0" align="center" background="/templates/img/menu_bg.png">

menu_bg.png这个图片显示不出来,我用的IWLayoutMgrHTML1不知道是为什么
----------------------------------------------
Delphi业余爱好者
作者:
男 gdsa (文稠紧) ★☆☆☆☆ -
盒子活跃会员
2015/5/24 20:59:24
123楼: 你应该看看IW自带的DEMO,相关文件都改到wwwroot目录下了。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/26 0:03:38
124楼: 修改一个字节,搞定dclIntraweb_14_DXE8.bpl启动时联网做版本检查
在14.0.40版dclIntraweb_14_DXE8.bpl中查找 55 8B EC 51 B2 01 A1将55改成C3,大功告成!

修改位置位于IWDsnVersionCheckerForm.dcu的TIWVersionChecker.Execute入口处,让这个成员函数啥都不干,直接返回。C3=RET NEAR。

如何检验是否修改成功? 用Fiddler监听http通讯。
----------------------------------------------
-
作者:
女 blbz (冰力不足) ▲▲▲▲▲ -
普通会员
2015/5/26 0:28:40
125楼: @c5soft

肖老师可否再放上百度云盘一天? 这几天忙得没有上网, 错过了实在遗憾!
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/26 10:00:51
126楼: 解开本笔记第1楼谜团--Delphi与Javascript交互
这段摘自IW_JS_IWAJAX_DBG.js的代码,可能让许多初步接触IW的同学们不知所云,下面肖老尸就来解开这个谜团。
IW更新网页有两种方式,一种是通过form.submit()返回的信息对整个网页完全重写,另一种是通过XMLHttpRequest.send()返回的信息对网页局部更新或整个网页重写。
这里要讨论的就是第二种方式,即AJAX,不要被XMLHttpRequest中XML所诱导,实际上XMLHttpRequest可以返回任何数据,除了XML,另一种更高效的数据格式JSON被广泛采用。当然IW仅使用XML格式。
咱们在IW控件中看到许多OnAsync...事件,这类事件将通过网页引发XMLHttpRequest.send()调用后台IW的Delphi代码,IW将返回浏览器下列格式的XML文档
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
    <update>
        <control id="REGNOK" type="IWREGION">
          <style>
          <attribute name="visibility">hidden</attribute>
          </style>
        </control>
    </update>
    <execute>
        <literal>window.alert("Hello");</literal>
    </execute>
    <rewrite></rewrite>
    <submit>/$/</submit>
    <trackid></trackid>
</response>
该文档交给AjaxRequest对象处理:
xTrackID = aXmlDoc.getElementsByTagName("submit")决定下次form.submit()提交地址;
xRewrite = aXmlDoc.getElementsByTagName("rewrite")提取的内容将把整个网页重写;
xUpdate = aXmlDoc.getElementsByTagName("update")提取的内容用于网页局部更新;
xExecute = aXmlDoc.getElementsByTagName("execute")提取的javascript代码直接被执行。
----------------------------------------------
-
作者:
男 hwkjzyh (汉卿) ★☆☆☆☆ -
盒子活跃会员
2015/5/26 11:01:09
127楼: 肖老师有时间把iw14.0.39的文件上传的bug解决一下才好

目前IWFileUploader还不能上传 .xlsx  .rar  .7z

office2007格式及压缩文件是经常要用到的。
----------------------------------------------
作者:
男 ahyong (ahyong) ★☆☆☆☆ -
盒子活跃会员
2015/5/26 21:49:46
128楼: hwkjzyh (汉卿)同学,iw14.0.40版本老大已经搞定,怎么不考虑用新版本。
----------------------------------------------
-
作者:
男 glings (glings) ▲▲▲▲△ -
普通会员
2015/5/27 10:52:01
129楼: 要再顶一下,
----------------------------------------------
-
作者:
男 gaoyong_gy (gaoyong_gy) ★☆☆☆☆ -
盒子活跃会员
2015/5/27 13:54:34
130楼: 上传文件,IE只要不在兼容模式下,没有问题,其它浏览器好像也没有问题。
----------------------------------------------
Delphi 的移动程序开发,是您不可再错失的机遇:http://blog.163.com/you888@188/blog/static/6723961920169319529515/
作者:
男 pherody (pherody) ▲▲▲▲▲ -
普通会员
2015/5/28 16:02:59
131楼: intraweb XE如何加快IDE?怎么修改dclIntraweb_14_DXE.bpl?
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2015/5/28 17:46:53
132楼: 肖老师,能否用iw在客户端(可能是手机也可能是win32)生成url链接快捷方式?
----------------------------------------------
-
作者:
男 pp0123 (pp0123) ▲▲▲▲▲ -
普通会员
2015/5/28 17:51:34
133楼: IW 生成网页, 客户端就是浏览器, 什么IW当客户端?
----------------------------------------------
-
作者:
男 sunshinedelphi (sunshine) ★☆☆☆☆ -
盒子活跃会员
2015/5/29 0:21:18
134楼: 请教一下肖老师,我用14.XX版本开发的程序,三星note4自带的浏览器打开显示不支持的浏览器,如果用Delphi7+11.53,就正常,是不是新版本不支持浏览器阿?
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/29 14:12:11
135楼: 回134楼sunshinedelphi的帖子:有关IW对浏览器的支持你需要知道以下细节:
1.浏览器在向服务器发送请求时会把自己的特征通过HTTP HEADER的User-Agent: ...发送。这可以通过HTTP监听工具Fiddler查看。
2.在IW应答浏览器的请求时,可以人为指定浏览器类型,通过此人为干预改变页面的输出细节。
3.通过IWServerController.OnBrowserCheck事件来实现浏览器人为干预。OnBrowserCheck事件处理这样写:
uses IW.Browser.Browser,IW.Browser.InternetExplorer, IW.Browser.Safari,
  IW.Browser.Chrome, IW.Browser.Firefox, IW.Browser.Other;
...
procedure TIWServerController.IWServerControllerBrowserCheck
  (aSession: TIWApplication; var rBrowser: TBrowser);
var
    MinVersion: Single;
    ua:String;
begin
  ua=aSession.Request.GetRawHeaderValue('User-Agent');
  ...
  if (rBrowser is TOther) then
  begin
    // unknown browser
    rBrowser.Free;
    // accept the unknown browser as Internet Explorer 8
    rBrowser := TInternetExplorer.Create(8);
  end
  else if (rBrowser is TSafari) and (not rBrowser.IsSupported) then
  begin
    // if is Safari, but older version
    MinVersion := rBrowser.MinSupportedVersion;
    rBrowser.Free;
    // we will create it as the minimum supported version
    rBrowser := TSafari.Create(MinVersion);
  end
  // if is Chrome, but older version
  else if (rBrowser is TChrome) and (not rBrowser.IsSupported) then
  begin
    MinVersion := rBrowser.MinSupportedVersion;
    rBrowser.Free;
    // we will create it as the minimum supported version
    rBrowser := TChrome.Create(MinVersion);
  end
  // if is Firefox, but older version
  else if (rBrowser is TFirefox) and (not rBrowser.IsSupported) then
  begin
    MinVersion := rBrowser.MinSupportedVersion;
    rBrowser.Free;
    // we will create it as the minimum supported version
    rBrowser := TFirefox.Create(MinVersion);
  end
  // if is IE, but older version
  else if (rBrowser is TInternetExplorer) and (not rBrowser.IsSupported) then
  begin
    MinVersion := rBrowser.MinSupportedVersion;
    rBrowser.Free;
    // we will create it as the minimum supported version
    rBrowser := TInternetExplorer.Create(MinVersion);
  end;
end;
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/29 14:24:42
136楼:   TBrowser = class
  protected
    mMajorVersion: integer;
    mVersion: single;
    mMinSupportedVersion: single;
    mAllowOlderBrowsers: boolean;
    mStrictMode: boolean;
    mUserAgent: string;
    mBrowserName: string;
    mIsMobile: boolean;
    //
    constructor Create(aVersion: single; aMinSupportedVersion: single); overload; virtual;
    constructor Create(aVersion: single); overload; virtual; abstract;
    class procedure Init; virtual;
  public
    class function CreateBrowser(aUserAgent: string): TBrowser;
    class function Match(AUserAgent: string; out AVersion: Single): boolean; virtual;
    class function ParseBrowserVersion(aVersion: string): single;
    function IsSupported: boolean; virtual;
    property AllowOlderBrowsers: boolean read mAllowOlderBrowsers write mAllowOlderBrowsers;
    property MajorVersion: integer read mMajorVersion;
    property MinSupportedVersion: single read mMinSupportedVersion;
    property Version: single read mVersion;
    property UserAgent: string read mUserAgent write mUserAgent;
    property StrictMode: boolean read mStrictMode write mStrictMode;
    property BrowserName: string read mBrowserName;
    property IsMobile: boolean read mIsMobile write mIsMobile default False;
  end;
----------------------------------------------
-
作者:
男 sunshinedelphi (sunshine) ★☆☆☆☆ -
盒子活跃会员
2015/5/30 0:43:57
137楼: 非常感谢肖老师,又学到东西了,请问有交流群吗?

错误信息如下
Error details:

Exception message : Unknown browser type. User Agent string: Mozilla/5.0 (Linux; Android 4.4.4; zh-cn; SAMSUNG-SM-N9108V_TD/1.0 Android/4.4.4 Release/09.03.2014 Browser/AppleWebKit537.36 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/2.0 Mobile Safari/537.36
Exception class : EUnknownBrowserException
Exception address : 00705960
Exception Time : 2015-05-30 01:04:20.506

已顺利解决!!!真乃神人也
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/31 15:40:41
138楼: 从15GB到0.5GB--从XE8到XE的迁移

实在忍受不了XE8下开发坏境的响应速度,决定找一个轻量级的RAD。
在2009,2010,XE三者中选择了XE,因为XE是只包含VCL的最后一个版本,Bug应该最少。从软件安装占用的磁盘空间来讲是从15GB到0.5GB的迁移。

14.0.40 XE暴破方法:
运行HexWorkshop,打开dclIntraweb_14_DXE.BPL
查找 E8 D6 49 FD FF 88 45 C3 80 7D C3 00 75 1D
替换 B0 04 90 90 90 88 45 C3 80 7D C3 00 75 1D

查找 E8 C9 5C FE FF 8D 8D 74 FE FF FF BA
替换 90 90 90 90 90 8D 8D 74 FE FF FF BA

继续使用EastGiant那个IWLicenseKey.pas。

特别提醒:没有机缘与EastGiant会面的同学们,请不要在这里留言,要求公布WLicenseKey。这个,肖老尸不能有,还是去atozed买个正版吧,399欧元,不贵。
----------------------------------------------
-
作者:
男 hwkjzyh (汉卿) ★☆☆☆☆ -
盒子活跃会员
2015/5/31 16:06:53
139楼: 非常感谢! 还是xe用起来顺手。
----------------------------------------------
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/5/31 21:24:51
140楼: 移植XE8的System.JSON.pas到XE
由于XE不支持原生string的扩展(record Helper for string),只能将源代码中的String.IndexOf(),String.SubString()等恢复到传统的写法,代码未严格测试。
此帖子包含附件:c5soft_2015531212451.rar 大小:16.9K
----------------------------------------------
-
作者:
男 pp0123 (pp0123) ▲▲▲▲▲ -
普通会员
2015/5/31 22:46:21
141楼: c5soft,有趣是 BPL 内没找到你那两组内码.奇怪
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/6/2 22:53:44
142楼: Atozed Corporate Office

Mailing Address
Atozed Computer Software Ltd.
PO Box 53909
3318 Limassol
Cyprus

Registered Address
Atozed Computer Software Ltd.
12 Promitheos Street
Office 302
1643 Nicosia
Cyprus

VAT ID: CY10131077B

Fax: +1 (866) 398-8496

走进塞浦路斯
塞浦路斯,全称:塞浦路斯共和国;是欧洲与亚洲交界处的一个岛国(圣经称之为“基提岛”、古代及亚述帝国时期),位于地中海东部,面积9,251平方公里。具有非常高的人类发展指数。为地中海地区最热门的旅游地之一。 目前已知人类最早的活动足迹,大约可追溯至西元前10,000年,此一时期的遗址有乔伊鲁科蒂亚,为新石器时代保存至今依然完好的建筑群。塞浦路斯因地处地中海进入西亚地区的要冲,从古至今已被西台、亚述、埃及、波斯、阿拉伯哈里发王朝、乌迈耶王朝、威尼斯及奥图曼帝国等帝国占领过。西元前333年,亚历山大大帝从波斯人手中接管了此岛。1878年开始为英国所管理,直到1960年获得独立,隔年成为大英国协的会员国之一。 塞浦路斯共和国法定上的主权,为塞浦路斯全岛及其周围海域,除一小部分地区因条约分配给英国作为军事基地;而事实上却分为南北两部分,共和国有效统治的区域为该岛63%的面积,北部的37%则为土耳其所占领,其自称为北塞浦路斯土耳其共和国,该政治实体目前仅有土耳其一国承认。塞浦路斯共和国(希腊区)于2004年5月1日正式成为欧洲联盟会员国之一。
最佳季节:每年4月-9月最佳,塞浦路斯海滨沙滩是天然的游泳和日光浴胜地,当地人的旅游旺季是7-8月,这时候的物价比较高,而4-5月和9-10月人少一些。
建议游玩:3天
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/6/3 0:05:18
143楼: Delphi与汇编 --抄自delphi.net.cn
我一直认为Delphi功能与C++相比毫不逊色,提供了丰富的控件和类、全部API以及嵌入的汇编。最近小弟在把C版的Huffman压缩改用Delphi写时,顺便“研究”了一下Delphi的位操作和嵌入式汇编,利用嵌入汇编我们可以得到高效的程序代码,完成一些Delphi没有提供的底层功能。借贵报一方宝地与大家分享我的“研究”。
  Delphi的位操作
  每个学习C的朋友都会被告之C是“中级语言”,其位操作非常方便,而Pascal之流只适用于教学。但是Delphi中提供了一组位操作,可别以过去对Pascal的态度看Delphi。
  * 按位的逻辑操作:
  Delphi中的AND、OR、NOT可不仅仅只对逻辑表达式有作用,它们还可以操作数;
  AND:按位与,如:1 AND 2其结果为0
  OR:按位或,如:1 OR 2其结果为3
  Not:按位取反:如Not 1其结果对于有符号数是-2,对于无符号数是65534
  另外,还有按位异或XOR:如:1 XOR 2结果为3
  * 移位操作
  Delphi提供了SHL和SHR进行移位左移和右移:
  例如:2 SHR1表示2按位右移一位结果为1。
  * Delphi中的数
  既然有位的操作就一定涉及到数的类型:是有符号数(头一位用0和1表示正负)还是无符号数。
  Delphi中:Shortint(8位)、Smallint(16位)、Longint(32位)、Integer(32位)、Int64(64位)是有符号数;而Byte(8位)、Word(16位)、Longword(32位)是无符号数。它们之间可以像C一样强制转换。例如:Smallint类型的-1转换成Word类型就是65535。转换方法是Word(-1)。
  怎样,够全吧^_^!什么还不够……!?Delphi还有一招,接招吧……
  Delphi的嵌入式汇编
  Delphi中提供了几乎全部常用汇编指令的支持:MOV、JE、JMP、CMP、SHL、SHR、SAL、SAR、POP、PUSH、HLT……自己去查吧。至于INT也能识别,不过非法操作或死机可别找我(在最早的Windows95中用Delphi 3似乎可以正确运行中断,但Windows 95 OEM、Windows 98就不对了,大概是16位模块的问题,还搞不清楚)。
  * 嵌入式汇编的格式
  Delphi是使用ASM……END来标志汇编语句
   如:ASM
   mov al,1
   mov bl,al
   END;
  * 可操作的寄存器
  Delphi可用汇编管理以下寄存器:
  32位寄存器EAX EBX ECX EDX ESP EBP ESI EDI
  16位寄存器AX BX CX DX SP BP SI DI
  8位寄存器AL BL CL DL AH BH CH DH
   16位段寄存器CS DS SS ES
  以及协处理器寄存器堆栈 ST
  * 使用汇编前的工作
  教汇编的老师一再强调使用汇编要保存寄存器现场(保存使用前的寄存器状态,使用Push压栈和Pop从栈中弹出),不过这一切对于Delphi的嵌入式汇编是没有必要的(除非你自己要使用Push和Pop),因为Delphi已经帮你做了,不必担心会使数据丢掉。
  * Delphi嵌入式汇编的使用方式
  1.在一般函数过程中使用汇编
  汇编程序段可以嵌套于其它过程中:如:
  procedure TForm1.Button1Click(Sender: TObject);
  var i:smallint;
  begin
   i:=1;
   asm
   mov ax,i
   sal ax,1
   mov &i,ax
   end;
   showmessage(inttostr(i));
  end;
  这个程序段是把16位的变量I进行左移,然后把结果用Mov &I,ax语句放入I变量所在地址返回值。最后显示I 的值是2。
  2.独立的汇编程序段
  汇编程序段也可以单独写成函数或过程。这就涉及到参数的传递与结果的返回。首先Delphi对于函数的返回有一个约定:
  即:整型数据:8位的用AL返回,16位的用AX返回,32位的用EAX返回;
  实型:用ST(0)返回
  指针:用EAX返回
  长字符串:用EAX返回其所在地址
  变量:可用@Result返回
  例如:一个用汇编的求和函数
  function _Sum(X, Y: Integer): Integer;
   asm
  MOV EAX,X //把32位的数放入EAX
  ADD EAX,Y //进行加法运算
  MOV @Result,EAX //返回X+Y
   end;
  一个把字符转化为大写的函数例子
  function _UpCase( ch : Char ) : Char;
  asm
   CMP AL,`a'
   JB @@exit
   CMP AL,`z'
   JA @@exit
   SUB AL,`a' -`A'
  @@exit:
  end;
  值得注意的是第二个例子中,没有象第一个那样把参数用语句放到寄存器中,这是由于Delphi中默认的把Byte(Char)类型放在AL中,不需要用Mov语句,但是这种函数不能是类的成员,否则结果会出错。
  3.在汇编中调用其它过程
  汇编语句中的Call语句,可以用于调用其它过程,既可以是其它汇编程序段也可以是Delphi中的标准过程:
  例如:假设新建一个窗体并在上面加了一个按钮,在Click事件中写入以下代码
  procedure TForm1.Button1Click(Sender: TObject);
  begin
   showmessage(`ok');
  end;
  再写一个过程_X
  function TForm1._x(var i:smallint):integer;
  asm
   call button1click
  end;
  执行_x的结果就可以显示消息框。
  * 汇编的调试
  编好了程序,没错,还好,如果有错,就得用到调试工具:如变量的跟踪、断点、堆栈查看……对于汇编还可以用View菜单的Debug Windows的CPU窗口跟踪。
  OK!就谈到这,希望对使用Delphi的朋友有点帮助。(成都 阿杰)


Byte快速转换为16进制字符串
上次delphi做的asm内嵌过程/函数格式是:
procedure procname(...);
asm
...
end;
  对这种过程/函数,整个由asm写成。内嵌asm还有一种常见用法,
就是在程序局部调用asm:
function bytetohex(src: byte): string;
begin
setlength(result, 2);
asm
mov edi, [result]
mov edi, [edi]
mov al, src
mov ah, al // save to ah
shr al, 4 // output high 4 bits
add al, '0'
cmp al, '9'
jbe @@outcharlo
add al, 'a'-'9'-1
@@outcharlo:
and ah, $f
add ah, '0'
cmp ah, '9'
jbe @@outchar
add ah, 'a'-'9'-1
@@outchar:
stosw
end;
end;
  该子程序可以实现把一字节的src转换为16进制形式的字符串。刚好
一位站友有这样的问题,够快了吧? :)
**********
用delphi写的程序,把x指针指向的4个字节次序颠倒过来:
function toulong(x: pchar): longword;
begin
result := (longword(x^) shl 24) or
(longword((x + 1)^) shl 16) or
(longword((x + 2)^) shl 8) or
(longword((x + 3)^));
end;
以下是用delphi的嵌入式汇编写法:
function toulong(x: pchar): longword;
asm
mov esi,eax
mov ax,[esi]
xchg ah,al
shl eax,16
mov ax,[esi+2]
xchg ah,al
end;
说明:默认情况下,delphi使用“register”方式,若参数在3个已内,
将分别使用eax、edx和ecx,超过3个参数部分将使用堆栈。返回参数的
存放视长度而定,例如8位用al返回,16位用ax,32位用eax,64位用用两个
32位寄存器edx:eax,其中eax是低位。
 
效率:本例asm大约比delphi或c快50%。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/6/3 8:08:16
144楼: 原文(nicrosoft于2001/08/26 21:19粘贴) --抄自delphi.net.cn
浅谈Object Pascal的指针
----------
 
浅谈Object Pascal的指针
Nicrosoft(nicrosoft@sunistudio.com) 2001.8.26
(http://www.sunistudio.com/asp/sunidoc.asp)
大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是C语言的灵魂,一点都不为过。同时,这种说法也让很多人产生误解,似乎只有C语言的指针才能算指针。Basic不支持指针,在此不论。其实,Pascal语言本身也是支持指针的。从最初的Pascal发展至今的Object Pascal,可以说在指针运用上,丝毫不会逊色于C语言的指针。
以下内容分为八部分,分别是
一、类型指针的定义
二、无类型指针的定义
三、指针的解除引用
四、取地址(指针赋值)
五、指针运算
六、动态内存分配
七、字符数组的运算
八、函数指针
 
一、类型指针的定义。对于指向特定类型的指针,在C中是这样定义的:
int *ptr;
char *ptr;
与之等价的Object Pascal是如何定义的呢?
var
ptr : ^Integer;
ptr : ^char;
其实也就是符号的差别而已。
二、无类型指针的定义。C中有void *类型,也就是可以指向任何类型数据的指针。Object Pascal为其
定义了一个专门的类型:Pointer。于是,
ptr : Pointer;
就与C中的
void *ptr;
等价了。
三、指针的解除引用。要解除指针引用(即取出指针所指区域的值),C 的语法是 (*ptr),Object
Pascal则是 ptr^。
四、取地址(指针赋值)。取某对象的地址并将其赋值给指针变量,C 的语法是
ptr = &Object;
Object Pascal 则是
ptr := @Object;
也只是符号的差别而已。
五、指针运算。在C中,可以对指针进行移动的运算,如:
char a[20];
char *ptr=a;
ptr++;
ptr+=2;
当执行ptr++;时,编译器会产生让ptr前进sizeof(char)步长的代码,之后,ptr将指向a
[1]。ptr+=2;这句使得ptr前进两个sizeof(char)大小的步长。同样,我们来看一下Object Pascal中如何实
现:
var
a : array [1..20] of Char;
ptr : PChar; //PChar 可以看作 ^Char
begin
ptr := @a;
Inc(ptr); // 这句等价于 C 的 ptr++;
Inc(ptr, 2); //这句等价于 C 的 ptr+=2;
end;
只是,Pascal中,只允许对有类型的指针进行这样的运算,对于无类型指针是不行的。
六、动态内存分配。C中,使用malloc()库函数分配内存,free()函数释放内存。如这样的代码:
int *ptr, *ptr2;
int i;
ptr = (int*) malloc(sizeof(int) * 20);
ptr2 = ptr;
for (i=0; i<20; i++){
*ptr = i;
ptr++;
}
free(ptr2);
Object Pascal中,动态分配内存的函数是GetMem(),与之对应的释放函数为FreeMem()(传统
Pascal中获取内存的函数是New()和 Dispose(),但New()只能获得对象的单个实体的内存大小,无法取得连
续的存放多个对象的内存块)。因此,与上面那段C的代码等价的Object Pascal的代码为:
var ptr, ptr2 : ^integer;
i : integer;
begin
GetMem(ptr, sizeof(integer) * 20);
//这句等价于C的 ptr = (int*) malloc(sizeof(int) * 20);
ptr2 := ptr; //保留原始指针位置
for i := 0 to 19 do
begin
ptr^ := i;
Inc(ptr);
end;
FreeMem(ptr2);
end;
对于以上这个例子(无论是C版本的,还是Object Pascal版本的),都要注意一个问题,就是分配
内存的单位是字节(BYTE),因此在使用GetMem时,其第二个参数如果想当然的写成 20,那么就会出问题
了(内存访问越界)。因为GetMem(ptr, 20);实际只分配了20个字节的内存空间,而一个整形的大小是四个
字节,那么访问第五个之后的所有元素都是非法的了(对于malloc()的参数同样)。
七、字符数组的运算。C语言中,是没有字符串类型的,因此,字符串都是用字符数组来实现,于是也
有一套str打头的库函数以进行字符数组的运算,如以下代码:
char str[15];
char *pstr;
strcpy(str, "teststr");
strcat(str, "_testok");
pstr = (char*) malloc(sizeof(char) * 15);
strcpy(pstr, str);
printf(pstr);
free(pstr);
而在Object Pascal中,有了String类型,因此可以很方便的对字符串进行各种运算。但是,有时
我们的Pascal代码需要与C的代码交互(比如:用Object Pascal的代码调用C写的DLL或者用Object Pascal
写的DLL准备允许用C写客户端的代码)的话,就不能使用String类型了,而必须使用两种语言通用的字符数
组。其实,Object Pascal提供了完全相似C的一整套字符数组的运算函数,以上那段代码的Object Pascal
版本是这样的:
var str : array [1..15] of char;
pstr : PChar; //Pchar 也就是 ^Char
begin
StrCopy(@str, 'teststr'); //在C中,数组的名称可以直接作为数组首地址指针来用
//但Pascal不是这样的,因此 str前要加上取地址的运算符
StrCat(@str, '_testok');
GetMem(pstr, sizeof(char) * 15);
StrCopy(pstr, @str);
Write(pstr);
FreeMem(pstr);
end;
八、函数指针。在动态调用DLL中的函数时,就会用到函数指针。假设用C写的一段代码如下:
typedef int (*PVFN)(int); //定义函数指针类型
int main()
{
HMODULE hModule = LoadLibrary("test.dll");
PVFN pvfn = NULL;
pvfn = (PVFN) GetProcAddress(hModule, "Function1");
pvfn(2);
FreeLibrary(hModule);
}
就我个人感觉来说,C语言中定义函数指针类型的typedef代码的语法有些晦涩,而同样的代码在
Object Pascal中却非常易懂:
type PVFN = Function (para : Integer) : Integer;
var
fn : PVFN;
//也可以直接在此处定义,如:fn : function (para:Integer):Integer;
hm : HMODULE;
begin
hm := LoadLibrary('test.dll');
fn := GetProcAddress(hm, 'Function1');
fn(2);
FreeLibrary(hm);
end;
----------------------------------------------
-
作者:
男 glings (glings) ▲▲▲▲△ -
普通会员
2015/6/3 8:39:01
145楼: 肖老师:能否多科普一些AJAX的知识(例子),如:GRID、TREE的内容,不刷新页面的情况下,得到更新。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/6/3 8:49:47
145楼: Delphi程序的自我修改   北京  王甲春 
前言: 
    对于Delphi在编译时对代码所做的工作,大部分使用Object Pascal之类的高级语言的程序员并不是很熟悉。如果你对汇编程序以及EXE文件格式有一点基本认识,那么源代码里包含的注释将把一切解释得非常清楚。另外,我还要说明一下源代码在编译时被做了什么处理。 
    我对汇编程序以及EXE文件格式的认识也是及其有限的,大部分是我在寻找反盗版和程序的自我修改等信息时自学的。为什么我要写这篇文章?因为我发现这方面的信息非常少,因此我把收集到的信息整理到一起,并希望能和大家一起分享。 

程序的自我修改: 
    这是什么意思呢?一般情况下,我们只能在设计期修改我们的源代码。代码修改一般是在代码被编译前在Delphi内部完成的,这一点我们都很清楚。 
    但是,有时编译好的程序也被修改了。例如,给一个没有运行的EXE文件打补丁可以升级原来的EXE文件。当应用程序已经广泛发布后,用户想把它升级到新版本一般都使用这种方法。为了节约下载时间和排除用户把整个程序重新安装一遍,只有两个版本的EXE文件的不同之处被分发在补丁文件里,这样这个补丁就可以应用于老版本的EXE文件。另一个补丁的例子就是破解——小小的COM文件或者EXE文件就可以移走一个软件原来的限制性(比如时间限制)。 
    很显然,这两种代码修改的方式是在EXE文件运行之前进行的。当一个EXE文件运行时文件被载入内存,这时要影响程序的行为就只能修改该EXE文件占用的内存了。 
    通过在程序运行时期改变内存来修改自身的方式称为“程序的自我修改”。 

程序自我修改的缺点: 
    程序自我修改加大了调试的难度,因为内存的实际信息和调试器所认为的信息其实是有差异的。 
    程序自我修改还有一个不好的名声,尤其因为它的显著表现就是病毒。这意味着如果你使用了程序的自我修改,那么很多杀毒软件会误以为你的程序是病毒。 

程序自我修改的优点: 
    程序自我修改加大了调试的难度。在你调试代码时你觉得它是个缺点,为了不让其他用户调试你的代码,或者说增加他的调试难度,从这方面来说它又是个优点。这就是说程序自我修改是反盗版计划的有效组成部分。 

需要什么函数: 
    在Windows环境下我们需要调用如下几个API函数: 
◎ReadProcessMemory(hProcess,lpBaseAddress,lpBuffer,nSize,lpNumberOfBytesRead);  
    这个函数用于读取某一个进程的内存,由于本文是一个关于程序自我修改的例子,所以只能在我们的进程内使用这个函数。 
◎WriteProcessMemory(hProcess,lpBaseAddress,lpBuffer,nSize,lpNumberOfBytesWritten);  
    这个函数用于向某一个进程的内存写入信息。 
◎VirtualProtect(lpAddress,dwSize,flNewProtect,lpflOldProtect);  
    这个函数用于修改进程的内存数据存取保护的区域。 
    以上函数的具体参数含义详见Win32的帮助文件,具体使用方法请参见下面给出的例子。 

示例代码实现什么功能? 
    将被自我修改的代码在CallModifiedCode过程的内部: 
procedure TForm1.CallModifiedCode(Sender: TObject);  
var  
  b:boolean;  
  c:TColor;  
label 1;  
begin  
  c := clgreen;  
  b := true;  
  if b then goto 1;  
  asm  
    nop  
    nop  
    nop  
    nop  
    nop  
    nop  
  end;  
  c := clred;  
 1:  
  form1.Color := c;  
end;  
    在看完这段代码以后你可能对某些地方疑惑不解。很显然这段代码用于设置Form1的颜色,但是正如你所理解的那样,Form1的颜色总是绿色的,因为布尔变量b的值一直为true,所以程序总会跳到标号1处使得“c:=clred”语句不会被执行。 
    然而,程序这个程序里面将有另一个函数,它将在程序运行时把“if b then goto 1;”语句改为“if NOT(b) then goto 1;”语句,当内存中完成这个修改后,再次调用CallModifiedCode过程时,窗体将会变成红色。注意我们不是改变布尔变量b的值,而是在if语句里面插入一个“NOT”。 
    你一定也注意到过程内部的六个“nop”了,“nop”是一个汇编指令,完成的是没有实际用处的空操作,因此这六行其实也没有做实际工作。连续六个“nop”在编译好的EXE文件里是很不寻常的,因此我们将使用它们作为一个标志,用来在EXE文件里给上面的if语句定位。 
    为了理解我们是如何修改代码的,我们首先需要知道编译器是如何处理这段Pascal源代码的。在窗体上放置一个名为“Executecode”的按钮,它的单击事件设置为“CallModifiedCode”。在Delphi的IDE窗口里运行这个程序,在if语句处设置断点(可以通过单击按钮调用CallModifiedCode过程,再由调试器中断程序的执行),打开CPU视图窗口。你将会看到类似以下的代码: 
807DFB00 cmp byte ptr [ebp-$05],$00  
750B jnz TForm1.CallModifiedCode+$2A  
90 nop  
90 nop  
90 nop  
90 nop  
90 nop  
90 nop  
    我们可以很清楚的从上面的代码里看到这六个“nop”,上面的两行就是if语句的汇编指令。第一行用于把一个值(从Pascal源代码中我们知道它必须是布尔类型b的值)与$00进行比较,$00是表示0的十六进制,表示布尔类型则代表false。第二行以jnz开头,表示“不相等则跳转”,如果第一行的比较不相等的话就跳转到后面的地址去。所以,最上面的两行表示:比较b的值和0(false)的大小,如果不相等则跳转。 
    注意上面汇编语句的左边的十六进制值,每个汇编指令都拥有一个唯一的十六进制标识符。显然,$90表示“nop”。$75表示“jnz”,后面跟着的地址表示要跳转的目标地址(相对于当前地址),本例中跳转地址为$0D。$80表示“cmp”,后面跟着的地址表示它要比较的数据类型和数值。这些十六进制的汇编指令的标识符组成了EXE文件。如果你有一个十六进制编辑器,打开这个编译好的EXE文件,寻找“909090909090”,你会很快找到并发现上面的这些十六进制标识符。 
    下面返回到我们的任务上来,如果要在if语句里加入“NOT”,我们就要把汇编指令“jnz”换成“jz”(“jz”表示“相等则跳转”)。把jnz换成jz将会否定原来的if语句的判断条件,所以一旦修改成功程序就不会跳到标号1处,这样“c:=clred”语句就会被执行,那么窗体颜色就会被设置成红色。上文提到$75表示“jnz”,那么我们还需要知道$74表示“jz”。 

自我修改的实现: 
    下面概述以下自我修改的实现:为了把“if b then goto 1;”语句换成“if NOT(b) then goto 1;”语句,定位到内存地址$909090909090处,从这个位置向前两个字节,把$75换成$74。如果还想执行以前未经修改的代码,执行类似的操作,不过是把$74换成$75。 
    本文修改的代码示例如下面的TForm1.ModifyCode过程: 
procedure TForm1.ModifyCode(Sender: TObject); 
const
  BUFFMAX = 65536;
type
  TBytes6 = Array [0 .. 5] of byte;
  TMemblock = array [0 .. BUFFMAX - 1] of byte;

  Function ReadBufferFromMemory(ad, size: Integer; var MB: TMemblock): cardinal;
  var
    cnt: cardinal;
  begin
    ReadProcessMemory(Getcurrentprocess, pointer(ad), @MB[0], size, cnt);
    // 返回读取到的字节
    ReadBufferFromMemory := cnt;
  End;

  procedure WriteByteToMemory(ad: cardinal; rt: byte);
  var
    cnt: cardinal;
    oldprotect: dword;
  begin
    // 确保拥有向这个地址写入的权限
    VirtualProtect(pointer(ad), sizeof(rt), PAGE_EXECUTE_READWRITE,
      @oldprotect);
    WriteProcessMemory(Getcurrentprocess, pointer(ad), @rt, sizeof(rt), cnt);
    // 恢复以前的权限保护模式
    VirtualProtect(pointer(ad), sizeof(rt), oldprotect, @oldprotect);
  End;

var
  st: TBytes6;
  rt: byte;
  stcount: word;
  BytesRead: cardinal;
  sad, ead, ad: cardinal;
  x, y, z: cardinal;
  found: boolean;
  MemBlock: TMemblock;
begin
  // 定义查询条目,$90表示汇编指令nop
  st[0] := $90;
  st[1] := $90;
  st[2] := $90;
  st[3] := $90;
  st[4] := $90;
  st[5] := $90;
  stcount := 6;
  // 两个按钮的name属性分别为red和green,事件都是ModifyCode
  if (Sender = red) then
    rt := $74 // $74表示汇编指令jz
  else
    rt := $75; // $75表示汇编指令jnz
  // 寻址范围
  sad := ($00400000);
  ead := ($7FFFFFFF);
  // 当前地址
  ad := sad;
  found := false;
  repeat
    // 从当前地址ad开始读取长度BUFFMAX的范围
    BytesRead := ReadBufferFromMemory(ad, BUFFMAX, MemBlock);
    // 如果没有读取到字节则退出
    if BytesRead = 0 then
      break;
    // 确保没有错过查询条件
    If BytesRead = BUFFMAX Then
      BytesRead := BytesRead - stcount;
    // 循环查询这个内存区域
    For x := 0 To BytesRead - 1 do
    begin
      found := true;
      // 检测查询条目
      For y := 0 To stcount - 1 do
        If MemBlock[x + y] <> st[y] then
        begin
          found := false;
          break;
        end;
      If found Then
      begin
        // 查询条目开始地址:ad+x+y-stcount
        z := ad + x + y - stcount;
        // 需要改变的代码在这个地址之前两个字节处
        WriteByteToMemory(z - 2, rt);
        break;
        // 停止查询
      end;
    end;
    ad := ad + BytesRead;
  until (ad >= ead) or found;
end;
    在窗体上放置两个名称分别为“red”和“green”的按钮,单击事件都设置为“ModifyCode”。在CPU窗口观察,分别点击这两个按钮以后再点击“Executecode”按钮,“$75”和“$74”是来回变换的,当然窗体的颜色也是红绿交替变化的。由于源代码的注释比较详细,这里就没有必要再浪费太多语言了。 

最后总结: 
    通过点击按钮改变窗体的颜色当然有更简单的办法,但是本文这么做的目的是要演示“Delphi程序的自我修改”。程序的自我修改实际上一门强大的技术,本文的例子可能对反盗版有一定的提示作用。 
    最后给各位一个小小的忠告:在实际应用程序中,你最好小心使用连续的汇编指令“nop”,因为这种无用的代码区域可能就是一些病毒的落脚点,比如CIH病毒就是。

=========上面文章是对下面英文的翻译==========
Self-Modifying Code With Delphi
by Marcus M?nnig - minibbjd@gmx.de
Preface
Lots of people using high-level languages, like Object Pascal, do not know much about what happens with their code when they click compile in Delphi. If you have a basic knowledge about assembler and about the exe file format, the comments in the source code should make everything pretty clear. For everyone else, I will try to explain what's done in the source code.
My own knowledge about assembler and the exe format is limited and I learned most of it while looking for information about piracy protection and how to implement self-modifying code myself. The reason why I did this article is that I found very little information about this issue, so I put everything I found together to share it. Further, english is not my native language, so excuse any spelling and grammatical mistakes.
Self-modifying code with Delphi
What is it? Normally, we modify our code at design time. This usually happens inside Delphi before the code is compiled. Well, we all know this.
Then, sometimes compiled code gets modified, e.g. a patch might be applied to a (non-running) exe file to do changes to the original exe. This is often used when applications are distributed widely and the users want to update to a newer version. To save download time and to prevent that the user has to reinstall the whole application again, only the differences between two versions of an exe file are distributed in a patch file an applied to the old version of the exe. Another example of patch files are "cracks"... little com or exe files that remove built-in limitations (evaluation time limits, etc.) from applications.
These two kinds of code modifications are obviously done before the exe is executed. When an exe file is executed the file gets loaded into memory. The only way to affect the behavior of the program after this point is to modify the memory where the exe now resides.
A program that modifies itself while it is running by doing changes to the memory uses "self-modifying code".
Why is it bad?
Self-modifying code makes debugging harder, since there is a difference in what is in the memory and what the debugger thinks is in the memory.
Self-modifying code also has a bad reputation, especially because the most prominent use for it are viruses, that do all kinds of hide and seek tricks with it. This also means that if you use self-modifying code it's always possible that a virus checker will complain about your application.
Why is it good?
Self-modifying code makes debugging harder. While this is bad if you want to debug your code, it's good to prevent others from debugging your code or at least make it harder for them. This is the reason why self-modifying code can be an effective part of a piracy protection scheme. It won't prevent that an application can be cracked, however a wise use of this technique can make it very hard.
What functions are needed?
In a Windows environment we can make use the following API calls:
ReadProcessMemory(hProcess,lpBaseAddress,lpBuffer,nSize,lpNumberOfBytesRead);
This function is used, well, to read the memory of a process. Since this article is about _self_-modifying code, we will always use this function on our process only.
WriteProcessMemory(hProcess,lpBaseAddress,lpBuffer,nSize,lpNumberOfBytesWritten);
Used for writing data to a process memory.
VirtualProtect(lpAddress,dwSize,flNewProtect,lpflOldProtect);
Used to change the access protection of a region in memory. To learn more about these functions, refer to the Win32 help file that ships with Delphi and take a look how they are used in the sample code.
What does the example code do?
The code that will be modified is inside the CallModifiedCode procedure:
procedure TForm1.CallModifiedCode(Sender: TObject);
var
b:boolean;
c:TColor;
label 1;
begin
c := clgreen;
b := true;
if b then goto 1;
asm
nop
nop
nop
nop
nop
nop
end;
c := clred;
1:
form1.Color := c;
end;
After studying the code you might be puzzled about some things. Obviously, this code sets the color of Form1, but as it is, the color will always be green, since b is always true, so it will always jump to label 1 and c:=clred before never gets called.
However, there is another function in the program that will change the line if b then goto 1; to if NOT(b) then goto 1; while the program is running, so after this modification in memory is done and this function is called again the form will actually be changed to red. Note that we will not change the boolean value of b, but virtually insert a "NOT" into the if statement.
Surely you noticed the six "nop"'s. "nop" is an assembler instruction and means "no operation", so these 6 lines do just nothing. 6 nop's in a row are quite unusual in a compiled exe, so we will use these nops as a marker for the position of the if statement above inside the compiled exe.
To understand how we will modify the code, we need to take a look at what the compiler will make from our pascal code. You can do this by running the project from Delphi, setting a breakpoint on the line with the if statement and (once you called the CallModifiedCode procedure by clicking the button and the debugger stopped the execution) opening the CPU window from Delphi's debug menu. You will see something like this:
807DFB00 cmp byte ptr [ebp-$05],$00
750D jnz TForm1.CallModifiedCode + $2A
90 nop
90 nop
90 nop
90 nop
90 nop
90 nop
Well, we can clearly see the 6 nops we placed in our code. The two lines above are the assembler code of the if statement. The first line compares a value (as we know from the pascal code this has to be the boolean value of b) with $00, the hexadecimal notation of 0, that in the case of a boolean variable means false.
The second line starts with jnz, what means "jump if not equal" (technically, "jump if not zero") and the address to jump to if the compared values from line one are not equal. So, the first two lines mean: "Compare the value of variable b with 0 (false) and if they are not equal jump away."
Note the hexadecimal values to the left of the asm code above. Each assembler instruction has a unique hexadecimal identifier. Obviously, $90 means "nop". $75 means "jnz", which is followed by the address (relative to the current address) to jump to ($0D in this case). $80 means "cmp" followed by some hexadecimal data specifying what and how it it compared. This hexadecimal representation of the assembler instructions is what makes the exe. If you have a hex editor, load the compiled exe and try to search for "909090909090". You will quickly find it and you will notice that the values before will be identical with the values above.
So, coming back to our task, if we want to insert "NOT" into our if statement, we will need to replace "jnz" with "jz". "jz" means "jump if zero" or "jump if equal". Replacing "jnz" with "jz" will reverse the condition in the original if statement, so once this modification is done the jump will not be done and the line c:=clRed; will be executed and the form will get red. As I said, "jnz" is represented by the hexadecimal value $75. The hexadecimal value for "jz" is $74.
Let's summarize what we have to do to change "if b then goto 1;" to "if NOT(b) then goto 1;": Locate $909090909090 in memory. From this position, go back two bytes and replace $75 with $74. If we want to go back to the original code, we do the same, but replace $74 with $75.
This is what is done in procedure TForm1.ModifyCode. I'll not go into further details here, but the source has lots of comments. You can download the sample code for this article by clicking here. After calling ModifyCode by clicking one of the two buttons on the right, click the "Execute code" button again and open the CPU view in Delphi to see that $75 was actually replaced with $74 or vice versa.
Epilog
There are easier ways to set the color of a form depending on which button was clicked ;-), but of course the purpose here is to demonstrate the concept of self-modifying code. Self-modifying code is a powerful technique and the example code might be very useful to implement a piracy protection scheme.
Finally, a small warning: You should take care when using a series of assembler nop's as a marker in real world applications, as these kind of unused code sections can be a nest for some viruses, e.g. the
W95/CIH1003 virus.
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/6/11 9:37:11
146楼: 关心14.0.41的请移步Delphi.net.cn
----------------------------------------------
-
作者:
男 szlbz (szlbz) ★☆☆☆☆ -
盒子活跃会员
2015/6/11 11:36:19
147楼: Delphi.net.cn注册要钱
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/6/11 12:56:21
148楼: Delphi.net.cn目前还不要钱。点击页面左下角“邀请注册”可免费注册。
http://delphi.net.cn/home.php?mod=invite&u=1&c=af41754c971956d5
----------------------------------------------
-
作者:
男 gdsa (文稠紧) ★☆☆☆☆ -
盒子活跃会员
2015/6/19 2:30:38
149楼: 我再来激活此贴吧。。。。
下了41版,完完全全按说明中安装,结果还是下面截图这样,不知是为什么??
(注,我是卸载了XE7UP1,装了XE8,,之前的IW也用REMOVETOOL删除了)
此帖子包含附件:
PNG 图像
大小:28.4K
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2015/6/19 8:27:12
150楼: IWLicenseKey.pas文件未编译到执行文件中。
----------------------------------------------
-
作者:
男 gdsa (文稠紧) ★☆☆☆☆ -
盒子活跃会员
2015/6/19 8:55:49
151楼: 如何解决呢?
----------------------------------------------
-
作者:
男 glings (glings) ▲▲▲▲△ -
普通会员
2015/6/19 9:07:21
152楼: c5soft (走遍天下)说了
----------------------------------------------
-
作者:
男 gdsa (文稠紧) ★☆☆☆☆ -
盒子活跃会员
2015/6/19 20:56:05
153楼: 楼上 看到了
----------------------------------------------
-
作者:
男 ahyong (ahyong) ★☆☆☆☆ -
盒子活跃会员
2015/6/19 21:38:22
154楼: 楼主的破解,真好。
----------------------------------------------
-
作者:
男 gdsa (文稠紧) ★☆☆☆☆ -
盒子活跃会员
2015/6/20 2:04:25
155楼: 哎,,,,还是在别人的帮助下,
安装官网原版EXE包,覆盖几个关键文件就“搞定”了。。。
水平有限,实在领会不了那么高级的安装方法按此在新窗口浏览图片

玩玩而以,也不知Cracked的有啥问题不,,反正端口算是绑定上了
此帖子包含附件:
JPEG 图像
大小:319.9K
----------------------------------------------
-
作者:
男 ahyong (ahyong) ★☆☆☆☆ -
盒子活跃会员
2015/6/20 20:05:18
156楼: 这也行!
你真棒。
----------------------------------------------
-
作者:
男 gdsa (文稠紧) ★☆☆☆☆ -
盒子活跃会员
2015/6/20 23:22:36
157楼: 也是别人告诉我这样也可以,
是没办法逼的,楼主和这里的高手们介绍的方法反复搞不定,肯定是我哪里装乱套了,,,
没想到原来是可以“化繁为简”的!?
建统一目录、搞BAT拷文件、改注册表、添加XE参数、添加OS参数……或许这些方法更科学、更系统、更有益,但我还是更喜欢以上这种装法按此在新窗口浏览图片
可能这样装会有很多问题,但玩玩而以,无所谓了,别老跳端口就行^_^
----------------------------------------------
-
作者:
男 ahyong (ahyong) ★☆☆☆☆ -
盒子活跃会员
2015/6/21 9:54:06
158楼: 放心用吧。
----------------------------------------------
-
作者:
女 blbz (冰力不足) ▲▲▲▲▲ -
普通会员
2015/7/1 1:21:55
159楼: http://www.cnblogs.com/del/p/3812231.html

请教intraweb页面跳转问题?

万老师你好!
在使用intraweb过程中,我发现intraweb没法接收微信公众号post过来的参数。好像是浏览器在提交请求时,事实上intraweb作了三次页面跳转,先是跳转到/start,再跳到/$,最后才跳到我设置的接收验证参数的页面,而微信公众号根本不支持页面转向的,它是提交一次请求,未接收到反馈则认为失败,所以,我弄了好久,无法解决intraweb验证微信签名的问题。请问有什么方法解决这个问题吗?不要跳转页面,只要实现一个简单的request, response,intraweb做不到吗?
//----------


肖老师大神, 能否把intraweb的三次跳转通过破解修改代码改为直接一次访问? 
IW要是能自定义发包内容就完美了.
其实, IW的稳定性很好, 但是作者可能赚够钱了或者老了, 很多技术处理看起来很先进其实是落后.
IW和idHttp如出一辙, 稳定, 但是要自定义发包很麻烦.


GET /
GET /$/
加载各种它认为有必要的js
.....


往往来到这里卡死:


GET /$/js/IWExplorer__ECD23E02D.js HTTP/1.1

俺的另一求助帖:



http://bbs.2ccc.com/topic.asp?topicid=492920
此帖子包含附件:
PNG 图像
大小:23.7K
----------------------------------------------
-
作者:
女 blbz (冰力不足) ▲▲▲▲▲ -
普通会员
2015/7/1 8:21:52
160楼: 俺觉得长远看,各种jQuery Javascript会衰落消亡,IW应该加上一个最最最重要的不死功能,也是idhttp做得不好的,就是能自定义发包。

俺记得以前在抓某个网站的验证码的时候,idhttp运行长久不会出错,而直接Api模拟发包下载图片,连续干几天会卡住。

IW和idhttp的作者,在我们还不懂电脑的时候他老人家就已经玩很久电脑了,对各种低层深层的东西,他一定有他的考虑。不过,人总是很奇怪的,特别是赚到钱后,特别是中年,反正我见过好一些美国老程序员,甚至写超算的,突然间变得很傻的。
----------------------------------------------
-
作者:
女 blbz (冰力不足) ▲▲▲▲▲ -
普通会员
2015/7/1 8:38:18
161楼: 我们对IW的期待其实很简单,能完成端口,能多线程分配各种IP发来的请求分发给各个服务器,能监视某个端口,至于应答客户端的内容,最好可以交给我们自己来做。

jQuery Javascript属于过渡性的东西,以后各种浏览器不断升级,发一个代号过去客户端,各种场景就给你准备好了...现在IW好像舍本逐末,对jQuery越来越投入,而却忽视它最重要的功能。
----------------------------------------------
-
作者:
男 madwolf (林之白狼) ▲▲▲▲△ -
注册会员
2015/7/1 17:05:07
162楼: 哪位大神有14.0.43的破解哈?或者其他的比较新的都可以哈
----------------------------------------------
delphi加油!!
作者:
女 whjfyc (十八) ▲▲▲▲△ -
注册会员
2015/7/2 8:55:29
163楼: 162楼,快去delphi.net.cn 又出限时下载贴了,我今天才看到的,4号过期。
----------------------------------------------
-
作者:
男 madwolf (林之白狼) ▲▲▲▲△ -
注册会员
2015/7/3 14:20:10
164楼: 多谢163喽提醒哈按此在新窗口浏览图片 按此在新窗口浏览图片 按此在新窗口浏览图片 按此在新窗口浏览图片 按此在新窗口浏览图片 按此在新窗口浏览图片
----------------------------------------------
delphi加油!!
作者:
男 testself ( ) ★☆☆☆☆ -
普通会员
2015/7/6 11:44:22
165楼: 强力咨询楼主或其他高手,如何通过代码将iw的控件准确定位放置到jqueryui代码产生的页面中?谢谢!
如下面的代码中插入iw中放置的iwimage控件
<!doctype html>
<html lang="en"><head>  <meta charset="utf-8">
  <title>jQuery UI Tabs - Default functionality</title>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
  <script src="//code.jquery.com/jquery-1.10.2.js"></script>
  <script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
  <link rel="stylesheet" href="/resources/demos/style.css">
  <script>
  $(function() {
    $( "#tabs" ).tabs();
  });
  </script>
</head>
<body>
<div id="tabs">
  <ul>
    <li><a href="#tabs-1">第一页</a></li>

    <li><a href="#tabs-2">第二页</a></li>

    <li><a href="#tabs-3">第三页</a></li>
  </ul>
  <div id="tabs-1">
    <p>第一页.</p>
  </div>
  <div id="tabs-2">
    <p>第二页</p>
  </div>
  <div id="tabs-3">
    <p>第三页第一行.</p>
// 例如我想把iw自身的iwimage控件放到这个地方(不要告诉我使用模板方式),
    <p>第二页第二行.</p>
  </div>
</div>
</body>
</html>

非常感谢!
----------------------------------------------
-
作者:
男 drroc (kylixfans) ★☆☆☆☆ -
盒子活跃会员
2015/7/7 8:03:31
166楼: 人家告诉你使用模板方式,你又不让人家告诉,是要闹哪样?
----------------------------------------------
MVCXE中国首个DELPHI MVC WEB框架:http://www.mvcxe.com/
作者:
男 testself ( ) ★☆☆☆☆ -
普通会员
2015/7/7 8:30:45
167楼: 动态的页面,使用模板根本没有办法搞
----------------------------------------------
-
作者:
男 zyp1984 (小李他妈的飞刀) ▲▲▲▲▲ -
普通会员
2015/7/8 19:37:34
168楼: 老鸟可以用用。新人用这个就是找死。。。
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..
作者:
男 llf (天天打) ★☆☆☆☆ -
盒子活跃会员
2015/7/15 18:01:55
169楼: 165楼的问题,我也想知道,有没有高手解决啊
----------------------------------------------
-
作者:
男 glings (glings) ▲▲▲▲△ -
普通会员
2015/8/11 16:56:03
170楼: 我理解165楼的是要动态地改变模板文件的内容,就是服务端写HTML的文件,当做NOTE文件读写是可行的,再保存为HTML。但同时读写(多人使用时)的同步、保护都是问题,应该想其他办法
----------------------------------------------
-
作者:
男 greathuaca (萧Delphi) ▲▲▲▲△ -
注册会员
2015/9/26 23:53:03
171楼: 苦恼,我的XE8下Intraweb 14.0.40还是没有破解,那位大侠帮帮忙吧,邮箱greathuaca@163.com 本来想放弃Delphi了,但XE8的出现又让我重新燃起了希望。
----------------------------------------------
-
作者:
男 greathuaca (萧Delphi) ▲▲▲▲△ -
注册会员
2015/9/26 23:57:16
172楼: 期待中..........
----------------------------------------------
-
作者:
男 greathuaca (萧Delphi) ▲▲▲▲△ -
注册会员
2015/9/27 11:17:00
173楼: 非常感谢gdsa,盒子论坛我关注了十几年了,受益匪浅!
----------------------------------------------
-
作者:
男 21968578 (踏雪冬思) ▲▲▲▲▲ -
普通会员
2015/9/27 17:48:16
174楼: 支持下楼主,精神可嘉,感觉学习复杂度还是挺高的。
----------------------------------------------
-
作者:
男 xuyb19870303 (xuyb19870303) ▲△△△△ -
注册会员
2016/6/27 20:51:18
175楼: 关于不让intraweb3次跳转的问题:
    CanStartSession := True;
    RequiresSessionStart := False;
----------------------------------------------
-
作者:
男 lsz100 (lsz) ★☆☆☆☆ -
盒子活跃会员
2016/6/29 17:39:35
176楼: WEBBROKER + iis +JSON +exe 和 IW+IIS+JSON+EXE 二者哪个好
----------------------------------------------
我为人人为我
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2016/6/29 18:30:29
177楼: WebBroker+IIS+JSON+DLL最好。微软内核级的IOCP,高并发,高可靠,高速度。
透露一点小秘密:win10 64位的IIS 10需要将ISAPI规范的DLL编译成64位,在“应用程序池”中“启用32位应用程序”不好使。

用WebBroker,你可以操作Request.RawContent,这是IW忘记提供的核心功能。
----------------------------------------------
-
作者:
男 xuyb19870303 (xuyb19870303) ▲△△△△ -
注册会员
2016/6/29 19:11:38
178楼: 肖老尸:
    我个人觉得IW+IIS+JSON+ISAPI估计要好点,iw14.0.53及以上版本是重写了isapi的,性能有提升。配合iw的session来做token,再用一个动态的token来做加解密的密匙,加上ssl,安全方面基本可以不用考虑其他的了,我觉得这种更好点。
    另外,给你发了邮件,不知你看到没有。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2016/6/29 21:03:48
179楼: 用做网页开发经历了三个阶段:
第一阶:傻干阶段
使用Intraweb,傻瓜型,无需知道javascript,html,css,会pascal就可以了。

第二阶:困惑阶段
使用Intraweb,有很多限制,比如资料少,界面不容易做漂亮,没有源代码等等。于是转向研究其他开发工具。首先吸引眼球的是Nodejs,前后台用一种语言Javascript,爽,运行速度也不赖。
随着PHP7的发布,注意力也被PHP7的高性能所吸引,玩了一阵PHP7。当然还有以前摸过的Tomcat/asp.net,各种框架一大堆。还有,也许是未来方向的Rust语言(无视GO),这方面有Iron/nickel。
玩着玩着,还是发现问题了。PHP/Nodejs,解释执行,无法编译,一点隐私都没有。虽然PHP足够稳定,速度也不错,还是放弃吧。尼玛的微软,PHP7发布了,你赶紧提供PHP7的驱动啊,我要用PHP7来连接SQL Server。微软:“哈哈,你等着吧,迟早会有的。”别说Laravel好,源代码一大堆,资料一大箩,读死你。Nodejs,后面的依赖一大堆,出点问题。你找去吧,你结交的朋友太多,谁知道哪个朋友出卖了你。
Tomcat是一个不错的选择,企业级,开源,各种框架你随便挑,稳定性没有问题,喜欢高价语言的还有Scala可玩;自动生成代码的也有,比如jeecg,连微信的开发都有了。尼玛的jeecg,害死人,自动生成的代码你改得了吗,客户今天有这个需求,明天有那个需求,除非jeecg是你写的,你想改就改。最让人受不了的是tomcat的速度,同样功能的程序,PHP都跑到半山腰了,那只公猫还在山脚下晃晃悠悠。

大姑娘,小媳妇,外面的野花你随便采。采过之后你发现,还是家花好。

第三阶:回归阶段
于是有了:WYSIWYG WebBuilder + Delphi 开发Web应用的最佳搭档(http://bbs.2ccc.com/topic.asp?topicid=512086
我一直纳闷:Delphi这么好的语言,性能直逼C++,完全的Native Code,在Web开发这块领地,咋就没有数得着的成功案例?
其实大家将最好的东西忽略了,这就是WebBroker,因为大家把聚光灯都照在了IntraWeb上。结果IntraWeb是个不争气的孩子,做前端没有框架,一点艺术细胞都没有;做后端没有性能,Indy的框架显然满足不了当下高并发高速度的网络需求。要是不研究mORMot,还不知道用Delphi也可以写http.sys应用。不研究http.sys,就不知道IIS如此牛逼,不知道IIS的好,就不会去研究ISAPI。一研究ISAPI,你才发现,原来Delphi7的时代,WebBroker就已经IOCP了。

后台WebBroker,性能与稳定性建立在ISAPI基础上,站在巨人的肩膀上,你还怕没有好戏看吗?就差前台工具了。
前台我选WYSIWYG WebBuilder,这个东西你越用越喜欢,可以与WebBroker“狼狈为Jian”,帮WebBroker补全开发页面缺少所见即所得需要的工具。
WebBroker与WebBuilder的粘合剂就是javascript+AJAX/AJAJ,将javascript发扬光大的是jQuery,当然还有Angular/React。
前端完全采用html文件,负责页面展示,是"View",后端只负责json数据提供(当然json数据中没有规定你不能写html元素),负责读写数据库,是"Model"。"Control"在哪里?前后都有,前端是javascript写的引导程序,页面一启动,首先向后端发起ajax请求,接到后端的返回数据后负责对页面加工。肖老尸告诉你,这就是Intraweb的玩法,后端不光返回数据,也可以返回运行指令,一段javascript代码片段,让浏览器来执行。有兴趣的朋友,可以仔细研究我在“最佳搭档”开篇中那段javascript代码,那里有文章。

别告诉我IW也可以写ISAPI,尼玛IW,代码锁在自己的抽屉里,就等着发霉吧。request居然不能操作RawContent,只能解析x-www-form-urlencoded与multipart/form-data格式编码数据,如果前端直接往后端发送application/json或者text/xml编码数据,IW歇菜了。你只会炖猪肉,给你牛排你不知道如何加工,那你倒是把收到的牛排拿出来呀,尼玛的,你解析不了,又把原材料锁起来,我如何招待特需客户。

IW重写ISAPI,提升性能?性能在哪里,性能在Bill Gates那里,IIS才是性能之源。用IW 58版写一个Win10下64位的ISAPI,浏览器收到404错误,不知道问题出在哪里。人家Berlin版的WebBroker一点毛病都没患(不是没有哦)。你只用Delphi来写restFul Sevice,你是选择没有源代码,附加功能一大堆的IW,还是选择提供全部源代码,轻量级的WebBroker呢?WebBroker没有Session,Session那点事,根本就不是事,自己来。自己生的娃,出了问题自己才好教。
----------------------------------------------
-
作者:
男 xuyb19870303 (xuyb19870303) ▲△△△△ -
注册会员
2016/6/29 21:19:26
180楼: 肖老尸:
    不知道webbroker怎么弄出iw的那种session机制啊,我是在压力测试的时候观察过session变化(简单的理解就是能防cc),觉得这个比较不错,所以综合了看才选择iw的,如果webbroker这里也能实现这种高效率的session机制,我果断换webbroker,求赐代码。。。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2016/6/29 22:06:08
181楼: IW的Session的厂家设置保存在服务器内存里,如果要用多台服务器还同时提供服务,做负载平衡,要改,而且改起来很麻烦。session数据最好保存在数据库中(要性能,可以用MongoDB)。用WebBroker,自己写Session,可以一步到位。有关session的实现方法我在《WYSIWYG WebBuilder + Delphi 开发Web应用的最佳搭档》(http://bbs.2ccc.com/topic.asp?topicid=512086)有实现方案与关键代码。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2016/6/29 22:45:14
182楼: iw14.0.59.exe手工提取XE、D10_1的批处理文件:

@Echo off
set dst=D:\Projects\Components\IW14059
set exe=C:\Users\Administrator\Downloads\iw14.0.59.exe
innounp.exe -x -y -c{app}\ASPX -d%dst%\ASPX %exe%
innounp.exe -x -y -c{app}\ASPX\bin -d%dst%\ASPX\bin %exe%
innounp.exe -x -y -c{app}\Bin -d%dst%\Bin %exe%
innounp.exe -x -y -c{app}\Docs -d%dst%\Docs %exe%
innounp.exe -x -y -c{app}\Interfaces\Lib -d%dst%\Interfaces %exe%
innounp.exe -x -y -c{app}\LibD10_1W32 -d%dst%\LibD10_1W32 %exe%
innounp.exe -x -y -c{app}\LibD10_1W64 -d%dst%\LibD10_1W64 %exe%
innounp.exe -x -y -c{app}\LibXE -d%dst%\LibXE %exe%
innounp.exe -x -y -c{app}\Source -d%dst%\Source %exe%
innounp.exe -x -y -c{reg_HKLM\Software\CodeGear\BDS\6.0_RootDir}\Objrepos\code_templates\delphi -dD:\Delphi24\Objrepos\code_templates\delphi %exe%
innounp.exe -x -y -c{reg_HKLM\Software\CodeGear\BDS\6.0_RootDir}\Objrepos\code_templates\delphi -dD:\Delphi15\Objrepos\code_templates\delphi %exe%
innounp.exe -x -y -c{sys} -d%dst%\Bin %exe%
----------------------------------------------
-
作者:
男 xuyb19870303 (xuyb19870303) ▲△△△△ -
注册会员
2016/6/29 23:37:54
183楼: 又重新仔细的拜读了一遍肖老尸的文章(http://bbs.2ccc.com/topic.asp?topicid=512086),写的非常之好,值得好好研究。不过里面关于session的实现我觉得有些简单了,如果能实现像iw那样的session机制,如何能高效的执行杀死恶意session,高效实现无session自动跳转到首页等等,现在以我的臭水平真弄不了这个,现阶段还是先决定停留在iw吧,如果那位大神弄出一套好的session机制,立马换webbroker。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2016/6/29 23:40:06
183楼: IW14.0.59 404 - Not Found 错误
一个只有一个按钮一个标签的页面,ISAPI, Win10+IIS10+64位berlin编译
http://127.0.0.1/Test1.dll报404错误,无解。
此帖子包含附件:c5soft_201662923406.zip 大小:53.7K
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2016/6/29 23:47:29
184楼: @xuyb19870303
你说的那是CSRF,https://en.wikipedia.org/wiki/Cross-site_request_forgery
就是放作弊,用一个假冒的Cookie还访问未授权的资源,这个也好弄。只要在页面中隐藏一两个字段保存一串随机数,发到服务器端比对即可。
这个要求动态页面生成,在FORM用HIDDEN字段即可。


“高效实现无session自动跳转到首页”在这段前端代码里:

function ajaxProcess(data, textStatus, jqXHR)
{
    ...
    if (data.moveTo) {
      window.location.replace(data.moveTo);      
    } else if 
    ....
}
服务器通过Session检查,发现前端是未授权的用户,就在ajax返回数据中附带一个moveTo字段,浏览器立马跳转到moveTo指向的页面了。看看下面这段后台代码:
AddDispatch('GET', '/rest/TQuerySalary',
  function(const Self: TAppWebModule; const Request: TWebRequest;
    const Response: TWebResponse): boolean
  var
    jo :TJsonObject;  
  begin
    ...
    jo := TJsonObject.Create; 
    if not Self.Logined then
      jo.S['moveTo'] := '/'
    else
    ...
  end
  );
这里Logined的值从Session数据中获得。
----------------------------------------------
-
作者:
男 xuyb19870303 (xuyb19870303) ▲△△△△ -
注册会员
2016/6/29 23:57:42
185楼: 烦请肖老尸用webbroker弄个简单的demo,加入CSRF,供我等研究学习,多谢。
----------------------------------------------
-
作者:
男 pp0123 (pp0123) ▲▲▲▲▲ -
普通会员
2016/6/30 0:28:22
186楼: c5soft,今天的IIS,设定有少许不同,会是关系吗?
http://docs.atozed.com/docs.dll/deployment/Deploying%20your%20application%20as%20a%20ISAPI.html
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2016/6/30 8:33:10
187楼: 照atozed按图索骥,准不成。iis就是这么麻烦,机关太多,完全没有使用Nginx与httpd的轻松感觉。iis 10 实测64BIT无法支持32位dll。用WebBroker屡试不爽的法子用在IW上就是不灵。我怀疑atozed在win10 64位下就没有测试过,其中可能有bug。
----------------------------------------------
-
作者:
男 ww66 (wzs) ★☆☆☆☆ -
普通会员
2016/6/30 15:32:35
188楼: 为日后能看,先留名,多谢
----------------------------------------------
http://www.inteLi7.cn
作者:
男 pp0123 (pp0123) ▲▲▲▲▲ -
普通会员
2016/6/30 15:41:58
189楼: [c5soft] 记得 Atozed 说过没有自身全 64bits 化,它的 64bits 主要在 SA 下执行过关,并假定 32bits 程序都能在 64bits 下执行。新的 IIS 却针对大记忆容量而真正纯 64bits 化,因此出事。感觉上官方一直不鼓励非 SA 的方式。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲△△ -
注册会员
2016/6/30 16:07:41
190楼: 最近发现一个新问题,只要IIS一启动,IW的StandAlone模式exe一运行就说端口一占用,随便哪个端口都报这个错误:
Error: Could not bind socket. Address and port are already in use.
只要把iis停了,就能运行。32位也这样。
IIS只占用80端口,我把81端口给iw,IW居然报错。
我用PHP测试,在81端口启动一点问题都没有。应该是IW的BUG。
----------------------------------------------
-
作者:
男 pp0123 (pp0123) ▲▲▲▲▲ -
普通会员
2016/6/30 16:34:51
191楼: [c5soft] 试试关上防毒,开启IIS,防火墙开放 4096 以上的端口予 IW/SA ? 有可能是 IIS 的保护机制。也可以试试是否 Windows server 与非 server 版有否不同结果。
----------------------------------------------
-
作者:
男 pp0123 (pp0123) ▲▲▲▲▲ -
普通会员
2016/6/30 16:50:33
192楼: [c5soft] Using IIS PowerShell cmdlets “Get-WebBinding” to list port bindings  https://blogs.technet.microsoft.com/filecab/2013/10/15/windows-server-2012-r2-resolving-port-conflict-with-iis-websites-and-work-folders/
----------------------------------------------
-
作者:
男 pp0123 (pp0123) ▲▲▲▲▲ -
普通会员
2016/6/30 16:54:50
193楼: [c5soft] IIS 的 Port reserved 不是很灵,有些能过有些不能,甚至有些 reserved 了却查不出来。不过这功能我不懂有何意义。
----------------------------------------------
-
作者:
男 ybj316 (ybj) ★☆☆☆☆ -
盒子活跃会员
2017/5/9 11:54:58
194楼: FlatGrid 1.0.0.2 发布
1.支持Session TimeOut处理
2.支持合计显示

@ c5soft (大道至简)。  你好! 这个东东真不错,请问 用什么版本intraweb? 我的Delphi 7 + intraweb 9 打开报错:
赐教? 谢谢!
此帖子包含附件:
JPEG 图像
大小:20.8K
----------------------------------------------
-
作者:
男 zyp1984 (小李他妈的飞刀) ▲▲▲▲▲ -
普通会员
2017/5/9 13:02:00
195楼: 好贴,顶一下..
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..
作者:
男 sxbug (太阳雨) ★☆☆☆☆ -
盒子活跃会员
2017/10/18 14:56:07
196楼: 好东西,再学习一遍
----------------------------------------------
-
作者:
男 kxboy123456 (边客) ▲△△△△ -
注册会员
2018/1/16 18:53:40
197楼: @大道至简,我用intraweb14.0.32+ex5+oracle11g开发了一个简单的查询 web,ie8访问就没有问题。ie6访问就说 无法识别的浏览器。但是以前低版本开发的 在同样一台机器就可以访问。但是看说明ie6应该也是可以的啊,是不是那里兼容性问题?或者在开发的时候在那里可以设置?谢谢了
----------------------------------------------
-
作者:
男 dao_sen (daosen) ▲▲▲▲△ -
注册会员
2018/12/3 9:29:27
198楼: @c5soft  我最近用IntraWEB 15.16 试了一下您的FlatGrid 1.0.0.2,用您带的程序能正常使用,但是我自己编译的点击查询,没有结果出现,发现提示错误在“$.browser.msie”,网上查了一下,发现“jQuery 1.9 移除了 $.browser ”。还有就是发现自己修改了flatgrid.js文件不会应用到新的程序中,还是调用原来的错误。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行156.25毫秒 RSS