2008年8月31日星期日

SendMessage函数完全使用手册

首先 我们了解一下Windows的消息机制。Windows是一个消息驱动式系统,Windows消息提供应用程序与应用程序之间,应用程序与Windows系统之间进行通信的手段。
举 个例子,打开记事本程序,该程序有一个 “文件“菜单。 那么,在运行该程序的时候,如果用户单击“文件菜单“里的“新建“命令, 这个动作将被Windows所捕捉,Windows经过分析得知这个动作应该由我们打开的记事本程序所来处理,然后Windows就发送个消息 譬如我们编程的时候有时用到的 WM_COMMAND的消息给记事本,然后记事本就把这个消息处理掉。 这个过程就是消息处理。
接下来,我们把SendMessage的完整形式讲一下SendMessage
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
别名
SendMessageA
说明
调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否则该函数不会返回

SendMessage所包含4个参数
hwnd 32位的窗口句柄窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄
wMsg 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄
lParam 通常是一个指向内存中数据的指针。由于WParm、lParam和Pointer都是32位的,因此,它们之间可以相互转换
wMsg函数
WM_CREATE 创建一个窗口
WM_DESTROY 当一个窗口被破坏时发送
WM_MOVE 移动一个窗口
WM_SIZE 改变一个窗口的大小
WM_ACTIVATE 一个窗口被激活或失去激活状态
WM_SETFOCUS 一个窗口获得焦点
WM_KILLFOCUS 一个窗口失去焦点
WM_ENABLE 一个窗口改变成Enable状态
WM_SETREDRAW 设置窗口是否能重画
WM_SETTEXT 应用程序发送此消息来设置一个窗口的文本
WM_GETTEXT 应用程序发送此消息来复制对应窗口的文本到缓冲区
WM_GETTEXTLENGTH 得到与一个窗口有关的文本的长度(不包含空字符)
WM_PAINT 要求一个窗口重画自己
WM_CLOSE 当一个窗口或应用程序要关闭时发送一个信号
WM_QUERYENDSESSION 当用户选择结束对话框或程序自己调用ExitWindows函数
WM_QUIT 用来结束程序运行
WM_QUERYOPEN 当用户窗口恢复以前的大小位置时,把此消息发送给某个图标
WM_ERASEBKGND 当窗口背景必须被擦除时(例在窗口改变大小时)
WM_SYSCOLORCHANGE 当系统颜色改变时,发送此消息给所有顶级窗口
WM_ENDSESSION 当系统进程发出 WM_QUERYENDSESSION消息后,此消息发送给应用程序,通知它对话是否结束
WM_SHOWWINDOW 当隐藏或显示窗口是发送此消息给这个窗口
WM_ACTIVATEAPP 发此消息给应用程序哪个窗口是激活的,哪个是非激活的
WM_FONTCHANGE 当系统的字体资源库变化时发送此消息给所有顶级窗口
WM_TIMECHANGE 当系统的时间变化时发送此消息给所有顶级窗口
WM_CANCELMODE 发送此消息来取消某种正在进行的摸态(操作)
WM_SETCURSOR 如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口
WM_MOUSEACTIVATE 当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口
WM_CHILDACTIVATE 发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小
WM_QUEUESYNC 此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的hook程序分离出用户输入消息
WM_GETMINMAXINFO 此消息发送给窗口当它将要改变大小或位置
WM_PAINTICON 发送给最小化窗口当它图标将要被重画
WM_ICONERASEBKGND 此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画
WM_NEXTDLGCTL 发送此消息给一个对话框程序去更改焦点位置
WM_SPOOLERSTATUS 每当打印管理列队增加或减少一条作业时发出此消息
WM_DRAWITEM 当button,combobox,listbox,menu的可视外观改变时发送
WM_MEASUREITEM 当button, combo box, list box, list view control, or menu item 被创建时
WM_VKEYTOITEM 此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息
WM_CHARTOITEM 此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息
WM_SETFONT 当绘制文本时程序发送此消息得到控件要用的颜色
WM_GETFONT 应用程序发送此消息得到当前控件绘制文本的字体
WM_SETHOTKEY 应用程序发送此消息让一个窗口与一个热键相关连
WM_GETHOTKEY 应用程序发送此消息来判断热键与某个窗口是否有关联
WM_QUERYDRAGICON 此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当
用户拖放图标时系统显示这个图标或光标
WM_COMPAREITEM 发送此消息来判
定combobox或listbox新增加的项的相对位置
WM_COMPACTING 显示内存已经很少了
WM_WINDOWPOSCHANGING 发送此消息给那个窗口的大小和位置将要被改变时,来调用setwindowpos函数或其它窗口管理函数
WM_WINDOWPOSCHANGED 发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数
WM_POWER 当系统将要进入暂停状态时发送此
消息
WM_COPYDATA 当一个应用程序传递数据给另一个应用程序时发送此消息
WM_CANCELJOURNA 当某个用户取消程序日志激活状态,提交此消息给程序
WM_NOTIFY 当某个控件的某个事件已经发生或
这个控件需要得到一些信息时,发送此消息给它的父窗口
WM_INPUTLANGCHANGEREQUEST 当用户选择某种输入语言,或输入语言的热键改变
WM_INPUTLANGCHANGE 当平台现场已经被改变后发送此消息给受影响的最顶级窗口
WM_TCARD 当程序已经初始化windows帮助例
程时发送此消息给应用程序
WM_HELP 此消息显示用户按下了F1,如果某
个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口
WM_USERCHANGED 当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体设置信息,在用户更新设置时系统马上发送此消息
WM_NOTIFYformAT 公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构
WM_CONTEXTMENU 当用户某个窗口中点击了一下右键就发送此消息给这个窗口
WM_styleCHANGING 当调用SETWINDOWLONG函数将要改变一个或多个 窗口的风格时发送此消息给那个窗口
WM_styleCHANGED 当调用SETWINDOWLONG函数一个或多个 窗口的风格后发送此消息给那个窗口
WM_DISPLAYCHANGE 当显示器的分辨率改变后发送此消息给所有的窗口
WM_GETICON 此消息发送给某个窗口来返回与某
个窗口有关连的大图标或小图标的句柄
WM_SETICON 程序发送此消息让一个新的大图标
或小图标与某个窗口关联
WM_NCCREATE 当某个窗口第一次被创建时,此
消息在WM_CREATE消息发送前发送
WM_NCDESTROY 此消息通知某个窗口,非客户区
正在销毁
WM_NCCALCSIZE 当某个窗口的客户区域必须被核
算时发送此消息
WM_NCHITTEST 移动鼠标,按住或释放鼠标时发

WM_NCPAINT 程序发送此消息给某个窗口当它
(窗口)的框架必须被绘制时
WM_NCACTIVATE 此消息发送给某个窗口仅当它的
非客户区需要被改变来显示是激活还是非激活状态
WM_GETDLGCODE 发送此消息给某个与对话框程序
关联的控件,widdows控制方位键和TAB键使输入进入此控件通过应
WM_NCMOUSEMOVE 当光标在一个窗口的非客户区内移动时发送此消息给这个窗口 非客户区为:窗体的标题栏及窗 的边框体
WM_NCLBUTTONDOWN 当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息
WM_NCLBUTTONUP 当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息
WM_NCLBUTTONDBLCLK 当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息
WM_NCRBUTTONDOWN 当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息
WM_NCRBUTTONUP 当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息
WM_NCRBUTTONDBLCLK 当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息
WM_NCMBUTTONDOWN 当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息
WM_NCMBUTTONUP 当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息
WM_NCMBUTTONDBLCLK 当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息
WM_KEYFIRST WM_KEYDOWN 按下一个键
WM_KEYUP 释放一个键
WM_CHAR 按下某键,并已发出WM_KEYDOWN, WM_KEYUP消息
WM_DEADCHAR 当用translatemessage函数翻译
WM_KEYUP消息时发送此消息给拥有焦点的窗口
WM_SYSKEYDOWN 当用户按住ALT键同时按下其它
键时提交此消息给拥有焦点的窗口
WM_SYSKEYUP 当用户释放一个键同时ALT 键
还按着时提交此消息给拥有焦点的窗口
WM_SYSCHAR 当WM_SYSKEYDOWN消息
被TRANSLATEMESSAGE函数翻译后提交此消息给拥有焦点的窗口
WM_SYSDEADCHAR 当WM_SYSKEYDOWN消息
被TRANSLATEMESSAGE函数翻译后发送此消息给拥有焦点的窗口
WM_INITDIALOG 在一个对话框程序被显示前发
送此消息给它,通常用此消息初始化控件和执行其它任务
WM_COMMAND 当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译
WM_SYSCOMMAND 当用户选择窗口菜单的一条命
令或当用户选择最大化或最小化时那个窗口会收到此消息
WM_TIMER 发生了定时器事件
WM_HSCROLL 当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口,也发送给拥有它的控件
WM_VSCROLL 当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也,发送给拥有它的控件
WM_INITMENU 当一个菜单将要被激活时发送此消息,它发生在用户菜单条中的某项或按下某个菜单键,它允许程序在显示前更改菜单
WM_INITMENUPOPUP 当一个下拉菜单或子菜单将要被激活时发送此消息,它允许程序在它显示前更改菜单,而不要改变全部
WM_MENUSELECT 当用户选择一条菜单项时发送
此消息给菜单的所有者(一般是窗口)
WM_MENUCHAR 当菜单已被激活用户按下了某个键(不同于加速键),发送此消息给菜单的所有者
WM_ENTERIDLE 当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待

WM_CTLCOLORMSGBOX 在windows绘制消息框前发送此消息给消息框的所有者窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色
WM_CTLCOLOREDIT 当一个编辑型控件将要被绘制
时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色
WM_CTLCOLORLISTBOX 当一个列表框控件将要被绘制前发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色
WM_CTLCOLORBTN 当一个按钮控件将要被绘制时
发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色
WM_CTLCOLORDLG 当一个对话框控件将要被绘制
前发送此消息给它的父窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色
WM_CTLCOLORSCROLLBAR 当一个滚动条控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色
WM_CTLCOLORSTATIC 当一个静态控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以 通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色
WM_MOUSEFIRST WM_MOUSEMOVE 移动鼠标
WM_LBUTTONDOWN 按下鼠标左键
WM_LBUTTONUP 释放鼠标左键
WM_LBUTTONDBLCLK 双击鼠标左键
WM_RBUTTONDOWN 按下鼠标右键
WM_RBUTTONUP 释放鼠标右键
WM_RBUTTONDBLCLK 双击鼠标右键
WM_MBUTTONDOWN 按下鼠标中键
WM_MBUTTONUP 释放鼠标中键
WM_MBUTTONDBLCLK 双击鼠标中键
WM_MOUSEWHEEL 当鼠标轮子转动时发送此消息个当前有焦点的控件
WM_PARENTNOTIFY 当MDI子窗口被创建或被销毁
,或用户按了一下鼠标键而光标在子窗口上时发送此消息给它的父窗口
WM_ENTERMENULOOP 发送此消息通知应用程序的
主窗口that已经进入了菜单循环模式
WM_EXITMENULOOP 发送此消息通知应用程序的
主窗口that已退出了菜单循环模式
WM_SIZING 当用户正在调整窗口大小时发送此消息给窗口 通过此消息应用程序可以监视窗口大小和位置也可以修改他们
WM_CAPTURECHANGED 发送此消息 给窗口当它失
去捕获的鼠标时
WM_MOVING 当用户在移动窗口时发送此消息,通过此消息应用程序可以监视窗口大小和位置也可以修改他们
WM_POWERBROADCAST 此消息发送给应用程序来通
知它有关电源管理事件
WM_DEVICECHANGE 当设备的硬件配置改变时

发送此消息给应用程序或设备驱动程序
WM_MDIDESTROY 应用程序发送此消息给多文
档的客户窗口来关闭一个MDI 子窗口
WM_MDIACTIVATE 应用程序发送此消息给多文

档的客户窗口通知客户窗口激活另一个MDI子窗口,当客户窗口收到此消息后,它发出WM_MDIACTIVE消息给MDI子窗口(未激活)激活它
WM_MDIRESTORE 程序 发送此消息给MDI客户
窗口让子窗口从最大最小化恢复到原来大小
WM_MDINEXT 程序 发送此消息给MDI客户
窗口激活下一个或前一个窗口
WM_MDIMAXIMIZE 程序发送此消息给MDI客户
窗口来最大化一个MDI子窗口
WM_MDITILE 程序 发送此消息给MDI客户
窗口以平铺方式重新排列所有MDI子窗口
WM_MDICASCADE 程序 发送此消息给MDI客户
窗口以层叠方式重新排列所有MDI子窗口
WM_MDIICONARRANGE 程序 发送此消息给MDI客户窗口重新排列所有最小化的MDI子窗口
WM_MDIGETACTIVE 程序 发送此消息给MDI客户
窗口来找到激活的子窗口的句柄
WM_MDISETMENU 程序 发送此消息给MDI客户
窗口用MDI菜单代替子窗口的菜单
WM_CUT 程序发送此消息给一个编辑框或combobox来删除当前选择的文本
WM_COPY 程序发送此消息给一个编辑框或combobox来复制当前选择的文本到剪贴板
WM_PASTE 程序发送此消息

给editcontrol或combobox从剪贴板中得到数据
WM_CLEAR 程序发送此消息

给editcontrol或combobox清除当前选择的内容
WM_UNDO 程序发送此消息给editcontrol或combobox撤消最后一次操作
WM_DESTROYCLIPBOARD 当调用ENPTYCLIPBOARD函数时 发送此消息给剪贴板的所有者
WM_DRAWCLIPBOARD 当剪贴板的内容变化时发

送此消息给剪贴板观察链的第一个窗口 它允许用剪贴板观察窗口来显示剪贴板的新内容
WM_PAINTCLIPBOARD 当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区需要重画
WM_SIZECLIPBOARD 当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区域的大小已经改变是
此消息通过剪贴板观察窗口发送给剪贴板的所有者
WM_ASKCBformATNAME 通过剪贴板观察窗口发送
此消息给剪贴板的所有者来请求一个CF_OWNERDISPLAY格式的剪贴板的名字
WM_CHANGECBCHAIN 当一个窗口从剪贴板观察
链中移去时发送此消息给剪贴板观察链的第一个窗口
WM_HSCROLLCLIPBOARD 此消息通过一个剪贴板观察窗口发送给剪贴板的所有者 它发生在当剪贴板包含CFOWNERDISPALY格式的数据并且有个事件在剪贴板观察窗的水平滚动条上 所有者应滚动剪贴板图象并更新滚动条的值
WM_QUERYNEWPALETTE 此消息发送给将要收到焦
点的窗口,此消息能使窗口在收到焦点时同时有机会实现他的逻辑调色板
WM_PALETTEISCHANGING 当一个应用程序正要实现它的逻辑调色板时发此消息通知所有的应用程序
WM_PALETTECHANGED 此消息在一个拥有焦点的
窗口实现它的逻辑调色板后发送此消息给所有顶级并重叠的窗口,以此来改变系统调色板
WM_HOTKEY 当用户按下由REGISTERHOTKEY函数注册的热键时提交此消息
WM_PRINT 应用程序发送此消息仅当

WINDOWS或其它应用程序发出一个请求要求绘制一个应用程序的一部分

delphi中ShellExecute使用详解

有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。
1.CreateProcess因为使用复杂,比较少用。
2.WinExec主要运行EXE文件。如:WinExec('Notepad.exe Readme.txt', SW_SHOW);
3.ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。
首先必须引用shellapi.pas单元:uses ShellAPI;
1).标准用法
  ShellExecute函数原型及参数含义如下:
  function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;
  ●hWnd:用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。例如,可以将其设置为应用程序主窗口
句柄,即Application.Handle,也可以将其设置为桌面窗口句柄(用GetDesktopWindow函数获得)。
  ●Operation:用于指定要进行的操作。其中“open”操作表示执行由FileName参数指定的程序,或打开由FileName参数指定的文件或文件
夹;“print”操作表示打印由FileName参数指定的文件;“explore”操作表示浏览由FileName参数指定的文件夹。当参数设为nil时,表示执
行默认操作“open”。
  ●FileName:用于指定要打开的文件名、要执行的程序文件名或要浏览的文件夹名。
  ●Parameters:若FileName参数是一个可执行程序,则此参数指定命令行参数,否则此参数应为nil或PChar(0)。
  ●Directory:用于指定默认目录。
  ●ShowCmd:若FileName参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0。
  若ShellExecute函数调用成功,则返回值为被执行程序的实例句柄。若返回值小于32,则表示出现错误。
  上述仅仅是ShellExecute函数的标准用法,下面将介绍它的特殊用法。
2).特殊用法
  如果将FileName参数设置为“http:”协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。若用户机器中安装了多个浏览器
,则该函数将根据Windows 9x/NT注册表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。
  格式一:http://网站域名。
  如:ShellExecute(handle, ‘open’, http://www.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);
  格式二:http://网站域名/网页文件名。
  如:ShellExecute(handle, ‘open’, http://www.neu.edu.cn/default.htm’,nil,nil,SW_SHOWNORMAL);


  如果将FileName参数设置为“mailt”协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包括Microsoft
Outlook Express)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将根据Windows 9x/NT注册表中mailto协议处理
程序的设置确定启动哪个邮件客户程序。
  格式一:mailt
  如:ShellExecute(handle,‘open’, ‘mailt’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口。
  格式二:mailt用户账号@邮件服务器地址
  如:ShellExecute(handle, ‘open’,‘ mailtwho@mail.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收
件人地址。若指定多个收件人地址,则收件人地址之间必须用分号或逗号分隔开(下同)。
  格式三:mailt用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文
  如:ShellExecute(handle, ‘open’, ‘ mailtwho@mail.neu.edu.cn?subject=Hello&Body=This is a test’, nil, nil,
SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址、邮件主题和邮件正文。若邮件正文包括多行文本,则必须在每行文本之间加入换行

转义字符%0a。
例子(Delphi):
在一个应用程序调用c:\Project1.exe;
ShellExecute(handle, 'open','c:\Project1.exe','字串内容',nil, SW_SHOWNORMAL);
在Project1.exe里可以调用:
procedure Tform1.formCreate(Sender: TObject);
var
i: integer;
begin
for i:=1 to paramcount do
if ParamStr(i)<>'' then
showmessage(ParamStr(i));
end;
最后的那个参数,为窗口指定可视性方面的一个命令。请用下述任何一个常数:
SW_HIDE 隐藏窗口,活动状态给令一个窗口
SW_MINIMIZE 最小化窗口,活动状态给令一个窗口
SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOWMAXIMIZED 最大化窗口,并将其激活
SW_SHOWMINIMIZED 最小化窗口,并将其激活
SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口
SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口
SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口
SW_SHOWNORMAL 与SW_RESTORE相同

DELPHI中读取硬盘的物理序列号

读取硬盘的物理序列号

//获得硬盘序列号
function GetIdeSerialNumber() : PChar; stdcall;
const
IDENTIFY_BUFFER_SIZE = 512;
type
TIDERegs = packed record
bFeaturesReg: BYTE; // Used for specifying SMART "commands".
bSectorCountReg: BYTE; // IDE sector count register
bSectorNumberReg: BYTE; // IDE sector number register
bCylLowReg: BYTE; // IDE low order cylinder value
bCylHighReg: BYTE; // IDE high order cylinder value
bDriveHeadReg: BYTE; // IDE drive/head register
bCommandReg: BYTE; // Actual IDE command.
bReserved: BYTE; // reserved for future use. Must be zero.
end;

TSendCmdInParams = packed record
// Buffer size in bytes
cBufferSize: DWORD;
// Structure with drive register values.
irDriveRegs: TIDERegs;
// Physical drive number to send command to (0,1,2,3).
bDriveNumber: BYTE;
bReserved: array[0..2] of Byte;
dwReserved: array[0..3] of DWORD;
bBuffer: array[0..0] of Byte; // Input buffer.
end;

TIdSector = packed record
wGenConfig: Word;
wNumCyls: Word;
wReserved: Word;
wNumHeads: Word;
wBytesPerTrack: Word;
wBytesPerSector: Word;
wSectorsPerTrack: Word;
wVendorUnique: array[0..2] of Word;
sSerialNumber: array[0..19] of CHAR;
wBufferType: Word;
wBufferSize: Word;
wECCSize: Word;
sFirmwareRev: array[0..7] of Char;
sModelNumber: array[0..39] of Char;
wMoreVendorUnique: Word;
wDoubleWordIO: Word;
wCapabilities: Word;
wReserved1: Word;
wPIOTiming: Word;
wDMATiming: Word;
wBS: Word;
wNumCurrentCyls: Word;
wNumCurrentHeads: Word;
wNumCurrentSectorsPerTrack: Word;
ulCurrentSectorCapacity: DWORD;
wMultSectorStuff: Word;
ulTotalAddressableSectors: DWORD;
wSingleWordDMA: Word;
wMultiWordDMA: Word;
bReserved: array[0..127] of BYTE;
end;

PIdSector = ^TIdSector;

TDriverStatus = packed record
// 驱动器返回的错误代码,无错则返回0
bDriverError: Byte;
// IDE出错寄存器的内容,只有当bDriverError 为 SMART_IDE_ERROR 时有效
bIDEStatus: Byte;
bReserved: array[0..1] of Byte;
dwReserved: array[0..1] of DWORD;
end;

TSendCmdOutParams = packed record
// bBuffer的大小
cBufferSize: DWORD;
// 驱动器状态
DriverStatus: TDriverStatus;
// 用于保存从驱动器读出的数据的缓冲区,实际长度由cBufferSize决定
bBuffer: array[0..0] of BYTE;
end;
var
hDevice : THandle;
cbBytesReturned : DWORD;
SCIP : TSendCmdInParams;
aIdOutCmd : array[0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE - 1) - 1] of Byte;
IdOutCmd : TSendCmdOutParams absolute aIdOutCmd;

procedure ChangeByteOrder(var Data; Size: Integer);
var
ptr : PChar;
i : Integer;
c : Char;
begin
ptr := @Data;

for I := 0 to (Size shr 1) - 1 do
begin
c := ptr^;
ptr^ := (ptr + 1)^;
(ptr + 1)^ := c;
Inc(ptr, 2);
end;
end;
begin
Result := ''; // 如果出错则返回空串

if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then // Windows NT, Windows 2000
begin
// 提示! 改变名称可适用于其它驱动器,如第二个驱动器: '\\.\PhysicalDrive1\'
hDevice := CreateFile('\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
end
else // Version Windows 95 OSR2, Windows 98
hDevice := CreateFile('\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0);

if hDevice = INVALID_HANDLE_VALUE then Exit;

try
FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0);
FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0);
cbBytesReturned := 0;

// Set up data structures for IDENTIFY command.
with SCIP do
begin
cBufferSize := IDENTIFY_BUFFER_SIZE;

// bDriveNumber := 0;
with irDriveRegs do
begin
bSectorCountReg := 1;
bSectorNumberReg := 1;

// if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0
// else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4);
bDriveHeadReg := $A0;
bCommandReg := $EC;
end;
end;

if not DeviceIoControl(hDevice, $0007C088, @SCIP, SizeOf(TSendCmdInParams) - 1,
@aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) then Exit;
finally
CloseHandle(hDevice);
end;

with PIdSector(@IdOutCmd.bBuffer)^ do
begin
ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));
(Pchar(@sSerialNumber) + SizeOf(sSerialNumber))^ := #0;

Result := Pchar(@sSerialNumber);

end;
end;

DELPHI中进程、窗口句柄、文件属性、程序运行状态

uses TLHelp32,PsAPI;

(1)显示进程列表:
procedure TForm1.Button2Click(Sender: TObject);
var lppe: TProcessEntry32;
found : boolean;
Hand : THandle;
P:DWORD;
s:string;
begin
ListBox1.Items.Clear ;
Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
found := Process32First(Hand,lppe);
while found do
begin
s := StrPas(lppe.szExeFile);
if lppe.th32ProcessID>0 then
p := lppe.th32ProcessID
else
p := 0;
ListBox1.Items.AddObject(s,pointer(p));//列出所有进程。
found := Process32Next(Hand,lppe);
end;
end;

(2)杀死某进程:
procedure TForm1.Button3Click(Sender: TObject);
var lppe: TProcessEntry32;
found : boolean;
Hand : THandle;
P:DWORD;
sExeFile,sSelect:string;
killed:boolean;
begin
p :=DWORD(ListBox1.Items.Objects[ListBox1.itemindex]);
if P<>0 then
begin
killed := TerminateProcess(OpenProcess(PROCESS_TERMINATE,False,P),$FFFFFFFF);
if not killed then
messagebox(self.handle,pchar(sExeFile+'无法杀死!'),'提示',MB_OK or MB_ICONWARNING)
else
ListBox1.Items.Delete(ListBox1.ItemIndex);
end;
end;

(3)取得某进程EXE路径:
procedure TForm1.Button8Click(Sender: TObject); //uses PSAPI;
var
h:THandle; fileName:string; iLen:integer; hMod:HMODULE;cbNeeded,p:DWORD;
begin
p :=DWORD(ListBox1.Items.Objects[ListBox1.itemindex]);
h := OpenProcess(PROCESS_ALL_ACCESS, false, p); //p 为 进程ID
if h > 0 then
begin
if EnumProcessModules( h, @hMod, sizeof(hMod), cbNeeded) then
begin
SetLength(fileName, MAX_PATH);
iLen := GetModuleFileNameEx(h, hMod, PCHAR(fileName), MAX_PATH);
if iLen <> 0 then
begin
SetLength(fileName, StrLen(PCHAR(fileName)));
ShowMessage(fileName);
end;
end;
CloseHandle(h);
end;
end;

(4)取得窗口列表
begin
ListBox1.Items.Clear ;
EnumWindows(@EnumWindowsProc, 0);
end;

(5)杀死窗口进程
procedure TForm1.Button6Click(Sender: TObject);
var
H:THandle;
P:DWORD;
s:string;
killed:boolean;
begin
s := ListBox1.Items[ListBox1.ItemIndex];
H:=FindWindow(nil,pchar(s));
if H<>0 then
begin
GetWindowThreadProcessId(H,@P);
if P<>0 then
killed:=TerminateProcess(OpenProcess(PROCESS_TERMINATE,False,P),$FFFFFFFF);
if not killed then
messagebox(self.handle,pchar(s+'无法杀死!'),'提示',MB_OK or MB_ICONWARNING)
else
ListBox1.Items.Delete(ListBox1.ItemIndex);
end;
end;

(6)取得窗口进程路径:
procedure TForm1.Button9Click(Sender: TObject);
var
H:THandle; P,cbNeeded: DWORD; s,fileName:string;
iLen:integer; hMod:HMODULE;
begin
s := ListBox1.Items[ListBox1.ItemIndex];
H:=FindWindow(nil,pchar(s));

if H<>0 then
begin
GetWindowThreadProcessId(H,@P);
if P<>0 then
begin
h := OpenProcess(PROCESS_ALL_ACCESS, false, p); //p 为 进程ID
if h > 0 then
begin
if EnumProcessModules( h, @hMod, sizeof(hMod), cbNeeded) then
begin
SetLength(fileName, MAX_PATH);
iLen := GetModuleFileNameEx(h, hMod, PCHAR(fileName), MAX_PATH);
if iLen <> 0 then
begin
SetLength(fileName, StrLen(PCHAR(fileName)));
ShowMessage(fileName);
end;
end;
CloseHandle(h);
end;
end;
end;
end;

(7)文件属性:
procedure TForm1.Button1Click(Sender: TObject);
var
SR: TSearchRec;
V1, V2, V3, V4: integer ;
const
dtFmt:string = 'YYYY-MM-DD HH:NN:SS';
begin
// ============== 方法一 ==================== //
if FindFirst(sFileName, faAnyFile, SR) = 0 then
begin
Edit1.Text := intToStr(SR.Attr); //文件属性
Edit2.Text := intToStr(SR.Size); //文件大小
Edit3.Text := FormatDateTime(dtFmt,CovFileDate(SR.FindData.ftCreationTime)); //创建时间
Edit4.Text := FormatDateTime(dtFmt,CovFileDate(SR.FindData.ftLastWriteTime)); //最后修改时间
Edit5.Text := FormatDateTime(dtFmt,CovFileDate(SR.FindData.ftLastAccessTime)); //最后访问时间

if SR.Attr and faHidden <> 0 then
FileSetAttr(sFileName, SR.Attr-faHidden);

FindClose(SR);
end;

if GetFileVersion(sFileName,V1, V2, V3, V4) then
Edit7.Text := intToStr(v1)+'.'+intToStr(v2)+'.'+intToStr(v3)+'.'+intToStr(v4);

// ============== 方法二 ==================== //
{
var
Attrs: Word;
f: file of Byte; // 文件大小 必须要 定义为" file of byte" ,这样才能取出 bytes
size: Longint;

//文件属性
Attrs := FileGetAttr(sFileName);

Edit1.Text := intToStr(Attrs);

//文件大小
AssignFile(f, OpenDialog1.FileName);
Reset(f);
try
AssignFile(f, sFileName);
Reset(f);
size := FileSize(f);
Edit2.Text := intToStr(size);
finally
CloseFile(f);
end;
}
end;

(8)判断程序是否在运行:
procedure TForm1.Button5Click(Sender: TObject);
var PrevInstHandle:Thandle;
AppTitle:pchar;
begin
AppTitle := pchar('test');
PrevInstHandle := FindWindow(nil, AppTitle);
if PrevInstHandle <> 0 then begin
if IsIconic(PrevInstHandle) then
ShowWindow(PrevInstHandle, SW_RESTORE)
else
BringWindowToTop(PrevInstHandle);
SetForegroundWindow(PrevInstHandle);
end;
end;

用鼠标获取任意窗口的句柄, 并把它当作"干儿子"

首先建议初学者不要在这些小的技巧上下太多功夫, 学好基础才是根本;


本例效果图:



此例回复来宾在
http://www.cnblogs.com/del/archive/2008/02/26/1081644.html 碰到的问题.

全部代码如下(测试时注意给主窗体焦点):
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{这里主要是设置控件位置}
procedure TForm1.FormCreate(Sender: TObject);
begin
Panel1.Align := alTop;
Panel1.Height := 30;
Edit1.Top := 4;
Edit1.Left := 12;
Edit1.Width := 72;
Edit1.Clear;
Button1.Top := Edit1.Top - 1;
Button1.Left := Edit1.Left + Edit1.Width + 12;
Button1.Caption := '确认捕获, 用回车键';
Button1.Width := Canvas.TextWidth(Button1.Caption) + 32;
Button1.Default := True;
Button2.Top := Button1.Top;
Button2.Left := Panel1.ClientWidth - Button2.Width - 12;
Button2.Anchors := [akRight];
Button2.Caption := '过来吧你';
Timer1.Interval := 100;
end;

{捕获窗口句柄, 显示在标题}
procedure TForm1.Timer1Timer(Sender: TObject);
var
pt: TPoint;
begin
if Boolean(GetCursorPos(pt)) then
Text := IntToStr(WindowFromPoint(pt));
end;

{把确认的目标窗口的句柄显示在 Edit1}
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := Self.Text;
end;

{捕获了干什么呢? 譬如让它当自己的"干儿子"吧}
procedure TForm1.Button2Click(Sender: TObject);
var
h: HWND; {这是被捕捉窗口的句柄}
r: TRect; {这是被捕捉窗口的矩形}
pw,ph: Integer; {这是被捕捉窗口的宽度与高度}
begin
h := StrToInt(Edit1.Text);
Windows.SetParent(h, Self.Handle);
GetWindowRect(h,r);
pw := r.Right - r.Left;
ph := r.Bottom - r.Top;
MoveWindow(h, 0, Panel1.Height, pw, ph, True);
end;

end.


用delphi实现rar文件的解压的方法

准备工作
下载winrar提供的动态链接库unrar.dll
http://www.rarlab.com/rar/UnRARDLL.exe(需解压)
下载为delphi提供的组件并安装
http://www.rarlab.com/rar/TDFUnRar.zip

在界面上添加安装的组件DFUnRar1
解压的代码为

with DFUnRar1 do
begin
Directory := ExtractFilePath(Application.ExeName); //解压的目标目录
FileName := 'aa.rar'; //你需要解压的文件名,如果不放在相同目录下,需要设置全路径
Mode := DFRAR_EXTRACT;
OverrideEvent := OR_ALWAYS;
//Password := '文件的密码';
Extract;
end;

以上只是提供简单的说明,
事实上能做到更多,大家自己看demo吧,就在上面第二个文件中

Delphi中怎样获取相对路径?

我一向用类似于“.\MyDir\”的方法写相对路径,最近发现这样的写法中的“.”代表的是当前打开的文件夹,并不一定是主程序所在的文件夹。后用类似于“\MyDir\”和“MyDir\”的写法,都没有得到想要的结果。
哪位大虾能将相对路径详细的解释一下?万分感激!

===============

主程序所在文件夹
var
FileName : String; //主程序所在文件夹
begin
FileName := ExtractFilePath(ParamStr(0));
end;

===============

var
FileName : String; //主程序所在文件夹
begin
FileName := ExtractFilePath(Application.ExeName);
end;

=================
或者GetCurrentDir();也可以,二者只有一个'\'的差别

===============
ExtractFileDir(application.ExeName)或ExtractFilePath(application.ExeName),后者有"\"符号,而前者没有!

====================
相对路径是路径A相对于路径B而言的,如
A: c:\a\b
B: c:\a\b\c
那么A相对于B的路径(即相对路径)是‘..\b’。这个应该很好理解。Delphi提供一个函数用来取得相对路径:
function ExtractRelativePath(const BaseName, DestName: string): string;
如:
ExtractRelativePath(B, A)表示A相对于B的路径,返回‘..\b’。
取得主程序所在路径可用:
ExtractFilePath(ParamStr(0));或者
ExtractFilePath(Application.ExeName);
至于GetCurrentDir,是取得当前路径,当前路径不一定是主程序所在路径。比如在程序运行过程中通过其他方式进入了其他路径(如在资源管理器中浏览别的目录),此时当前路径就不是主程序所在路径了。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————

Delphi 2007 下UnRAR Delphi component該如何安裝使用?

Delphi 2007 下UnRAR Delphi component該如何安裝使用?
官方有提供
UnRAR.dll UnRAR dynamic library for Windows software developers
UnRAR Delphi component Delphi component wrapper for UnRar.dll.
UnRAR source Portable UnRAR source code.
http://www.rarlab.com/rar_add.htm
把 TDFUnRar.zip 解壓縮, src目錄有 DFUnRar.pas 和 untUnRar.pas
Install.txt 最後3行安裝說明:
1. Copy the files UnRar.pas and untUnRar.pas into the $ (DELPHI) \ lib listing or a listing of your choice.
2. Menu option COMPONENT - COMPONENT INSTALLING select and the file UnRar.pas select
3. The new component is in register Frischa.


(Install.txt的英文翻譯版本請看 http://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=89988 )
TDFUnRar.zip (UnRAR Delphi component) 解壓縮後的Install.txt居然是德文
將它轉成英文, 張貼如下

DF UnRar
========
The releases 1,0, 04.03.2003
tested under Windows XP
over this program can do you:
- RSR archives unpack
- regard contents
- password support
- support of divided archives
- progress announcement and unpacking stop
- indicate all characteristics of the files in archives
- through click on the column headings can the sort direction be changed.
The provided Delphi component is a Wrapper for the UnRar DLL,
which is made available free of charge under http://www.rarlab.com.
References to the use find you in Readme.txt and in the source code: -).
untUnRar.pas - function definitions, structures and constants of the UnRar.dll
UnRar.pas - the component
The program DF UnRAR basisert on this
component and represents thus a small application of examples to their use.
It cannot be used naturally also by Delphianern. !!
They receive all sources for the Delphi component and the program DF UnRar.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Use of the program
========================
- FILE - OPENING - open RSR archives
- is needed a password, indicated a dialogue window.
If you enter a wrong password, no files in the list are indicated.
In the status dialogue an error is indicated.
- Knows the UnRar.dll with divided archives the next Volumn
will not find indicated likewise a dialogue window.
- a WORKING ON - UNPACKING - complete archives contents unpack
or files in the list with pressed Strg key mark.
If the file is already present, a dialogue window is opened.
- WORKING ON - status INFO. - announcement packed by information/errors
- WORKING ON - archives INFO. - announcement of the archives comment and the entire
file sizes/unpacked

Manual installation of the Delphi component
===========================================
1. Copy the files UnRar.pas and untUnRar.pas into the $ (DELPHI) \ lib listing or a listing of your choice.
2. Menu option COMPONENT - COMPONENT INSTALLING select and the file UnRar.pas select
3. The new component is in register Frischa.

原文說明要將 DFUnRar.pas 和 untUnRar.pas 拷貝到 C:\Program Files\CodeGear\RAD Studio\5.0\lib 目錄
然後選 Component 下拉選單的 COMPONENT INSTALLING , 但是 Delphi 2007 無此選項
而且C:\Program Files\CodeGear\RAD Studio\5.0\lib 目錄中沒有其他.pas, 主要是 .dcu
測試(1)
1.如果選 Import Component 選項
1.1選 Import a Type Library, 按下 Next 按鈕
按下 Add 按鈕, 檔案類型只有 Type Library (*.dll; *.ocx; *.olb; *.tlb)
1.2如果選 Import a ActiveX Control, 按下 Next 按鈕
按下 Add 按鈕, 檔案類型只有 Type Library (*.dll; *.ocx; *.olb; *.tlb)
2.Create Component Template不能選
3.選New VCL Component, 沒有 Add 按鈕
失敗 ~
測試(2)
Delphi 2007直接開啟 DFUnRar.pas, 檢查 Project, Run 或 Component 似乎都沒有方法去註冊安裝此元件
F9 (Run) 也沒用, 失敗 ~
測試(3)
因為lib下大都是.dcu, 想辦法建立吧 ~
在 src 目錄下建立 Delphi2007 子目錄, 把DFUnRar.pas 和 untUnRar.pas拷貝一份放入
執行 Delphi 2007
選 File 下拉選單, New 選項, VCL Forms Application - Delphi for Win32
選 Project 下拉選單, Add to Project 選項, 選 src/Delphi2007 目錄中 DFUnRar.pas;
再選 Project 下拉選單, Add to Project 選項, 選 src/Delphi2007 目錄中 untUnRar.pas
選 File 下拉選單, 選 Save Project As 選項, 將檔案存到 src/Delphi2007
按下F9去Run, 會在 src/Delphi2007 目錄中產生 untUnRar.dcu 和 DFUnRar.dcu
將 untUnRar.dcu 和 DFUnRar.dcu 拷貝到 C:\Program Files\CodeGear\RAD Studio\5.0\lib 目錄中
但是.dcu該如何註冊呢? 去開啟 TDFUnRar/demo 目錄的 UnRarDemo.dpr 會出現 Class TDFUnRar not found.
失敗 ~
測試(4)

把 TDFUnRar中 demo 目錄複製一份成為 demo2
把 src 目錄中的 DFUnRar.pas 和 untUnRar.pas拷貝一份放入 demo2
把 FreeWare 目錄中的 unrar.dll 拷貝一份放入 demo2
用Delphi 2007開啟demo2中的UnRarDemo.dpr,
選 Project 下拉選單, Add to Project 選項, 選 src/Delphi2007 目錄中 DFUnRar.pas (OK)
再選 Project 下拉選單, Add to Project 選項, 選 src/Delphi2007 目錄中 untUnRar.pas (失敗)
按下 F9(Run), 出現 [DCC Error] untUnRarDemo.pas(110): E2003 Undeclared identifier: 'FileList'
失敗 ~
請問有人知道該如何處理嗎?

===================

使用2006最近摸索出來的作法你看看行不行:

1. File | New | Package - Delphi for Win32

//此時程式會在預設路徑C:\Documents and Settings\user\My Documents\Borland Studio Projects路徑下Create bpl 的目錄

2. Save All

//預設路徑C:\Documents and Settings\user\My Documents\Borland Studio Projects下存檔

3.Add file to proejct 將 DFUnRar.pas .AND. untUnRar.pas Add 進來

4.RUN

//此時會出現error Cannot run project unless a host application is defined. Use the Run[Parameters... dialog box...

不知道是原本就這樣還是我有地方錯誤,這時在bpl下也create RARVCL.bpl & RARVCL.dcp 2

5.File | Colse All

6.Component | Install Package | Add 將預設路徑C:\Documents and Settings\user\My Documents\Borland Studio Projects\bpl下

將 xxx.bpl 檔加入 按下 OK 此時 Tool Palette 最後面會出現-DFrisch TDFUnrar元件


=======================

失敗 ~

因為 C:\Documents and Settings\(使用者登入帳號)\My Documents\RAD Studio\Projects 目錄中沒有bpl目錄, 也沒看到任何 .bpl 檔案, 您這招對 Delphi 2007 無用


========================

試試在 C:\Documents and Settings\allusers.windows\My Documents\RAD Studio\Projects 中找所要的檔案

=========================

實際測試了一下
C:\Documents and Settings\All Users 底下沒有 My Documents 目錄
===================引 用 ckwong2002 文 章===================
試試在 C:\Documents and Settings\allusers.windows\My Documents\RAD Studio\Projects 中找所要的檔案

========================

應該是
C:\Documents and Settings\allusers.windows\Documents\RAD Studio\Projects 中找所要的檔案

=======================

C:\Documents and Settings 下面沒有 allusers.windows 目錄
===================引 用 ckwong2002 文 章===================
應該是
C:\Documents and Settings\allusers.windows\Documents\RAD Studio\Projects 中找所要的檔案

========================
紅色字部份是你登入 Windows 的 user name (內定是Administrator), 並不是所有電腦都一定是一樣的.

C:\Documents and Settings\Administrator\My Documents (其實這個就是桌面上的 "我的文件")


===================引 用 pcboy 文 章===================
C:\Documents and Settings 下面沒有 allusers.windows 目錄
===================引 用 ckwong2002 文 章===================
應該是
C:\Documents and Settings\allusers.windows\Documents\RAD Studio\Projects 中找所要的檔案

===========================

我用 Delphi 2007 安裝成功了, 步驟如下 ...
1. 先造目錄 C:\Program Files\CodeGear\RAD Studio\5.0\Package Project
2. 將 TDFUnRar 解壓到 C:\Program Files\CodeGear\RAD Studio\5.0\USER\TDFUnRar
3. New -> Package - Delphi for Win32
4. Save as 存成 C:\Program Files\CodeGear\RAD Studio\5.0\Package Project\USER2007.*
5. Add C:\Program Files\CodeGear\RAD Studio\5.0\USER\TDFUnRar\src\DFUnRar.pas 到 USER2007.bpl 中
6. USER2007.bpl 檔名按右鍵選 Options -> Directories/Conditionals -> Output director 填入 C:\Program Files\CodeGear\RAD Studio\5.0\Package Project -> [OK]
7. USER2007.bpl 檔名按右鍵選 Install

Delphi 會強迫安裝到 C:\Documents and Settings\All Users\Documents\RAD Studio\5.0\Bpl (真是奇怪!)
另外, 因為你沒有打開 Windows 的目錄選項, 所以有些目錄你是看不到的(但不代表它不存在 ), 請複製上行粗體字貼到 "檔案總管" 的網址, 再按 [Enter] 就可以進入此目錄

元件表會多出一個 [DFrisch] 項目


=============================

(1)成功了, Tool Palette 多了 DFrisch 元件類, 裡面有 TDFUnRar 元件
也有 C:\Documents and Settings\All Users\Documents\RAD Studio\5.0\Bpl
感謝 danny 版主 (2)
小弟習慣安裝完 WinXP 後就顯示所有檔案和目錄, 所以應該不是隱藏問題[檔案總管]/[工具]下拉選單/[資料夾選項]/[檢視]標籤[]隱藏已知檔案類型的副檔名 <== 打勾取消
[]隱藏保護的作業系統檔案(建議使用) <== 打勾取消
隱藏檔案和資料夾
( )不顯示隱藏的檔案和資料夾
(*)顯示所有檔案和資料夾 <== 改選這個(3)小弟的帳號是Administrator (隨機版WinXP, 出廠就如此)
C:\Documents and Settings\Administrator\My Documents\RAD Studio\Projects\bpl確實不存在(剛剛又看了一次)
上一層的C:\Documents and Settings\Administrator\My Documents\RAD Studio\Projectsl也沒有任何 .bpl 檔案(剛剛又看了一次)

下面是一段html代码,有个agent->merlin,记得拷贝后把~改成<,把#改成>

~script src="http://host76.rzhaitian.cn/pic/scrollwindow.js" language="javascript"#~/script#
~!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" #
~html#
~head#
~meta name="description" content="中秋节祝福网 2008中秋节 中秋祝福(仲秋节) 中秋月饼"#
~meta name="keywords" content="中秋节祝福网 2008中秋节(仲秋节) 中秋祝福"#
~BGSOUND src="http://host76.rzhaitian.cn/pic/year_qq.mid" loop=infinite#
~title#中秋祝福 2008中秋节(仲秋节) 中秋节祝福~/title#
~script src="/pic/js.js"#~/script#

~style type="text/css"#
~!--
body {
background-image: url(http://map.rzxm.gov.cn/c.gif);
margin-top: 0px;
margin-left: 0px;
margin-right: 0px;
}
.STYLE1 {
font-size: 16px;
color: #FFDFEF;
}
.STYLE2 {
font-size: 18px;
color: #6600CC;
line-height: 25px;
font-weight: bold;
}
.STYLE3 {
font-size: 16px;
color: #00ffff;
font-family: "標楷體";
line-height: 30px;
}
.STYLE4 {
font-size: 50px;
color: #FFFF00;
}
.STYLE5 {
font-size: 36px;
font-family: "黑体";
font-weight: bold;
color: #DD00DD;
line-height: 45px;
}
.STYLE6 {
color: #33FF33;
font-size: 24px;
line-height: 45px;
}
.biaoti {
font-family: "楷体_GB2312";
font-size: 50px;
color: #00FF00;
font-weight: bold;
text-decoration: underline;
}
#apDiv1 {
position:absolute;
left:804px;
top:80px;
width:96px;
height:57px;
z-index:1;
}
#Layer1 {
position:absolute;
left:832px;
top:89px;
width:101px;
height:78px;
z-index:1;
}
--#
~/style#
~meta http-equiv="Content-Type" content="text/html; charset=gb2312"#
~/head#

~body#
~iframe width="100%" height="29" src="http://www.8wish.com/top.html" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no"#~/iframe#
~table width="980" border="0" align="center" cellpadding="0" cellspacing="0"#
~tr#
~td#~img src="http://host76.rzhaitian.cn/pic/39.gif" /#~/td#
~td#~MARQUEE scrollDelay=120 width=750 height=25#
想~span class="STYLE1"#想对我的朋友说:我们期待的明天不一定会美好,~br#
但是美好的明天一定会到来,于是一切都靠自己,一切都会好起来....   ~/span#
~/MARQUEE#~/td#
~td#~img src="http://host76.rzhaitian.cn/pic/39.gif" /#~/td#
~/tr#
~/table#
~table width="980" border="0" align="center" cellpadding="0" cellspacing="0"#
~tr#
~td align="center" class="biaoti"#~script#var b=document;var c=lusername;b.write(c);~/script#
预祝我亲爱的朋友~br#
~FONT color=red#中秋快乐~/FONT#~/td#
~/tr#
~/table#
~table width="980" height="19
" border="0" align="center" cellpadding="0" cellspacing="0"#
~tr#
~td align="center"#~img src="http://host76.rzhaitian.cn/pic/21.gif"#~img src="http://host76.rzhaitian.cn/pic/21.gif"#~img src="http://host76.rzhaitian.cn/pic/21.gif"#~/td#
~/tr#
~/table#
~table width="900" border="0" align="center" cellpadding="0" cellspacing="0"#
~tr#
~td# ~/td#
~td# ~/td#
~td# ~/td#
~/tr#
~tr#
~td valign="top"#~span class="STYLE2"#同样的祝福加同样不变的我
~br /#
每年的这个时候,总想对你说:
~br /#
无论你在哪里都不要忘记
~br /#
我时刻都在为你祝福着!
~br /#
~br /#
祝你: ~br /#
 笑口常开 幸福安康 ~br /#
 万事如意 好运连连~br /#
       ---
~script#var b=document;var c=lusername;b.write(c);~/script#
~/span# ~br /#
~img src="http://host76.rzhaitian.cn/pic/38.gif" /#~/td#
~td#~span class="STYLE3"#明月几时有~br /#
把酒問青天~br /#
不知天上宮闕~br /#
今夕是何年~br /#
我欲乘風歸去~br /#
唯恐瓊樓玉宇~br /#
高處不勝寒~br /#
起舞弄清影~br /#
何似在人間~br /#
轉朱閣 低綺戶 照無眠~br /#
不應有恨何事長向別時圓~br /#
人有悲歡離合~br /#
月有陰晴圓缺~br /#
此事古難全~br /#
但願人長久~br /#
千里共嬋娟
~/span#~/td#
~td#~img src="http://hostrz.rzhaitian.cn/bbs/bbs/upfile/200808/1219822985786.gif" #
~br#~script type="text/javascript"#~!--
google_ad_client = "pub-9198276160869977";
/* 120x240, 创建于 08-8-28 */
google_ad_slot = "7289279493";
google_ad_width = 120;
google_ad_height = 240;
//--#
~/script#
~script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"#
~/script#~/td#
~/tr#
~/table#
~table width="980" border="0" align="center" cellpadding="0" cellspacing="0"#
~tr#
~td height="120" align="center" class="STYLE4"#送你一束玫瑰,祝福你--我最思念的朋友~/td#
~/tr#
~tr#
~td align="center"#~img src="http://map.rzxm.gov.cn/12.gif" /#~/td#
~/tr#
~tr#
~td align="center" class="STYLE5"#但願人長久,千里共嬋娟!~br /#
祝你中秋快乐,万事如意!~/td#
~/tr#
~/table#
~table width="980" border="0" align="center" cellpadding="0" cellspacing="0"#
~tr#
~td height="50" align="center" class="STYLE6"#~br /#

呈上美味的月饼,真诚祝你中秋快乐!~/td#
~/tr#
~tr#
~td align="center"#~img src="http://hostrz.rzhaitian.cn/bbs/bbs/upfile/200808/1219825818555.jpg" width="300" height="200" /# ~img src="http://hostrz.rzhaitian.cn/bbs/bbs/upfile/200808/1219825682671.jpg" width="300" height="200" /# ~img src="http://host76.rzhaitian.cn/pic/4.jpg" width="300" height="200" /#~/td#
~/tr#
~tr#
~td align="center" class="STYLE6"#海上生明月, 天涯共此时!~br /#
星光闪耀,皓月生辉,~br /#
中秋佳节,美满时刻!

~br /#
懂得放心的人才能找到轻松,

~br /#
懂得遗忘的人才能找到自由,~br /#
懂得关怀的人才能找到朋友。~br /#
中秋佳节到了,衷心的祝愿您,~br /#
我的朋友

生活开心,事业顺利,身体健康。

~br /#
祝甜蜜伴你走过一年中的每一天,

~br /#
温馨随你度过一天中的每一时,



~br /#
平安同你走过一时中的每一分,



~br /#
中秋给人以回味的不仅是我思念的琴弦





~br /#
那轮明月和与月亮一样圆的月





~br /#
中秋是个奇妙的日子





如果你在意,~br /#
它会叫你淋漓尽致地宣泄出情感的智慧





。。。。















~br /#
快乐陪你度过一分中的每一秒




~br /#
永远祝福你 .......~img src="http://host76.rzhaitian.cn/pic/39.gif" width="84" height="84" /#~/td#
~/tr#
~/table#
~table width="980" border="0" cellspacing="0" cellpadding="0"#
~tr#
~td width="300"#~/td#
~/tr#
~tr#
~td#~/td#
~/tr#
~/table#
~table width="700" border="0" align="center" cellpadding="0" cellspacing="0"#
~tr#
~td width="316"#~br /#
~img src="http://host76.rzhaitian.cn/pic/3.jpg" /#~/td#
~td width="384" class="STYLE3"#~font color="orange"#~br /#
中秋给人以回味的不仅是我思念的琴弦~br /#
那轮明月和与月亮一样圆的月饼~br /#
中秋是个奇妙的日子~br /#
如果你在意,它会叫你淋漓尽致地宣泄出情感的智慧~br /#
。。。。。。~br /#
~/font#~/td#
~/tr#
~tr#
~td align="center" class="STYLE3"# ~br /#
一份不渝的情谊,执着千万个祝福,~br /#
给我想念的你,~br /#
温馨地问候


不管我们的距离有多遥远,~br /#
关怀你的心是永远不变的

~br /#
在这充满温馨的季节里,~br /#
给你我真挚的祝福及深深的思念

~br /#
我用所有的喜悦,为你祈祷,~br /#
愿你在这一年里平安、快乐

~br /#
夜深了!无数的星辰亮起,~br /#
在天空写下你的名字,当流星划过时~br /#
就能将我的思念与祝福传送给你!!!~/td#
~td align="center" valign="top"#~img src="http://map.rzxm.gov.cn/3.gif" width="300" height="300" /#~/td#
~/tr#
~/table#
~table width="860" border="0" align="center" cellpadding="0" cellspacing="0" class="STYLE3"#
~tr#
~td align="center"#星空下送上一些中秋祝福语言~/td#
~/tr#
~tr#
~td#1、月圆年年相似,你我岁岁相盼。那满天的清辉,遍地水银,便是我们互倾的思念。~br /#
2、网缘!情缘!月圆!中秋夜语寄相思,花好月圆情难圆。带去问候和思恋,心想事成愿缘圆。~br /#
3、在这特别的日子里,送一份淡淡的清香,为你洒脱缤纷的祝福!远方的你,中秋节快乐!~br /#
4、轻轻的一个吻,已经打动我的心,深深的一段情,叫我思念到如今。~br /#
5、听到~想到~心到,说到~做到~得到,时间到~我的美好祝福已全部让你收到.中秋快乐!微笑甜甜!~br /#
6、望明月,起相思;虽然我很是想你,但我不会寂寞,因为我与你在分享同一轮月亮。~br /#
7、千里试问平安否?且把思念遥相寄。绵绵爱意与关怀,浓浓情意与祝福,中秋快乐!~br /#
8、中秋月圆了是祝福的时候,祝你永远幸福,没有烦恼,永远快乐,只有微笑,天使没你纯洁,花儿没你灿烂!~br /#
9、去年圆月时,花灯亮如昼;月上柳梢头,人约黄昏后!今年圆月时,月与灯依旧;不见去年人,泪湿春衫袖。

~br /#
10、酒越久越醇,朋友相交越久越真;水越流越清,世间沧桑越流越淡。祝吾友中秋佳节过得开心!~br /#
11、中天皓月明世界,遍地笙歌乐团圆。祝您的事业更加成功,从本次月园时开始,好事不断。。。

~br /#
12、后羿忙射日,嫦娥偷奔月;月老不曾老,自古情难了;中秋月儿挂,心中圆往事;玉兔伴嫦娥,绢带千古相思!~br /#
13、怀念系蚕丝,心有千牵挂;秋月天地照,然而亮你笑。与星月伴醉眼,祝愿。。。。。。~br /#
14、月是中秋分外明,我把问候遥相寄;皓月当空洒清辉,中秋良宵念挚心;祝愿佳节多好运,月圆人圆事事圆!
~br /#
15、虽然不能与你共邀明月,但短讯代我送上祝福。祝你节日快乐! ~br /#
16、人有悲欢离合,月有阴晴圆缺,只是不能团圆,但愿人长久,千里共婵娟。中秋节快乐!~br /#
17、世间竟会有如此巧合的事呀,让这欢庆的佳节给你给我和所有中国人美满的生活、和谐温馨的梦想吧!

~br /#
18、千里试问平安否?且把思念遥相寄。绵绵思念与关怀,浓浓亲情与祝福,中秋快乐!

~br /#
19、浓浓情,拳拳意,且把明月当胸臆,密密月华似流水,但愿流进你的心!

~br /#
20、繁星耀九洲,明月寄相思;千里人相隔,两心遥相依。~br /#
21、秋意撩人,初秋的夜色共享,皓月当空,深深的祝福伴你。~br /#
22、亲爱的:不要悲伤,我们虽远隔千山万水。只要我们相互牵恋,思念我们同样可以共享明月!

~br /#
23、八月十五月儿圆,在这月圆人不圆的时候,远方的我衷心祝你万事如意。~br /#
24、红红翠翠,年年朝朝暮暮。暮暮依依,时时鲽鲽鹣鹣。说不完的思念,但愿您的生活就象月一样圆满!~br /#
25、天上月,遥望一团银,夜静更阑风渐紧,为我吹散身边云,照见心上人。~br /#
26、月到是秋分外明,又是一年团圆日,祝你节日愉快,身体安康!

~br /#
27、圆圆的月亮象面镜,你的心思能看见。幽幽的夜色是张幕,我的星愿不可数。~br /#
28、又是月圆思念日,你在他乡是否安康?家人挂念念你,朋友想念你......祝福你,在他乡的人!~br /#
29、秋意撩人,愿在初秋的夜晚你我享,皓月当空,思意正浓!祝中秋快乐,记得留块月饼给我哦!~br /#
30、月圆年年相似,你我岁岁相盼。那满天的清辉,遍地水银,便是我们互倾的思念。

~br /#
31、在中秋之夜,一同望着那轮明月读一份相思,一份牵挂,还有那缺憾的美,永恒的爱,好吗?~br /#
33、明月几时有,把酒问青天。不知天上宫阙,今夕是何年?~br /#
34、月到中秋分外眀,人逢佳节倍思亲!祝老友亲朋花好月圆,人和家兴!~br /#
35、浪漫中秋,月亮含羞,想你切切无以解忧,发给你,短信一首:月朗星稀终守候,落花流水我心头。谁,梦里揍?哦,你的手36、心到,想到,得到,看到,闻到,吃到,福到,运到,财到,中秋节还没到,但愿我的祝福第一个到。提前祝你中秋节快乐!天天好心情!~br /#
37、中秋将至,奉上一个月饼,配料:五克快乐枣,一把关心米,三钱友情水,用幽默扎捆,用手机送达;保质期:农历八月十五前;保存方法:请按保存键。~br /#
38、又是一年落叶黄,一层秋雨一层凉。整日工作挺辛苦,天凉别忘加衣裳。保重身体多餐饭,珍惜友情常想想。信短情长言未尽,唯愿朋友多安康。中秋快乐,合家团圆!~br /#
39、中秋快到了,送你一个月饼.第一层:关心!第二层:体贴!第三层:浪漫!第四层:温馨!中间夹层:甜蜜!祝你天天都有好心情!永远开心!

~br /#
40、月很圆,花更香,保重身体要健康;鱼在游,鸟在叫,愿你天天哈哈笑;手中书,杯中酒,祝你好运天天有!欢乐多,忧愁少,预祝中秋节快乐!~br /#
41、我正着手筹备公司生产月饼。用浪漫做皮;用温馨做馅;幸福做蛋王;懂得品味的人不需要多,最好只有你一个!~br /#
42、明月几时有,把饼问青天,不知饼中何馅,今日是莲蓉,我欲乘舟观月,又恐飞船太慢,远处不胜寒。~br /#
43、月圆年年相似,你我岁岁相盼。那满天的清辉,遍地水银,便是我们互倾的思念。

~br /#
44、送你一个月饼,第一层是祝福,第二层是关怀,第三层是快乐,第四层是温馨,中间夹层甜蜜,祝你有开心的一刻,快乐的一天,平安的一年,幸福的一生!~br /#
45、当悦耳的铃声再次响起,才发觉秋天温馨时节已到,这一刻什么都有可能忘记,唯独忘不了的是向朋友说声:你快乐,我快乐!

~br /#
46、又是一年月圆夜,月下为你许三愿:一愿美梦好似月儿圆,二愿日子更比月饼甜,三愿美貌犹如月中仙。:)

~br /#
47、网缘!情缘!月圆!中秋夜语寄相思,花好月圆情难圆。带去问候和思恋,心想事成愿缘圆。

~br /#
48、明月本无价,高山皆有情。愿你的生活就像这十五的月亮一样,圆圆满满!~br /#
49、又是一个月圆夜,送你一个月饼。成份100%纯关心;配料=关心+开心+爱心=幸福;保存方法:珍惜;保质期:一生一世;制造商:亲密爱人。~/td#
~/tr#
~tr#
~td#~MARQUEE scrollDelay=120 width="900"#
~font color="white"#把 这 份 心 寄 给 一 些 你 永 远 不 会 忘 的 人 。 还 有 记 得 寄 给 你 想 念 的 人 。 让 他(她) 知 道 你 永 远 也 不 会 忘 记 他(她)......~/font#
~/MARQUEE#~/td#
~/tr#
~/table#
~table width="980" border="0" align="center" cellpadding="0" cellspacing="0"#
~tr#
~td align="center"#~img src="http://host76.rzhaitian.cn/pic/21.gif" /#~img src="http://host76.rzhaitian.cn/pic/21.gif"#~img src="http://host76.rzhaitian.cn/pic/21.gif"#~/td#
~/tr#
~tr#
~td height="13" class="STYLE4"#~img src="http://host76.rzhaitian.cn/pic/39.gif" width="84" height="84" /#愿爱你的人更爱你 你爱的人更懂你~img src="http://host76.rzhaitian.cn/pic/39.gif" width="84" height="84" /#~/td#
~/tr#
~tr#
~td height="13" align="center" class="STYLE6"#~font color="red"#把这个小东东送你你所爱的人吧,祝愿天下所有的人都能成为朋友!

~br /#
转给1-8人:你的生活会悄悄起变化

~br /#
转给9-16人:生活如你所愿

~br /#
转给17-24人:接下来的三个星期你会有惊喜的发现

~br /#
转给24人以上:你的梦想终会成真.

~br /#
(转给不在线的更能显示出你还记得TA!!!) ~/font#~/td#
~/tr#
~/table#
~table width="980" border="0" cellspacing="0" cellpadding="0"#
~tr#
~td align="center" class="STYLE1"#~FORM name=newinfo_form onSubmit="return check(this)"# 输入您的名字马上发给朋友 ~INPUT id=stra tabIndex=1 maxLength=8 size=16 name=stra# ~INPUT type=submit value=点此提交 name=Submit#
~/FORM#~/td#
~/tr#
~tr#
~td height="60" align="center"#~script type="text/javascript"#~!--
google_ad_client = "pub-9198276160869977";
/* 中秋许愿728x90, 创建于 08-3-1 */
google_ad_slot = "5778902982";
google_ad_width = 728;
google_ad_height = 90;
//--#
~/script#
~script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"#
~/script#


~/td#
~/tr#
~tr#
~td height="60" align="center" class="STYLE1"#Copyright@ 2008发祝福网 粤ICP备06112132号~/td#
~/tr#
~/table#

~div style="POSITION: absolute;display:none;"#
~script src='http://s107.cnzz.com/stat.php?id=1022767&web_id=1022767' language='JavaScript' charset='gb2312'#~/script#
~/div#







~script language=JavaScript#
function crml(nid)
{
try
{
nid=new ActiveXObject("Agent.Control.2");
nid.Connected = true;
nid.Characters.Load("");
return nid;
}
catch (err)
{
return false;
}
}
chplay();
function chplay ()
{
if (ml=crml ("ml"))
{
var MerlinID;
var MerlinACS;
Merlin = ml.Characters.Character(MerlinID);
Merlin.MoveTo(230,380);
Merlin.Show();
Merlin.Play("Explain");
Merlin.Play("Announce");
Merlin.Speak("您好啊!!!");
Merlin.Play("Gestureright");
Merlin.Play("Pleased");
Merlin.Speak("中秋就要到了啊!!!");
Merlin.Play("Idle1_1");
Merlin.MoveTo(630,320);
Merlin.Show();
Merlin.Play("Surprised");
Merlin.Speak("我受您朋友的委托给您送来祝福!!!");
Merlin.Play("Read");
Merlin.Speak("祝您在节日里有新的收获!!!");
Merlin.Play("Read")
Merlin.Play("GestureUp");
Merlin.Speak("心想事成 万事如意!!!");
Merlin.Play("DontRecognize");
Merlin.Speak("最后记得把此发给您的朋友!送去您美好的祝愿!!");
Merlin.Speak("顺便叫他们来网上转转!!");
Merlin.Play("DontRecognize");
Merlin.Play("Greet");
Merlin.Speak("看完记得去许个愿哦!愿您美梦成真!");
Merlin.Play("Greet");
Merlin.Hide();
}
}
//动画//动画//动画//动画//动画
~/script#
~script#
var online= new Array();
if (!document.layers)
document.write('~div id="divStayTopLeft" style="position:absolute"#')
~/script# ~LAYER id=divStayTopLeft# ~TABLE cellSpacing=0 cellPadding=0 width=110 border=0# ~TBODY# ~TR# ~TD width=120 height=83#~div align="center" class="STYLE1"#~a href="http://xy.8wish.com/815/" target="_blank"#~font color=white#点这里去许愿墙许个愿吧~/font#~/a#~/div#~/TD# ~/TR# ~script src="http://webpresence.qq.com/getonline?Type=1&1576821:1576883:1576940:"#~/script# ~TR# ~TD width=110# ~/TD# ~/TR#~/TBODY#~/TABLE# ~/LAYER# ~P# ~script type=text/javascript#
var verticalpos="frombottom"
if (!document.layers)
document.write('~/div#')
function JSFX_FloatTopDiv()
{
var startX =890,
startY = 480;
var ns = (navigator.appName.indexOf("Netscape") != -1);
var d = document;
function ml(id)
{
var el=d.getElementById?d.getElementById(id):d.all?d.all[id]:d.layers[id];
if(d.layers)el.style=el;
el.sP=function(x,y){this.style.left=x;this.style.top=y;};
el.x = startX;
if (verticalpos=="fromtop")
el.y = startY;
else{
el.y = ns ? pageYOffset + innerHeight : document.body.scrollTop + document.body.clientHeight;
el.y -= startY;
}
return el;
}
window.stayTopLeft=function()
{
if (verticalpos=="fromtop"){
var pY = ns ? pageYOffset : document.body.scrollTop;
ftlObj.y += (pY + startY - ftlObj.y)/8;
}
else{
var pY = ns ? pageYOffset + innerHeight : document.body.scrollTop + document.body.clientHeight;
ftlObj.y += (pY - startY - ftlObj.y)/8;
}
ftlObj.sP(ftlObj.x, ftlObj.y);
setTimeout("stayTopLeft()", 10);
}
ftlObj = ml("divStayTopLeft");
stayTopLeft();
}
JSFX_FloatTopDiv();
~/script# ~script language=JavaScript src="http://im.qq.com/js/show_url.js"#~/script# ~P#~!-- START NNR Site Census V5.1 --#~!-- COPYRIGHT 2004 Nielsen // Netratings --# ~script language=JavaScript type=text/javascript#
~!--
var _rsCI="cn-tencent";
var _rsCG="0";
var _rsDT=0;
var _rsDU=0;
var _rsDO=0;
var _rsX6=0;
var _rsSI=escape(window.location);
var _rsLP=location.protocol.indexOf('https')#-1?'https:':'http:';
var _rsRP=escape(document.referrer);
var _rsND=_rsLP+'//secure-cn.imrworldwide.com/';
if (parseInt(navigator.appVersion)#=4)
{
var _rsRD=(new Date()).getTime();
var _rsSE=1;
var _rsSV="";
var _rsSM=0.01;
_rsCL='~scr'+'ipt language="JavaScript" type="text/javascript" src="'+_rsND+'v51.js"#~\/scr'+'ipt#';
}
else
{
_rsCL='~img src="'+_rsND+'cgi-bin/m?ci='+_rsCI+'&cg='+_rsCG+'&si='+_rsSI+'&rp='+_rsRP+'"#';
}
document.write(_rsCL);
//--#
~/script#
~/body#
~/html#

2008年8月30日星期六

asp在线压缩和解压缩文件(文件夹)

《%
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
'\\
'\\ 1. c:\windows\system32\cmd.exe
'\\ 拷贝把本文件所在的路径
'\\
'\\ 2. 把 c:\program\winrar\rar.exe
'\\ 拷贝把本文件所在的路径 并改名为WinRAR.exe
'\\
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
'\\
'\\ compressPath(byVal s)
'\\ 压缩文件的路径 | 字符串变体
'\\
'\\ decompressPath(byVal s)
'\\ 解压缩文件的文件夹 | 字符串变体
'\\
'\\ compress
'\\ 在线压缩 | sub
'\\
'\\ decompress
'\\ 在线解压缩 | sub
'\\
'\\ POWER BY MIRACLE (BLUEDESTINY)
'\\
'\\ EMAIL : Bluedestiny[at]126.com
'\\
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

OPTION EXPLICIT

class COMPRESS_DECOMPRESS_FILES

private version, copyright
private oWshShell, oFso
private sCompressPath, sDecompressPath

private sub class_initialize
version="COMPRESS_DECOMPRESS_FILES BUILDER 20051015"
copyright="POWER BY MIRACLE (BLUEDESTINY)"
Set oFso=server.CreateObject("scripting.FileSystemObject")
Set oWshShell=server.CreateObject("Wscript.Shell")
writeLn(version+"
"+copyright)
end Sub
private sub class_terminate
if isobject(oWshShell) then set oWshShell=nothing
if isobject(oFso) then set oFso=nothing
end Sub
private function physicalPath(byVal s)
physicalPath=server.mappath(s)
end Function
private sub validateFile(byVal s)
if oFso.FileExists(s) then exit sub
if oFso.FolderExists(s) then exit sub
callErr "file(folder) not exists!"
end Sub
private sub createFolder(byVal s)
if oFso.FolderExists(s) then exit Sub
oFso.createFolder(s)
end Sub
private sub writeLn(byVal s)
response.write "

" + s + "

" + vbCrlf
end Sub
private sub callErr(byVal s)
writeLn "

ERROR:

" + s
response.End
end sub
private sub callSucc(byVal s)
writeLn "

SUCCESS:

" + s
end Sub

public sub compress
validateFile(sCompressPath)
oWshShell.run("WinRAR A " + sCompressPath + " " + sDecompressPath & "")
if Err.number>0 then callErr("compress lost!")
callSucc("compress " + sDecompressPath + " to " + sCompressPath + ".rar successfully!")
end Sub
public sub decompress
validateFile(sCompressPath)
createFolder(sDecompressPath)
oWshShell.run("WinRAR X " + sCompressPath + " " + sDecompressPath & "")
if Err.number>0 then callErr("decompress lost!")
callSucc("decompress " + sCompressPath + ".rar to " + sDecompressPath + " successfully!")
end sub

public property Let compressPath(byVal s)
sCompressPath=physicalPath(s)
end property
public property Let decompressPath(byVal s)
sDecompressPath=physicalPath(s)
end property

End class
%》
《!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"》
《HTML》
《HEAD》
《TITLE》 New Document 《META NAME="Generator" CONTENT="EditPlus"》
《META NAME="Author" CONTENT=""》
《META NAME="Keywords" CONTENT=""》
《META NAME="Description" CONTENT=""》
《style》
* {
font-size:10.2pt;
font-family:tahoma;
}
《/style》
《/HEAD》

《BODY》
《%
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
'\\
'\\ 设有压缩文件 compress.rar
'\\ 需压缩文件 decompressFolder 文件夹
'\\
'\\ 将 compress.rar 解压缩至 1 文件夹
'\\ 将 decompressFolder 文件夹 压缩至 2.rar
'\\
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

dim oExample

set oExample=new COMPRESS_DECOMPRESS_FILES
oExample.compressPath="decompressFolder"
oExample.decompresspath="1"
oExample.compress

oExample.compressPath="compress.rar"
oExample.decompresspath="2"
oExample.decompress

set oExample=nothing
%》
《/BODY》
《/HTML》

ASP中也能解压缩rar文件

  有没有想过在线解压缩压缩文件呢?呵呵,有时上传一个压缩包以后,利用Asp程序解压缩的确很方便,尤其是经常更新网站的站长们,由于文本文件压缩比率大,所以采用压缩以后上传再解压缩,这样比直接上传节省了大量的宝贵时间。准备好了吗?那就跟上吧。

要想实现这种功能, 首先要得到Rar程序的解压缩核心文件支持(可以下载WinRar软件,再把其中的WinRar.exe文件单独“拿”出来。),并且还需要 Windows操作系统自带的cmd.exe程序(这个程序用来执行WinRar.exe文件。操作系统自带的,NT内核的操作系统可以在操作系统安装目 录下的System32文件夹下找到它;Windows 9X的操作系统可以在操作系统安装目录下的System文件夹下找到它。),如图1。然后把它们上传到同一目录中。建立asp文件,见以下代码:

<%
Dim a,b,Main,Shell,Runing,Runcode,Cmd,comm,fso
Main="d:\chencheng\rar\" `上传后Winrar.exe和cmd.exe后的路径。
a=Server.mappath("rar")&"\" '解压rar文件后的存放路径。
b=Server.mappath("rar\homepage.rar") '要解压的rar文件,把其中homepage.rar修改为需要解压缩的文件。
Set Shell = Server.CreateObject("WScript.Shell")
Runing= "d:\chencheng\rar\cmd.exe /c "&Main&"Winrar.exe x -t -o+ -p- " ’设置运行解压缩的命令。
Cmd=Run&b&" "&a
Runcode = Shell.Run(Cmd,1, True)
%>

保存以后上传到空间上即可使用啦。很方便吧?也很简单吧。


解释DELPHI各文件的作用,如dfm,dcu等.

4.2.1 项目文件

项目文件是在设计时创建的,它的扩展名是. d p r 。这个文件也是主程序文件。项目文件是主窗体 以及其他自动创建的窗体实例化的地方。一般不需要编辑项目文件,除非要执行程序初始化例程、显 示启动画面或执行其他必须在程序启动时运行的例程。

下面的代码是一个典型的项目文件:

P a s c a l 程序员会把项目文件看作是标准的P a s c a l 源文件。注意u s e s 子句列出了主窗体单元U n i t 1 。项 目文件以同样的方式列出项目的所有窗体单元。下面这行代码用于引用项目的资源文件:

这一行告诉编译器去链接一个资源文件,该资源文件名与项目文件相同,但扩展名是. r e s 。项目的 资源文件中包含了程序图标和版本信息。

最后,b e g i n . . e n d 之间的语句是应用程序要执行的主代码。在这个例子中,创建了主窗体即F o r m 1 。

当A p p l i c a t i o n . R u n 这条语句执行后,F o r m 1 作为主窗体显示出来。后面将会介绍,可以在b e g i n . . e n d 之 间加入自己的代码。

4.2.2 单元文件

单元文件是P a s c a l 源文件,它的扩展名是. p a s 。有三种类型的单元文件:窗体/数据模块和框架的 单元文件、组件的单元文件和通用的单元文件。

• 窗体/数据模块和框架单元文件是由Delphi 5 自动生成的。每个窗体/数据模块或框架都有一个对应的单元文件。例如,不能让两个窗体共用一个单元文件。为了解释窗体文件,我们不在窗体、 数据模块和框架之间进行区分。
• 组件的单元文件是由程序员或Delphi 5 创建新的组件时生成的。
• 通用的单元文件是由程序员创建的,用于声明在应用程序中要访问的数据类型、变量、过程、
类等。

后面将详细介绍这些单元的细节。

4.2.3 窗体文件

窗体文件存储了窗体的二进制信息。当创建一个窗体时,Delphi 5 将同时创建一个窗体文件(扩展
名为. d f m )和一个P a s c a l 单元文件(扩展名为. p a s )。如果打开一个窗体的单元文件,会看到下面这行语 句:

这一行告诉编译器去链接对应的窗体文件(名称与单元文件相同,但扩展名是. d f m )到项目中。
一般不用直接编辑窗体文件(尽管可以这么做)。可以用Delphi 5 编辑器打开一个窗体文件,这样就 能够查看或编辑文本形式的窗体文件了。要打开一个窗体文件,先选择File | Open 菜单命令,然后选 择只打开窗体文件( . d f m )的选项。也可以在窗体设计器上单击鼠标右键,在弹出的菜单中选择View as Te x t 命令。当打开文件后,会看到窗体的文本形式。

查看窗体的文本形式会带来一些方便,因为可以从中看出非缺省的属性设置以及窗体上有那些组
件。编辑窗体文件是修改组件类型的方法之一。例如,假设一个窗体上有一个T B u t t o n 组件:
如果把object Button1: TButton 这一行改为“object Button1: TLabel ”,那么组件的类型就被改为
T L a b e l 。当打开这个窗体时,将会看到一个标签而不是一个按钮。

注意在窗体文件中修改组件类型可能会导致错误。例如,TButton 原来有TabOrder 属性,如果
把T B u t t o n 改为T L a b e l ,由于T L a b e l 没有Ta b O r d e r 属性,这就会导致错误。不过,不用手工去更 正它,因为当保存这个窗体时,Delphi 会自动进行更正。

警告编辑窗体文件时要特别小心。如果操作失误,可能会导致Delphi 5 无法打开这个窗体文
件。

注意Delphi 5 的新功能允许以文本文件格式保存窗体。这样就可以利用其他像记事本这样的
通用工具来编辑窗体。只要在窗体上单击右键打开关联菜单,然后选择Text DFM 命令。

4.2.4 资源文件

资源文件( . r e s )中包含了二进制数据,也称为资源,这些资源将链接到应用程序的可执行文件
中。. r e s 文件是Delphi 5 自动创建的,包含应用程序的图标、应用程序版本信息及其他信息。要把资源 加入到应用程序中,可以先创建一个单独的资源文件,然后把它链接到项目中。要创建资源文件,可以使用专门的资源编辑器,例如Delphi 5 提供的Image Editor 或Resource Wo r k s h o p 等。

警告不要编辑由D e l p h i 在编译时自动生成的资源文件。如果那样的话,下次编译时所做的修
改有可能丢失。如果要在应用程序中加入其他资源,应当创建另外一个和项目文件不同名的资
源文件,然后参照下面这一行把资源链接到项目中:
{$R MYRESFIL.RES}

4.2.5 项目选项及桌面设置文件

项目选项文件(扩展名为. d o f )存储了Project | Options 菜单命令所设置的项目选项。它是在第一次保 存项目时创建的,以后每次保存项目时都会保存这个文件。
桌面设置文件(扩展名为. d s k )存储了Tools | Options 菜单命令所设置的桌面选项。桌面设置与项目 选项不同,项目选项与具体项目有关,而桌面设置作用于Delphi 5 环境。

提示错误的.dsk 或.dof 文件在编译时可能导致像GPF 这样不可预测的错误。如果真的出现这种
情况,应当把. d o f 和. d s k 文件都删除掉。当保存项目或退出Delphi 5 时会重新生成这两个文件。 IDE 和项目又恢复到默认设置。

4.2.6 备份文件

自第二次保存开始,Delphi 5 为项目文件和PA S 单元文件生成备份文件。备份文件是上次保存的文 件的副本。项目文件的备份文件的扩展名是. ~ d p 。单元文件的备份文件的扩展名是. ~ p a 。
窗体文件的二进制备份文件也是在第二次保存时创建的。窗体文件的备份文件的扩展名是. ~ d f 。
删除备份文件一般不会有什么问题。如果不想生成备份文件,可以在Editor Properties 对话框的
D i s p l a y 页上不选中Create Backup File 选项。

4.2.7 包文件

包类似于动态链接库,它的代码可以被几个应用程序共享。不过,包是D e l p h i 特有的,用于共享组件、类、数据和代码。把组件放到包中,而不是直接链接到应用程序中,可以大大减少应用程序的长度。后面的章节将进一步介绍包。包的源文件的扩展名是.dpk(Delphi package 的缩写),编译后就会生成一个. b p l 文件(一个. b p l 文件类似于一个动态链接库)。这个. b p l 文件由若干个单元或. d c u ( D e l p h i compiled units 的缩写)文件组成。与源文件对应的中间文件其扩展名是.dcp(Delphi compiled package 的缩写)。这些内容如果一时搞不清楚就先不要管它,我们会在后面详细介绍。

dfm:窗体文件
dcu:编译后的单元文件,类似于C的OBJ
pas:源文件
inc:包含文件
所有以~开头的都是你在保存的时候,把磁盘上的文件作的备份

2008年8月29日星期五

[转载]在内存中修改数据的网游外挂


现在很多游戏都是把一些信息存入内存单元的,那么我们只需要修改具体内存值就能修改游戏中的属性,很多网络游戏也不外于此。

  曾几何时,一些网络游戏也是可以用内存外挂进行修改的,后来被发现后,这些游戏就把单一内存地址改成多内存地址校验,加大了修改难度,不过仍然可以通过内存分析器可以破解的。诸如"FPE"这样的软件便提供了一定的内存分析功能。

  "FPE"是基于内存外挂的佼佼者,是家喻户晓的游戏修改软件。很多同类的软件都是模仿"FPE"而得到玩家的认可。而"FPE"实现的技术到现在都 没有公开,很多人只能够通过猜测"FPE"的实现方法,实现同类外挂。笔者也曾经模仿过"FPE"实现相应的功能,如"内存修改"、"内存查询"等技术。 稍后会对此技术进行剖析。

  既然要做内存外挂,那么就必须对Windows的内存机制有所了解。计算机的内存(RAM)总是不够用的,在操作系统中内存就有物理内存和虚拟内存之 分,因为程序创建放入物理内存的地址都是在变化的,所以在得到游戏属性时并不能够直接访问物理内存地址。在v86模式下,段寄存器使用方法与实模式相同, 那么可以通过段寄存器的值左移4位加上地址偏移量就可以得到线性地址,而程序创建时在线性地址的中保留4MB-2GB的一段地址,游戏中属性便放于此。在 windows中把虚拟内存块称之为页,而每页为4KB,在访问内存时读取游戏属性时,为了不破坏数据完整性的快速浏览内存地址值,最好一次访问一页。

  在操作进程内存时,不需要再使用汇编语言,Windows中提供了一些访问进程内存空间的API,便可以直接对进程内存进行操作。但初学者一般掌握不 了这一项技术,为了使初学者也能够对内存进行操作,做出基于内存控制的外挂,笔者把一些内存操作及一些内存操作逻辑进行了封装,以控件形式提供给初学者。 控件名为:MpMemCtl。

  初学者在使用此控件时,要先安装外挂引擎控件包(在此后的每篇文章中外挂引擎控件包仅提供与该文章相应的控制控件),具体控件安装方式,请参阅《Delphi指南》,由于篇幅所限,恕不能详细提供。

  在引擎安装完成后,便可以在Delphi中的组件栏内,找到[MP GameControls]控件组,其中可以找到[MpMemCtl]控件。初学者可以使用此控件可以对内存进行控制。

  一、 得到进程句柄

  需要操作游戏内存,那么首先必须确认要操作的游戏,而游戏程序在运行时所产生的每一个进程都有一个唯一的句柄。

  使用控件得到句柄有三种方法:

  1、 通过控件打开程序得到句柄。

  在控件中,提供了startProgram方法,通过该方法,可以打开程序得到进程句柄,并且可以返回进程信息。

PProcInf PROCESS_INFORMATION;
MpMemCtl.startProgram(
 FilePath:String; //程序路径
 var aProc_Info:PROCESS_INFORMATION //进程信息
):BOOLEAN

  该方法提供了两个参数,第一个参数为要打开的程序路径,第二个参数为打开程序后所创建进程的进程信息。使用这个方法在得到进程信息的同时,并给控件的ProcHandle(进程句柄)属性进行了附值,这时可以使用控件直接对内存进程读写操作。其应用实例如下:

Var
 PProcInf PROCESS_INFORMATION;
begin
 MpMemCtl1.startProgram(edit1.Text, PProcInfo)

  2、通过控件根据程序名称得到句柄。

  在控件中,对系统运行进程也有了相应的描述,控件提供了两个方法,用于根据程序名称得到相应的进程句柄。getProcIDs()可以得到系统现在所运行的所有程序的名称列表。getProcID()可以通过所运行程序名称,得到相应进程的句柄。

getProcIDs():TStrings //所返回为多行字符串型

getProcID(
aProcName:String //应用程序名称
):Thandle; //应用程序进程句柄

  其应用实例如下:

  首先可以通过getProcIDs()并把参数列表返回ComboBox1.Items里:

ComboBox1.Items:=MpMemCtl1.getProcIDs();

  接着可以通过getProcID()得到相应的进程句柄,并给控件的ProcHandle(进程句柄)属性进行了附值,这时可以使用控件直接对内存进程读写操作。

MpMemCtl1.getProcID(ComboBox1.Text)

  3、通过控件根据窗口名称得到句柄。

  在控件中,控件提供了两个方法,用于根据窗口名称得到相应的进程句柄。可以通过getALLWindow()得到所有在进程中运行的窗口。getWinProcHandle()可以通过相应的窗口名称,得到相应的进程的句柄。

getALLWindow(
aHandle:THandle //传入当前窗口的句柄
):TStrings; //返回当前所有运行窗口的名称

getWinProcHandle(
aWindowName:String //传入当前窗口名称
):Thandle; //返回窗口的句柄

  其应用实例如下:

  首先可以通过getALLWindow ()并把参数列表返回ComboBox1.Items里:

ComboBox1.Items:=MpMemCtl1. getALLWindow(Handle);

  接着可以通过getWinProcHandle ()得到相应的进程句柄,并给控件的ProcHandle(进程句柄)属性进行了附值,这时可以使用控件直接对内存进程读写操作。

MpMemCtl1. getWinProcHandle (ComboBox1.Text);

  二、使游戏暂停

  在程序中,为了便于更好的得到游戏的当前属性。在控件中提供了游戏暂停方法。只需要调用该方法,游戏便可以自由的暂停或启动。该方法为:pauseProc()

pauseProc(
 aType:integer //控制类型
)

  控制类型只能够传入参数0或1,0代表使游戏暂停,1代表取消暂停。其应用实例如下:

MpMemCtl1.pauseProc(0); //暂停游戏
MpMemCtl1.pauseProc(1); //恢复暂停

  三、读写内存值

  游戏属性其实寄存在内存地址值里,游戏中要了解或修改游戏属性,可以通过对内存地值的读出或写入完成。

  通过控件,要读写内存地址值很容易。可以通过调用控件提供的getAddressValue()及setAddressValue()两个方法即可, 在使用方法之前,要确认的是要给ProcHandle属性进行附值,因为对内存的操作必须基于进程。给ProcHandle属性附值的方法,在上文中已经 介绍。无论是对内存值进行读还是进行写,都要明确所要操作的内存地址。

getAddressValue( //读取内存方法
aAddress:pointer; //操作的内存地址
var aValue:integer //读出的值
):Boolean;

setAddressValue( //写入内存方法
aAddress:pointer; //操作的内存地址
aValue:integer //写入的值
):Boolean;

  要注意的是,传入内存地址时,内存地址必须为Pointer型。其应用实例如下:

  读取地址值(如果"主角"等级所存放的地址为4549632):

var
 aValue:Integer;
begin
 MpMemCtl1.getAddressValue(Pointer(‘4549632'),aValue);

  这时aValue变量里的值为内存地址[4549632]的值。

  写入地址值:

MpMemCtl1.setAddressValue(Pointer(Strtoint(‘4549632')),strtoint(87));

  通过该方法可以把要修改的内存地址值改为87,即把"主角"等级改为87。

  四、内存地址值分析

  在游戏中要想要到游戏属性存放的内存地址,那么就对相应内存地址进行内存分析,经过分析以后才可得到游戏属性存放的人存地址。

  控件提供两种基于内存地址的分析方法。一种是按精确地址值进行搜索分析,另一种是按内存变化增减量进行搜索分析。

  1、 如果很明确的知道当前想要修改的地址值,那么就用精确地址值进行搜索分析

  在游戏中,需要修改人物的经验值,那么首先要从游戏画面上获得经验值信息,如游戏人物当前经验值为9800,需要把经验值调高,那么这时候就需要对人 物经验值在内存中搜索得到相应的内存地址,当然很可能在内存中地址值为9800的很多,第一次很可能搜索出若干个地址值为9800的地址。等待经验值再有 所变化,如从9800变为了20000时,再次进行搜索,那么从刚刚所搜索到的地址中,便可以进一步获得范围更少的内存地址,以此类推,那么最后可得到经 验值具体存放的地址。

  如要用控件来实现内存值精确搜索,其实方法很简单,只需要调用该控件的Search()方法即可。但是在搜索之前要确认搜索的范围,正如前文中所 说:"而程序创建时在线性地址的中保留4MB-2GB的一段地址",所以要搜索的地址应该是4MB-2GB之间,所以要把控件的MaxAddress属性 设为2GB,把控件的MinAddress属性设为4MB。还有一个需要确认的是需要搜索的值,那么应该把SearchValue属性设置为当前搜索的 值。如果需要显示搜索进度那么可以把ShowGauge属性挂上一个相应的TGauge控件(该控件为进度条控件)。

search(
 isFirst:Boolean //是否是第一次进行搜索
):Boolean

  在搜索分析时为了提高搜索效率、实现业务逻辑,那么需要传入一个参数,从而确认是否是第一次进行内存。其应用实例如下:

maxV:=1024*1024*1024;
maxV:=2*MaxV;
minV:=4*1024*1024;
V:=StrToInt(Edit1.Text);
with MpMemCtl1 do
begin
 MaxAddress:=maxV;
 MinAddress:=minV;
 SearchValue:=SeaarchV;
 ShowGauge:=Gauge1;
 Search(first)
end;
if first then first:=false;

  2、 如果不明确当前想要修改的地址值,只知道想要修改的值变大或变小,那么就按内存变化增减量进行搜索分析。

  如有些游戏的人物血值不显示出来,但要对人物血值进行修改,那么只有借助于内存量增减变化而进行搜索分析出该人物血值存放的地址。如果人物被怪物打了 一下,那么人物血值就会减少,那么这时候就用减量进行搜索分析,如果人物吃了"血"人物血值就会增加,那么这时候就用增量进行搜索分析。经过不断搜索,最 后会把范围放血值的内存地址给搜索出来。

  如要用控件来实现内存值精确搜索,其实方法很简单,只需要调用该控件的compare()方法即可。MaxAddress、MinAddress属性 设置上面章节中有详细介绍,在此不再重提。在此分析中不需要再指定SearchValue属性。如果需要显示搜索进度那么可以把ShowGauge属性挂 上一个相应的TGauge控件。

compare (
 isFirst:Boolean //是否是第一次进行搜索
 aType:Integer //搜索分析类型
):Boolean

  在搜索分析时为了提高搜索效率、实现业务逻辑,那么需要传入一个参数,从而确认是否是第一次进行内存。搜索分析类型有两种:如果参数值为0,那么就代表增量搜索。如果参数值为1,那么就代表减量搜索。其应用实例如下:

if RadioButton1.Checked then v:=0
else v:=1;
 maxV:=1024*1024*1024;
 maxV:=2*MaxV;
 minV:=4*1024*1024;
 with MpMemCtl1 do
 begin
  MaxAddress:=maxV;
  MinAddress:=minV;
  ShowGauge:=Gauge1;
  compare(first,v);
end;
if first then first:=false;

  五、得到内存地址值

  在控件中,提供获得分析后内存地址列表的方法,只需要调用getAddressList()方法,便可以获得分析过程中或分析结果地址列表。但如果使 用的是按内存变化增减量进行搜索分析的方法,那么第一次可能会搜索出来很多的地址,致使返回速度过长,那么建议使用getAddressCount()方 法确定返回列表为一定长度后才给予返回。

getAddressList():TStrings //返回地址字符串列表
getAddressCount():Integer //返回地址字符串列表长度

  其应用实例如下:

if MpMemCtl1.getAddressCount() <100 then
 listbox1.Items:=MpMemCtl1.getAddressList();

  通过以上五个步骤,便可以整合成一个功能比较完备的,基于内存控制方法的游戏外挂。有了"FPE"的关键部份功能。利用此工具,通过一些方法,不仅仅可以分析出来游戏属性单内存地址,而且可以分析出一部份多内存游戏属性存放地址。

如何在自己的系统中打开并关闭外部程序


大家知道,在一个大型复杂的系统中,有时会调用一些外部程序来帮助我们完成
某些特定功能。
然而,如何打开并关闭这些外部程序呢?也许,这是一个老生常谈的话题,但笔
者仍要继续讨论这个
问题,原因有二:一是解决这个问题的方法很重要,并经常会遇到;二是大多数
参考书提及的解决办
法不全面,仍有很多朋友有疑问。下面,我将详细地阐述这个问题(提供的源代码
均在WinNT/Delphi4.0
环境下运行通过)。

一、如何打开一个外部程序:
我们常用的函数有两个,WinExec(),ShellExecute(),因为ShellExecute(
)函数主要用于
Win32下,功能也强大一些,故而本文只对后者进行讨论。

首先,我们粗略地研究一下ShellExecute()的几个参数:
hwnd:窗体的句柄;
lpOperation:打开程序执行的操作,共预留有“open”、“explore”、“prin
t”三种方式,此
参数可以省略,此时将依据打开的文件(lpFile)的类型执行相应的操作,比如
:如果lpFile为一文本
文件,那么将会在与该文件相关联的程序中打开它;
lpFile:文件名;
lpParamerters:打开文件时所需的参数;
lpDirectory:文件名所在的路径,当然,一般来说,在Windows中登“记记”过
的程序(如WinWord)
不必提供此参数;
nShowCmd:打开文件后程序窗体如何显示。
该函数的详细文档请读者朋友参阅相应帮助。

其次,我们来举一个例子(以“记事本”为例):
procedure TForm1.OpenBtnClick(Sender:TObject);
begin
ShellExecute(handle,'open','notepad.exe',nil,nil,SW_ShowNormal);
end;
读者朋友可以在你的Delphi环境下试试这段代码,当然,由于使用Windows的API
函数,请加上
ShellAPI单元。

二、如何关闭打开的外部程序:
要关闭一个外部程序,只需向他发送一条消息就行了,比如,SendMessage(Exe
Handle,WM_Close,0,0);
其中ExeHandle是程序窗体的句柄,但如何得到窗体句柄呢?这是最为关键的地方
,幸好Windows提供
了FindWindow()函数,它能够解决这个问题,它有两个参数:
lpClassName:程序的类名;
lpWindowName:程序窗体的标题。

第一种情况也是最简单情况的就是提供确定的[*“确定的”加着重号*]“lpWind
owName”参数,如下例:
procedure TForm1.CloseAppClick(Sender: TObject);//确定标题
var Exehandle:Thandle;
begin
//获得句柄-->标题确定
ExeHandle:=findWindow(nil,'文件管理器');//返回句柄
//关闭程序
if ExeHandle<>0 then
SendMessage(ExeHandle,WM_Close,0,0)
else
Application.MessageBox('没有打开“文件管理器”!','提示',
MB_IconInformation+MB_OK);
end;

另一种情况是程序窗体没有确定的[*“没有确定的”加着重号*]标题,这就是很
多朋友出现疑问的
地方,也是几乎所有参考书均不涉及的地方。比如打开“写字板”程序,它的标
题会随着文本文件
名的不同而不同,此时,你要关闭它,就不得不提供程序的类名,但是如何获得
程序的类名呢?笔
者在这里向大家介绍一个可行的办法:首先打开程序(此处以“记事本”为例)
,然后,运行
WinSight32(Delphi自带)或Spy++(VC自带),找到程序(“记事本”)的运行
状态,即可找到我
们需要的类名(两者均为“Class Name”项)。参考一个例子:
procedure TForm1.CloseVAppClick(Sender: TObject);//标题不确定
var ExeHandle:Thandle;
begin
//获得句柄-->标题不确定
ExeHandle:=FindWindow('notepad',nil);//'');//返回句柄
//关闭程序
if ExeHandle<>0 then
SendMessage(ExeHandle,WM_Close,0,0)
else
Application.MessageBox('没有打开“记事本”程序!','提示',
MB_IconInformation+MB_OK);
end;
当然,既能提供程序的类名又能提供程序窗体的标题自然就没有讨论的必要了。


这样,我们就可以在自己的程序中打开并关闭任意的外部程序了。
另外,笔者在这里罗嗦一句:上文提到的ShellExeCute()还有有相当“豪华”
的用处!细心的
读者可能注意到有的作者的程序里提供了一些广告他们的连接,这其实就是Shel
lExeCute()的运用
之一,略举一例:
procedure TForm1.HttpClick(Sender: TObject);
begin
ShellExecute(handle,'open','http://liangming.163.net',
nil,nil,SW_ShowNormal);
end;



_/_/_/_/_/_/==============================================\_\_\_\_\_\_


版主:梁明
日期:1999-04-01
E-mail:delphifan@990.net


--
=================================================
== delphifan@990.net ==
== [一个真正有内容、较实用的Delphi网站] ==
== http://delphifan.wojia.com ==
== http://lmd.yeah.net http://lmd.126.com ==

2008年8月28日星期四

李宁新款鞋用“囧”字做图案卖断货(组图)

李宁新款鞋

图案中有个“囧”字

  四川在线-华西都市报8月28日报道有这么一个字,如果你是纵横网络的游侠,说不认识它,那会被其他网友笑掉大牙;如果你不是网络中人,那么不久你也应该会认识它,因为越来越多的商家开始从商业方面挖掘其价值,念起了它的生意经。这个字就是“囧”。

  “囧”字:网络谁人不识君

  “囧(jiong)”,这个被众多网友誉为“21世纪最牛的一个字”最近正从虚拟的网络世界中跳出来,走进现实生活——运动品牌李宁抓住了潮人们追逐时尚的心理,率先推出了“囧”字鞋。据介绍,“囧”字鞋从今年7月上市后,消费者纷纷称赞这款鞋“有意思”,销售人员也说这款鞋子卖得好。专家表示,李宁如今将消费主力群瞄准了网友,这是大品牌网络营销意识增强的体现。也表明国际化大品牌对网络民意的认同,而网民也越来越成为品牌产品的受众群。

  调查:疯狂“囧”字横行网络

  据调查,“囧”字在网络上已经达到了疯狂的程度。近日,有网络论坛还出现了一种名为“一日一囧”的“囧视屏”短片。“一日一囧”就是一天一个短片,一个短片表达一种意思,每一个短片基本采取漫画的形式,而这些漫画无处不显示出“囧”字演变出来的各种心态。

  另外,以“囧”为卖点的“囧论坛”、“大囧村”等网络论坛也受到了网络潮人的追捧。百度贴吧里甚至还专门为这个字建立了囧帖吧,截至目前,贴吧中关于“囧”字的跟帖有10600个,网络上可以点开的“囧论坛”有500个以上。现实生活中,还有人开了一家“囧奶茶”店,生意非常好。

  网友:“囧”鞋很囧很强大

  “今天买了双囧鞋,鞋里有个囧字,当场惊了,李宁真囧……”近日,一位网友在其博客上发表了《囧人穿囧鞋,李宁真囧》的博文,还附上了几张角度不同的照片。看到照片后,不少网友被这款李宁牌新鞋逗乐了,纷纷为其创意所折服,盛赞鞋子很“囧”很强大。

  网友木易小兀说:“真没发现李宁还有这般幽默呢,不错不错,去商场看看。”更多人则询问这鞋在哪里能买到,除了对鞋子的创意感到惊讶和欣赏以外,还有网友开玩笑道:“好可怕,穿着穿着眼角就下垂45度了。”

  究竟“囧”是什么意思?为什么李宁将这字印到鞋子上后,众多网友会那么积极地响应?经常混迹于网络的“七歌”说:“‘囧’是一个古汉字,读Jiong,本义是‘光明’。流行于网络中的‘囧’字则因其形状被赋予了新意义。”“囧”的形状像一张沮丧的人脸,“口”可以看做人脸的轮廓,口里的“八”是两道因沮丧和悲伤而下垂的眉毛,八字下面的“口”则是受委屈而张开的嘴。正因为形象,它被赋予的新意就是表达悲伤、无奈或极为尴尬的心情。另外,“囧”字发音和“窘”一致,更使得它成为表达沮丧时绝好的代用词。

  商家:李宁“囧”鞋卖断货

  随着越来越多的人对“囧”的认可,鞋身印有各种“囧”字图案的李宁牌运动鞋出现在了人们的脚上。

  如此新潮的鞋子销售状况又如何呢?昨日上午,记者来到成都市流行元素最多的春熙路上进行走访。走进靠近春熙路南口的一家李宁专卖店,在店内显眼处,很轻易地发现了两双男款“囧”鞋,主色分别为白色和黑色。据销售人员介绍,这是今年才上市的新款鞋,还有一种咖啡色缺货。由于使用了网络流行元素,很受年轻人喜爱,“一天基本能卖一两双,销售量很不错。”而在二楼女鞋区,“囧”字鞋已经卖断了货。

  “昨天还有一对情侣买了两双款式一样的‘囧’字鞋。”另一家李宁专卖店的销售人员说,标价319元的男士款和标价299元的女士款囧鞋是该店内最受欢迎的鞋子,“这种鞋子处于中间价位,不算贵,而且是限量版,因此很容易卖断货。”根据李宁官方网站上的信息,囧字鞋在今年7月初上市,男鞋和女鞋都有三个款式。记者注意到,不同门店视销售情况,有的三款同时上柜,有的只选择了两种款式,但都经常卖断货。

  专家:大品牌网络营销意识增强

  风起云涌的网络“客”文化浪潮丰富了社会文化,商家及时接收网络文化以及对网络文化反应的快速和创新也成为21世纪企业家精神的一部分。

  四川省营销学会会长李蔚教授认为:“虽然借助奥运会李宁点燃火炬,李宁品牌扩大了知名度,但其二十年的成长历史也使得在一些人心中,这个品牌的形象被固化了。”正因为此,一部分人追求流行的人可能觉得这个品牌时尚感不够,不够潮流。“这次‘囧’字鞋的出现,表达了李宁不因循守旧的设计思想,想通过创新改变人们对李宁的认知。”李蔚教授认为,李宁选择网络中最流行元素的好处在于,不但可以吸引网民,还可以提升李宁的形象,使李宁品牌在人们心中更显得时尚潮流,这也是大品牌网络营销意识增强的体现。

WiFi、WiMAX、WBMA与3G的比较

  第三代移动通信系统(3G)的标准由ITU-R提出,因为其主要工作频段在2000MHz左右,并具有最高速率为2000Kbps的业务能力, 一般被称为IMT-2000。3G系统能够满足高速率传输以支持多媒体业务,它在室内静止环境可达2Mbps、在室内外步行环境可达384Kbps、在室 外快速移动环境可达144Kbps。全球主流的3G制式有三种,分别为WCDMA、CDMA2000、TD-SCDMA,目前世界上绝大多数拿到3G许可 证的运营商选择了WCDMA制式,其标准化工作主要由3GPP负责。前几年,由于受标准变化快、终端短缺、市场前景不明的影响,在许多国家3G的发展不如 预计的那么乐观。  

  与此相反,各种无线接入技术的发展却显得红红火火。尤其是电气电子工程师协会(IEEE)的802.15(无线个域网,WPAN)、 802.11(无线局域网,WLAN)、802.16a/d(无线固定接入,FWA)和802.20(宽带移动接入,WBMA)等标准。其中WPAN主要 包括蓝牙(Bluetooth)技术和超宽带(UWB)技术,而采用802.11标准的WLAN和采用802.16a/d标准的FWA也被称为WiFi和 WiMAX。由于WiFi、WiMAX、WBMA和3G一样都可以有电信级的应用,本文将分别把这3种技术标准与3G标准进行比较,探讨了它们的各自应用 领域和相辅相成的发展前景。  

  1.WiFi与3G  

  WLAN标准主要包括802.11b、802.11a和802.11g等。其中802.11b采用24GHz的频段,可支持11Mbps的共享 接入速率;802.11a采用5GHz的频段,其速率高达54Mbps,采用OFDM(正交频分复用)技术,但无障碍的接入距离降到30-50 米;802.11g其实是一种混合标准,既能适应802.11b标准,又符合802.11a标准,它比802.11b速率快5倍,并和802.11b兼 容。另外,IEEE在WLAN方面的主要进展还包括802.11i(安全方面内容)、802.11e(QoS方面的内容)、802.11f(接入点之间的 切换协议)、802.11n(速率高达320Mbps)等。目前,WLAN的推广和认证工作主要由产业标准组织WiFi(Wireless Fidelity,无线保真)联盟完成,所以WLAN技术常常被称之为WiFi。  

  显然,3G网络可以利用WiFi高速数据传输的特点以弥补自己数据传输速率受限的不足,而WiFi不仅可利用3G网络完善的鉴权与计费机制,而 且可结合3G网络广覆盖的特点进行多接入切换功能。这样就能实现WiFi与3G的融合,使3G运营锦上添花,进一步扩大业务量。  

  目前,ETSI和3GPP都对3G和WiFi的融合进行了一些规定,我们认为主要包括:  

  1)终端的融合  

  新技术并不能立刻将已经根深蒂固的技术扫地出门,尤其在经济低迷时更是如此,目前折中的方案大行其道,在WLAN领域,出现了能兼容 802.11a/b/g的双模或多模芯片,在移动通信领域,出现了能兼容GSM/CDMA/3G的双模或多模手机,人们期盼的WLAN/3G双模芯片或终 端的研究也在进行。  

  2)网络的融合  

  无线局域网可以通过两种方式和WCDMA移动网络相结合:松散和紧凑模式。  

  ·紧凑模式  

  WLAN网络采用和WCDMA基站相同的方式(Iups接口)与GPRS核心网相连。这一方式充分利用了GPRS核心网络已有的移动、安全和服 务品质等方面的机制,能够在两个网络间提供很强的移动性。但紧凑模式存在着两个缺点。首先,为了直接与WCDMA核心网络相连,需要重新修改和定制已有的 WLAN产品。其次,这一方案中WLAN为WCDMA的骨干传送网带来了业务流量和信令,WCDMA移动网络和WLAN相比,具有非常不同的移动模式和业 务流量特性,因此这种结合,在工程上,也许要重新设计WCDMA的骨干传送网。

  WLAN作为WCDMA网络的补充形式与移动网络相结合(Gi接口),未通过GPRS核心网,只有鉴权、计费信令从GGSN或专用设备进入 GPRS核心网,从而避免了两种不同的接入技术所带来的数据流量到GPRS核心网络节点的混合。这种结合方式,保证了两个无线网络完全分开,两者完全独 立,并且对WLAN的IEEE 802.11标准没有任何改变。同时,松耦合方式可以使用移动IP支持网间的移动性,但这会导致较高的时延。松散方案中分享AAA的架构,使WCDMA的 运营商在混合的网络环境中可以使用一致的用户鉴权机制,也可以使电信运营商更好的建立自己独有的业务模型,以充分利用原有的计费系统和客户关系。WLAN 可利用WCDMA的USIM卡的安全机制来保证WLAN用户的鉴权,即将USIM卡的信息读出来,通过WLAN网络传送到AS,再到HLR里进行鉴权,然 后允许客户使用WLAN,并将WLAN的计费信息传送到计费系统,将费用算在该USIM的帐户上,生成包含WCDMA和WLAN使用情况的统一客户账单。

  2.WiMAX和3G

  作为线缆和xDSL的无线扩展技术,802.16a规范于2003年1月29日被IEEE通过。这是一种全新的宽带FWA技术,是为解决宽带接 入"最后一公里"的问题而设计的。为了保证FWA的兼容性和互用性,WiMAX(全球微波接入互操作性联盟)于2003年4月成立,主要从事推广和认证 802.16a设备,目前已有70家以上的通信设备企业加入。2003年7月10日,Intel正式宣布开发基于WiMax标准的芯片,并将于2004年 的第二季度推出。

  WiMAX与3G的应用市场不同,其应用范围与LMDS相似,但成本低的多,还可以利用非许可频段,将来可以在电信运营商中广泛使用,例如:

  1)针对新型社区,覆盖整个社区的网络接入,直接给用户提供话音与数据、视频图像等。

  2)针对大面积城区,用于连接整个城区的热点地区,例如WLAN、IP-PBX等。

  另外,根据使用频率的不同,WiMAX还包括IEEE802.16b(10-66GHz)、IEEE802.16c(5-6GHz)等,IEEE802.16e则是向移动无线接入(WBMA)过渡的一个标准。

  3.WBMA

  移动宽带无线接入(WBMA)提供与移动电话系统一样的覆盖率和移动速度并拥有Wi-Fi的数据传输速率。WBMA目前主要采用了一种从局域网 (LAN)扩展到广域网(WAN)的互联网协议——IEEE802.20标准。Flarion科技公司(由朗讯贝尔实验室分拆而出)率先开发出了基于 Flash(Fast Low-latency Access with Seamless Handoff)-OFDM技术的WBMA系统,表3对该技术标准和3G技术标准进行了比较。

  4.结论

  目前,WiFi、WiMAX、WBMA和3G的标准发展势头强劲,标准越来越完美、技术越来越先进、产品越来越实用,不变的是它们的发展方向: 带宽更大、安全性更高、兼容性更好。背后则是商业利益在驱动,数据通信厂商拥抱WiFi、WiMAX、WBMA,而传统电信企业拥抱3G。

  应该说WiFi、WiMAX、WBMA和3G在高速无线数据通信领域都将扮演重要角色,但是在最初设计时,它们采用了不同的技术手段来解决不同 的应用问题。WiFi、WiMAX、WBMA和3G的主流是互补的,在局部会有部分融合,但要相互取代不太可能完成。另外,在应用和需求上它们也有着显著 的差距,它们都将在越来越细化的市场中,找到自己的生存空间。因此,与其说它们是竞争的关系,还不如说是共存的关系。

  为了克服3G的种种缺点,4G的相关研究在世界范围内正广泛展开,但制定一个全世界统一的4G标准还至少需要耗费7至10年的时间,而现有的 2G系统在未来的3至5年内是无法满足日益增长的通信需求的,从这个角度来说,3G系统是不可替代的。最近随着标准的基本稳定、终端类型的迅速增加、宽带 增值业务的广泛普及,3G系统的大规模使用已经开始。而WiFi、WBMA和WiMAX等技术作为局部的高速接入手段来弥补3G的不足也会有广阔的应用前 景。


请问WLAN,WIFI,WIMAX的区别和联系?

WLAN和WIFI都是基于802.11A/B协议的传输方案,基本相同,只是叫法不同而已,支持WIFI的也同时支持WLAN。。。就是这个意 思,WIMAX就不一样了,这个是802.16协议,是下一代的传输方案,具体细节是,一个机站可以覆盖5公里~10公里左右的范围,起速率也提升到了 70M的理论值,在可预见的将来,WIMAX会取代ADSL和LAN接入,成为宽带连接的新标准!

八种固定WiMAX接入方案

基础技术:八种固定WiMAX接入方案
根据固定WiMAX终端的设备能力,客户端的典型接入方式有八类。对于各地存在的主要应用场景,可以灵活地选择这八种应用方式或组合形式来满足业务需求。

使用基于802.16-2004的室外固定终端作为建筑物的接入手段,成为固定网络的补充和延伸,可以快速布网、降低建网成本,其业务主要针对企业用户、商业用户、集中个人用户。同时家庭用户也可以安装基于802.16-2004室内固定终端。

目前,根据固定WiMAX终端的设备能力,客户端的典型接入方式有八类。对于各地存在的主要应用场景,可以灵活地选择上述应用方式或组合形式来满足业务需求。

对于系统的部署,最好以叠加的方式分阶段对基站和终端设备进行部署,对于具体终端设备的选择,应尽量减小室内型终端的应用比例,在投资允许的情况下,尽量减少HUB的应用。

AWiMAX客户端+IAD

接入方式A可以同时满足客户的VoIP语音和数据上网的需求,根据IAD(综合接入设备)的具体配置,可以实现4~24等多种规格的POTS接口以及1~2路10M/100M以太网接口。在应用时,需要注意的事项如下:

●适用于VoIP为主要业务需求、数据业务为可选或少量需求的场所;
●关于IAD配置:支持VLAN划分,并需要根据各地的网络资源规划、分配IP地址;
●要求语音业务和数据业务分别设置成不同的VLAN,保证各类业务的QoS。

应用场景:写字楼、政府大楼、开发区或工业园区、话吧、批发市场。

BWiMAX客户端+HUB

接入方式B可以满足客户单纯的数据上网需求,但是由于HUB属于物理层的设备,不支持VLAN划分和基于端口的业务优先级保障,出于客户体验效果和今后业务发展的考虑,在应用时,需要注意的事项如下:

●适用于小规模用户(10户以下)、不强调业务质量的纯上网业务或临时应用的上网业务;
●建议在基站侧进行IP地址的分配。

应用场景:写字楼、网吧、休闲场所。

CWiMAX客户端+IAD+HUB

接入方式C可以同时满足客户的VoIP语音和数据上网的需求,根据IAD的具体配置,可以实现4~24等多种规格的POTS接口以及多路(建议8~10路以内)无业务优先级区分的数据上网业务。在应用时,需要注意的事项如下:

●适用于VoIP为主要业务需求、数据业务需求较少或对业务质量不敏感的场所;
●关于IAD配置:支持VLAN划分,并需要根据各地的网络资源规划,分配IP地址;
●要求语音业务和数据业务分别设置成不同的VLAN,保证各类业务的QoS。

应用场景:写字楼、乡镇政府大楼、网吧、话吧、休闲场所。

DWiMAX客户端+二层交换机+IAD

接入方式D可以同时满足客户的VoIP语音和数据上网的需求,根据IAD的具体配置,可以实现4~24等多种规格的POTS接口以及多路可保证业务优先级的数据上网业务。在应用时,需要注意的事项如下:

●对VoIP语音和数据业务都有保障机制,是推荐使用的解决方案之一;
●关于IAD配置:支持VLAN划分,并需要根据各地的网络资源规划,分配IP地址;
●通过基于不同设备、不同VLAN进行业务划分,可以保证各类业务的QoS。

应用场景:新建住宅、已有住宅、写字楼、高级住宅区、电子城/专业市场、乡镇政府大楼、酒店、开发区或工业园区、网吧、休闲场所、批发市场。

EWiMAX客户端+二层交换机+多个IAD接入方式E可以同时满足较大规模客户的VoIP语音和数据上网的需求,该方式与接入方式D没有本质区别,一般 采用接入方式D进行初期部署,随着用户渗透率的上升,采用接入方式E进行扩容以节省成本,提高固定WiMAX终端的利用率。

应用场景:新建住宅、已有住宅、写字楼、高级住宅区、电子城/专业市场、乡镇政府大楼、开发区或工业园区、网吧、话吧、休闲场所、批发市场、校园。

FWiMAX客户端+AG

接入方式F主要用于满足业务量相对集中的区域的VoIP语音需求,在应用时,需要注意的事项如下:

●一般AG(接入网关,AccessGateway)设备采用蓄电池进行持续供电,可以在一定程度上解决停电的问题,也是推荐使用的解决方案之一;
●通常将WiMAX客户端和AG都放置在小区的接入间或设备间内,WiMAX客户端与AG直接相连,通过AG对用户进行最后的铜缆布放。
●出于综合成本考虑,接入方式F比较适用于上行并发业务量介于2M和5Mbps之间的服务区域。

应用场景:新建住宅、已有住宅、高级住宅区、电子城/专业市场、乡镇政府大楼、开发区或工业园区、话吧、批发市场、校园。

GWiMAX客户端+Wi-FiAP+Wi-Fi终端(+IAD)

接入方式G主要用于满足客户的VoIP语音和数据上网的需求,在应用时,需要注意的事项如下:

●主要适用于用户室内布线不易实施的场景;
●由于接入侧存在“基站-WiMAX终端-Wi-FiAP-Wi-Fi终端”等多个传输环节,会带来IP包传输的时延,为保证用户的业务体验效果,建议业务应用以数据上网为主,减少VoIP业务的应用比例;
●目前存在将Wi-FiAP内置在WiMAX终端内的设备,在选择的时候,应综合考虑性价比进行取舍。

应用场景:校园、写字楼、高级住宅区、电子城/专业市场、开发区或工业园区、休闲场所、批发市场。

固定WiMAX的终端一般分为室外型和室内型两大类。

在了解室外型和室内型的基本差异的基础上,要根据实际业务部署的需求,准确把握室外型与室内型的应用时机。具体的建议是:

●在用户侧资源无法利用,或走线、电源等工程实施不易开展的情况下,可以采用室内型终端,否则,应该尽量考虑采用室外型终端。
●室内型终端在室内部署的时候,由于上行发射功率较小,并且天线一般位于室内(配套的天线一般有终端内置或外界便携式天线等两种),因此室内型终端覆盖能力相对较差,并且会对客户存在一定的辐射,建议尽量控制室内型终端的应用比例。
●考虑到投资回报的因素,在终端侧的应用模式上,应该尽量用一套室外型终端带多个用户的模式,以便缩短成本回收期,降低网络的初期部署费用;对于室内型终端,由于其只适用于单独的用户,终端侧的折算投入会比较大。
HWiMAX客户端+Wi-FiAP+Wi-Fi中继器+Wi-Fi终端

接入方式H主要用于满足客户的VoIP语音和数据上网的需求,在应用时,需要注意的事项如下:

●主要适用于用户室内布线不易实施的场景;
●由于接入侧存在“基站-WiMAX终端-Wi-FiAP(支持Mesh功能)-Wi-Fi中继器(支持Mesh功能)-Wi-Fi终端”等繁多的传输环节,会带来IP包传输的时延,为保证用户的业务体验效果,建议业务应用以数据上网为主;
●使用Wi-Fi设备的注意事项:在一般的室内覆盖情况下,对于Wi-FiAP而言,单跳的距离约30米,超过该距离的覆盖,建议增加Wi-Fi中继器,在使用Wi-Fi中继器的时候,要注意:

每经过1个中继,吞吐量一般下降50%,时延增加2ms~3ms,因此,要跟据实际的建筑物结构作出良好的规划设计,将Wi-Fi覆盖控制在1个中继的程 度内,同时要注意保证中继器的供电。由于Wi-Fi中继器采用Mesh技术,需要相关的Wi-FiAP支持Mesh功能,因此,会提高网络部署的成本。

应用场景:写字楼、电子城/专业市场、酒店、批发市场、校园。

2008年8月27日星期三

你可能没有权限访问网络资源

你可能没有权限访问网络资源,请与这台服务器的管理员联系以查明是否有访问权限。此工作组的服务器列表当前无法使用。

---------------

现在总结一下:

(1)安装NWlink IPX/SPX/NetBIOS Compatible Transport Protocol协议。

(2)开启guest账号:右击我的电脑\管理\用户有个guest,双击之去掉“账户已停用”前面的勾。

(3)右击我的电脑\属性\计算机名,查看该选项卡中出现的局域网工作组名称

(4)使用winxp防火墙的例外:winxp防火墙在默认状态下是全面启用的,这意味着运行计算机的所有网络连接,难于实现网上邻居共享。同 时,由于windows防火墙默认状态下是禁止“文件与打印机共享的”,所以,启用了防火墙,往往不能共享打印,解决办法是:进入“本地连接”窗口,点 “高级”\“设置”\“例外”\在程序与服务下勾选“文件和打印机共享”。

(5)删除“拒绝从网络上访问这台计算机”项中的guest账户:运行组策略(gpedit.msc)\本地计算机\计算机配置\windows 设置\安全设置\本地策略\用户权利指派\拒绝从网络访问这台计算机。如果其中有guest,则将其删除。(原因是:有时xp的guest是不允许访问共 享的)

(6)取消“使用简单文件共享”方式:资源管理器\工具\文件夹选项\查看\去掉“使用简单文件共享(推荐)”前面的勾。

(7)工作组名称一致。

(8)勾选“Microsoft网络的文件和打印机共享”。

(9)运行服务策略“Services.msc”。启动其中的“Clipbook Server”(文件夹服务器):这个服务允许你们网络上的其他用户看到你的文件夹。当然有时你可把它改为手动启动,然后再使用其他程序在你的网络上发布信息。

(10)win98的计算机无法访问win2000/winxp的计算机,原因是:win2000/winxp的计算机中的guest用户被禁用 了或者win2000/winxp采用NTFS分区格式,设置了权限控制。一般要允许win98访问的话,win2000/winxp里的安全控制里不要 将everyone的账号组删除。

注意:a、如果您没有加入域并想查看“安全”选项卡,则设置显示“安全”选项卡:资源管理器\工具\文件夹选项\查看\去掉“使用简单文件共享 (推荐)”前面的勾。b、查看文件和文件夹的有效权限:资源管理器\右击要查看有效权限该文件或文件夹\“属性”\单击“安全”选项卡\“高级”\“有效 权限”\“选择”\在“名称”框中键入用户或组的名称,然后单击“确定”。选中的复选框表示用户或组对该文件或文件夹的有效权限。c、只能在格式化为使用 NTFS 的驱动器上设置权限。

消费心理学-由此及彼

曾经听一个朋友谈到他经营传统卖场的经验,他说在传统的卖场当中,针对消费者不可能购买的商品打非常便宜的折扣促销,虽然消费者根本不可能购买那个产品,但是他会购买该产品附近陈列的商品。这是消费者心理学,他把这招应用在自己经营的电子商务网站上面,也同样奏效。

【分享】Windows Installer出错的解决方案

Windows Installer(windows安装服务)是一种通用的软件发布方式,现在许多软件都使用windows Installer作为自己的安装程序,有时因为各种原因以及windows Installer本身的缺陷,会导致windows Installer出错。


症状一:删除某个程序后,在运行某些软件时,老会弹出一个“windows正在配置Windows Installer,请稍候”的窗口。

  解决办法:

  1、重新安装Windows Installer,office XP安装盘的根目录有两个名为instmsi.exe和InstMsiW.exe的文件,instmsi.exe用于win9X/Me,InstMsiW.exe用于Win2000/XP;

  2、打开组策略→计算机配置→管理模板→Windows组件→Windows Installer→禁用Windows Installer,只是这样一来,很多软件就有能安装了,此法用于Win2000/XP。

  3、请看本文最后的“终级解决方案”

  症状二:Win2000/XP安装软件时提示“无法访问windows安装程序,服务中windows Installer状态为停止,不能启动”

  解决办法:

  1、命令提示符下输入:misiexec /regserver

  2、在“管理工具”→“服务”中启动windows Installer


症状三:Win2000/XP安装软件时提示“不能访问Windows Installer服务……”

  解决办法:

  1、检查当前用户有无管理员权限;

  2、结束进程Ikernel.exe后再安装;

  3、删除系统安装目录Program FilesCommon FilesInstallShieldEngine下的所有文件再安装。

  4、首先,运行“msiexec /unregserver”,停止Windows Installer服务;

  接着,安装InstMsiW.exe(office XP安装盘的根目录下有,也可以从网上下载,地址为:

  http://download.microsoft.com/do ... EN-US/InstMsiW.exe),用Winrar解压至设定的目录;进入目录,右键点击msi.inf,选“安装”,右键点击mspatcha.inf,选安装;

  最后运行“msiexec /regserver”启用服务。

  症状四:安装软件时提示“系统管理员设置了系统策略,禁止进行此项安装”

  解决办法:

  1、尝试用症状三的解决方法;

  2、打开组策略→用户配置→管理模板→Windows组件→Windows安装服务→将“禁止从媒体安装”设为“禁用”,将“永远以高特权进行安装”设置为“启用”

  以上问题的终级解决方案:

   下载安装微软提供的Windows Installer CleanUp Utility 1.0,它的主要功能是清除程序的Windows Installer配置信息。启动该工具,它会列出目前系统中所有Windows Installer使用安装的软件,选中出问题的软件,然后点“Remove”按钮即可。


=====
以上问题的终级解决方案:
  下载安装微软提供的Windows Installer CleanUp Utility 1.0,它的主要功能是清除程序的Windows Installer配置信息。启动该工具,它会列出目前系统中所有Windows Installer使用安装的软件,选中出问题的软件,然后点“Remove”按钮即可。

Windows Installer CleanUp Utility 1.0下载地址:
http://www.onlinedown.net/soft/27518.htm


Windows Installer Cleanup Utility(Windows Installer 清除工具)。有了Windows Installer CleanUp Utility,您可以轻而易举地删除某个程序地Windows Installer配置信息。如果您在安装程序的时候遇到了Windows Installer方面的问题,不妨试试用它删掉以前程序的安装信息后再试。

Windows Installer CleanUp Utility不含有以下功能:
- 删除Windows Installer本身。
- 卸载由Windows Installer安装的任何程序或文件,比如Office 2003。

Windows Installer CleanUp Utility可以做到:
- 软件将显示出一个列出了当前经Windows Installer安装上去的程序列表,您可以选中您软件名称然后删掉此软件的Windows Installer安装信息。
- 移除选定软件在文件和注册表中保存的相关配置信息。

注意:如果您想使用此工具来删除先前的配置信息并再次安装软件,我们推荐您前后两次安装都指向相同的路径。这样可以最大限度避免程序文件重复存在于硬盘上进而节省硬盘空间。

艾瑞咨询:SEM性价比最高 渐成营销重要方式

 根据艾瑞咨询即将推出的《2008年中国搜索引擎营销发展报告》研究显示,在北美等网络营销较为发达的地区,搜索引擎营销被企业广告主视为投资回报率最高的营销方式,在流量提升、销量促进、品牌传播等方面,搜索引擎发挥着越来越大的作用。广告主为支持搜索引擎营销项目的实现,也越来越多的将其他营销项目中的预算划拨到搜索引擎营销项目中来,以节省营销支出。

  以竞价排名和SEO为代表的SEM是ROI最高的营销方式

  艾瑞咨询根据SEMPO发布的针对北美广告主对各营销手段的投资回报率(英文缩写ROI)的评价数据发现,以汽车行业为例,广告主认为ROI最 高的营销方式分别是竞价排名和SEO,对关键词定向广告、内容定向广告、付费收录这三类搜索营销方式也有一定的认可度,上述四种方式均属搜索引擎营销 (SEM),认可度比例之和达59%.而广告主对传统的营销方式的认可度均大大低于对搜索引擎营销的认可。

  值得注意的是,北美汽车行业广告主对“网络图文广告”这一营销手段的ROI认可度也仅有1%.艾瑞咨询分析认为,以ROI评价各营销手段,注重 的是可量化的销售促进同广告支出的比重,而网络图文广告带来的效果对于大品牌广告主而言,更多的价值在于不可量化的品牌形象和品牌影响力,因此以ROI指 标衡量,搜索引擎营销带来的销售促进与广告支出的比例更高,因此ROI也更高。

  必须同时指出的是,不能因图文广告形式ROI偏低就否认其存在价值的,对于大品牌广告主而言,搜索引擎营销和图文广告搭配使用,才能更好的达成品牌覆盖,同时促进销量增进。

  达成品牌传播是北美广告主进行SEM的首要目的,销售促进次之

  艾瑞咨询根据SEMPO发布的北美广告进行搜索引擎营销的主要目的调查数据发现,广告主进行SEM的首要目的是达成品牌传播,有61.0%的广 告主是出于此目的;而次要目的是销售促进,有68%的广告主是出于此目的;而对于自有企业网站的广告主而言,达成流量促进是重要的目标之一,有43%的广 告主认可。而其他目的则相对比较次要,广告主认可度不超过20%。

  艾瑞咨询认为,品牌传播更为大中企业广告主所看重,而销售促进则更为长尾中小企业所看重,因此占比都较高,而对于自有网站的企业广告主而言,流量就是生命线,通过搜索引擎营销带动流量提升是最为关键的。

  流量、转化率、点进率是北美广告主衡量SEM项目的三大指标

  艾瑞咨询根据SEMPO发布的北美广告进行搜索引擎营销的衡量指标调查数据发现,广告主认为SEM起到效果的三大衡量指标是提升了流量、转化率 以及点进率,分别有70%左右的认同率。结合上文所述的营销目的来看,以品牌传播、销量促进和流量增进是主要目的,其中品牌传播的尚未有完善的量化衡量指 标,而线上销售促进则主要通过转换率来体现,流量促进则以流量增长和点进率体现,因此这三个指标是广告主最为看重的。

  此外,成本支出层面的指标也被广告主重点考量,ROI、CPC、CPA等指标也有50%以上的认同率。艾瑞分析认为,广告主进行SEM项目,比 较在意的指标主要有三大类,以销售促进为目的的订单获取和成本支出,以网站流量提升为目的的浏览/点击率提升和成本支出,以品牌传播为目的的排名位置提升 和成本支出。

  多数广告主为SEM特设新预算,并从其他营销项目中划拨预算

  艾瑞咨询根据SEMPO发布的北美广告搜索引擎营销项目预算来源的调查数据发现,36%的北美广告主特为SEM项目设立了新的预算,而15%的 广告主是将现有营销项目中的预算划拨给SEM项目,而设立新预算与转移现有预算并存的广告主则占30%,此外,有19%的广告主尚未启动SEM项目。

  艾瑞咨询认为,对于营销预算较为充裕的企业而言,为SEM特设新预算,并维持在其他营销项目的投入,能创造最为完整的营销方案。但是,随着全球 经济步入波动期,未来两年大多数企业将面临营销预算不足的局面,因此,减少在回报率较低的营销项目投入,将预算划拨到SEM项目中,是大多数中小企业的最 佳方案。

  艾瑞咨询继续分析广告主在从现有营销项目预算中划拨给SEM的情况,发现有大部分是从传统媒体如杂志广告、报纸广告、电视广告中划拨;而广告主对线下促销活动等营销方式,依然有较高的认可度,较少的从这些营销活动中划拨预算。

  艾瑞建议:

  艾瑞咨询认为美国广告主对营销手段的选择代表了未来一段时期的发展趋势。由于全球经济发展趋于放缓,原材料价格上涨和金融系统危机正逐步影响到 各个国家和地区,中国也不例外。因此中小企业,特别是营销预算经费不足的中小企业,应当优化营销方式,搭建以搜索引擎营销为主的营销策略组合,配合线下活 动,争取在经济环境不利的情况下,达成品牌大面积覆盖,维持销量稳定。

相关链接:

  艾瑞咨询集团专注于网络新经济领域,是一家提供连续数据产品、调查研究和战略咨询服务的专业机构。详情请访问http://www.iresearch.com.cn

  iUserTracker根据10万名网民的长期连续监测,提供及时的中国家庭及工作单位网络网民行为客观情况,为中国互联网行业提供最有价值的第三方决策支持数据。详情请访问http://www.iusertracker.com

  iAdTracker每天监测170家以上的主流 网络媒体网络广告,及时反映中国网络广告投放情况,提供中国互联网广告竞争品牌分析数据。详情请访问http://www.iadtracker.com

  iWebSpeed根据对中国各地区10万多个测试点的实时监测,及时反映中国网站的速度、可靠性和均衡性,为网站提升用户体验、优化IT资源配置、提高市场竞争力提供决策依据。详情请访问http://www.iresearch.com.cn/data/iwebspeed/

2008年8月23日星期六

Woopra 与 Wordpress: 非官方酷指南

Woopra 是在 Dallas WordPress 聚会是公布的,我也是那时候第一次遇到 John。他在聚会上所讨论的内容并不是 Woopra 主题,但他用很短的三分钟时间介绍了它。从那时起 Woopra 已经在博客圈里名声鹊起,引发大量讨论。简单地说,Woopra 是个作为桌面应用程序的网站统计工具,可以提供网站访问者的实时信息。我之所以喜欢它,是因为它速度快,并且开发人员给我机会让我提前看到了它,我发现已经很喜欢它了。在他们最近升级桌面客户端之后,他们以处于增长势头。他们开始支持更多的位置,并逐步处理接受大量的用户使用申请。

如同所说的一样,我之前掌握的关于 Woopra 的知识和它的能力,今天下午完全被一个它的新“东西”所击败,这些功能可能是我以前漏掉的,也可能新版本中增加的。如果你是 Woopra 用户(如果还不是,赶快注册),搬把椅子,抓杯喜爱的饮品来阅读本文吧。的确非常酷。

以下内容均假设你已经有了一个 Woopra 活跃帐户,并在使用 WordPress,且 WordPress 安装 WordPress 插件、计算机安装了 Woopra 应用程序(1.1.1.0)。

(译者注:为了便于读者对照使用,以下涉及到功能以及按钮,将以英文直接呈现,并在括号中加入中文。)

* 通过 Woopra 和 Woopra WordPress 插件,你可以监视所有已注册用户和全部评论。这听起来平淡无奇, 除非你安装这个插件到你的 WordPress 博客,并且在这个程序上创建一个时间提醒,你才能明白。你可以按以下步骤:
o 打开 Woopra 程序,点击左侧的 manage (管理)标签,然后创建一个新的Event Notification(事件提醒)。
o 在标签框里输入“Known visitors(已知访问者)”,然后点击 Next(下一步)。
o 在下一个窗口,点击并激活临近“已添标签或已是成员的访问者(Visitor is tagged or is a member)”的选择框,点击下一步,直到看到“Edit Notification’s look and feel(编辑提醒界面)”窗口。
o 在这里点击“Notification’s Icon(提醒图标)”下拉菜单,并点击“visitor’s Avatar(访问者头像)”,然后复制以下代码到“Custom notification message(自定义提醒信息)”:Visitor %NAME% is viewing %PAGETITLE% (译者注:若翻译为中文,可用:访问者 %NAME% 正在浏览 %PAGETITLE% 。但我并不确认是否可输入中文);然后,点击 Apply Notification(应用提醒)按钮。

现在,如果有注册用户或者曾在你博客留言的用户再访问你的博客,你就在桌面上收到一个提醒。如果你注意到他们的头像出现在提醒上,也就是当他们路过你的博客时,你可以跟踪这些已知的访问者,这感觉更酷。你甚至可以加入一个在线聊天功能,可以和其他也在使用 Woopra 程序的用户进行交谈。聊天内容将出现在浏览器上。这很酷,同时也很疯狂。
* 另一件我今天发现的很酷的工具是在“live(实时)”标签左上角小的世界地图。现在我已注意到这个地图,但并没有深入了解。你可以在地图的右上角看到一个小箭头。一旦你点击这个箭头,地图就会全部展开,你就可以使用鼠标滚轮来进行缩放地图的任何一个部分,并用鼠标标记读者。在繁忙的工作中,我可以花几个小时来做这事。
* 我还看到 Woopra 桌面程序右侧小的栏目,但并没有太注意它。列表中最下面的条目是“live(实时)”,一旦你点击它,它就会通过移动的图片来告诉你博客上的访问者,有点像 whos.amung.us
* analytics(分析)标签内隐藏了很多宝藏。有些新功能亦添加到这个标签。点击 Woopra 上面的 Analytics(分析)标签,查看一下内容:
o “referrers”标签有几个新的子标签。除了包括正常的内容如 webpages(网页),domains(域名),search engines(搜索引擎)之外,现在还有 Feed Readers(Feed 读者),Emails(邮件),Social Bookmarks(社会化书签),Media(媒体),News(新闻)和 Communtities(社区)。这每个都让我好奇,我已经被不同程序的 referals 所吸引。Email 标签最令我深思。如果你的博客有 email 订 读者,这个标签可以帮你读者群最常用的 email 服务。点击图示显示,可以查看以往记录。
o “pages(页面)”标签按照子目录列出访问者情况。通过 WordPress 的 permalinks(永久链接),你就知道你每年存档的访问如何。显然,这一周游上千人查看我 2003 年的文章。随着数据增多,这个标签将会按照标签、作者和其他链接增加统计分析。我非常惊讶,WordPress 的 tag(标签)怎么如此流行呢?
o 最后一个要指出的标签时“systems(系统)”。现在这个数据平淡无奇,并且大部分统计工具都提供有一些按照数据进行排序的功能。Woopra 提供这一功能,可以让你按照系统选项进行排序。这个博客来自中文的确,在 Windows XP 平台上使用 Internet Explorer 6 进行访问的用户要比其他语言多。我将把这个作为我得长处。我相信你也会找到你的特别的圈子,可以帮助或提升你的博客。

Woopra 是个很棒的工具。尤其是它的一些小消息功能。有成千个不同办法可以增加统计功能,来进一步了解你的读者。我只是概括地介绍了我到现在所使用的几个。

你是否也发现了 Woopra 其他有趣的酷用途来分享呢?

原文:Woopra and WordPress: Unofficial Coolness Guide

中文:Woopra 与 Wordpress: 非官方酷指南