2008/02/25 | Rundll32.exe使用方法大全
类别(其他相关笔记) | 评论(0) | 阅读(3403) | 发表于 13:07

http://zyjia.spaces.live.com/default.aspx?_c01_blogpart=blogmgmt&_c=blogpart&nextPost=true&postPH=cns!35C86A7726FA02FF!208

Rundll32.exe使用方法大全

[分享]Rundll32.exe使用方法大全
winexec(Pchar('StrCommand'),sw_Show);
其中StrCommand代表以下命令之一(使用Windows中的运行不要加引号):
rundll32 shell32,Control_RunDLL - 运行控制面板
rundll32 shell32,OpenAs_RunDLL - 打开打开方式窗口
rundll32 shell32,ShellAboutA Info-Box - 打开关于窗口
rundll32 shell32,Control_RunDLL desk.cpl - 打开显示属性窗口
rundll32 user,cascadechildwindows - 层叠全部窗口
rundll32 user,tilechildwindows - 最小化所有的子窗口
rundll32 user,repaintscreen - 刷新桌面
rundll32 shell,shellexecute Explorer - 重新运行Windows Explorer
rundll32 keyboard,disable - 锁写键盘
rundll32 mouse,disable - 让鼠标失效
rundll32 user,swapmousebutton - 交换鼠标按钮
rundll32 user,setcursorpos - 设置鼠标位置为(0,0)
rundll32 user,wnetconnectdialog - 打开映射网络驱动器窗口
rundll32 user,wnetdisconnectdialog - 打开断开网络驱动器窗口
rundll32 user,disableoemlayer - 显示BSOD窗口, (BSOD) = Blue Screen Of Death, 即蓝屏
rundll32 diskcopy,DiskCopyRunDll - 打开磁盘复制窗口
rundll32 rnaui.dll,RnaWizard - 运行Internet连接向导, 如果加上参数1则为silent模式
rundll32 shell32,SHFormatDrive - 打开格式化磁盘(A)窗口
rundll32 shell32,SHExitWindowsEx -1 - 冷启动Windows Explorer
rundll32 shell32,SHExitWindowsEx 1 - 关机
rundll32 shell32,SHExitWindowsEx 0 - 退当前用户
rundll32 shell32,SHExitWindowsEx 2 Windows9x 快速重启
rundll32 krnl386.exe,exitkernel - 强行退出Windows 9x(无确认)
rundll rnaui.dll,RnaDial MyConnect - 运行网络连接对话框
rundll32 msprint2.dll,RUNDLL_PrintTestPage - 选择打印机和打印测试页
rundll32 user,setcaretblinktime - 设置光标闪烁速度
rundll32 user, setdoubleclicktime - 测试鼠标双击速度
rundll32 sysdm.cpl,InstallDevice_Rundll - 搜索非PnP设备
 控制面板中的各项功能

 winexec('rundll32.exe shell32.dll, Control_RunDLL', 9);
 {辅助选项 属性-键盘}
 winexec('rundll32.exe shell32.dll, Control_RunDLL access.cpl, 1', 9);
 {辅助选项 属性-声音}
 winexec('rundll32.exe shell32.dll, Control_RunDLL access.cpl, 2', 9);
 {辅助选项 属性-显示}
 winexec('rundll32.exe shell32.dll, Control_RunDLL access.cpl, 3', 9);
 {辅助选项 属性-鼠标}
 winexec('rundll32.exe shell32.dll, Control_RunDLL access.cpl, 4', 9);
 {辅助选项 属性-常规}
 winexec('rundll32.exe shell32.dll, Control_RunDLL access.cpl, 5', 9);
 {添加删除程序 属性-安装卸载}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Appwiz.cpl, 1', 9);
 {添加删除程序 属性-Windows安装程序}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Appwiz.cpl, 2', 9);
 {添加删除程序 属性-启动盘}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Appwiz.cpl, 3', 9);
 {显示 属性-背景}
 winexec('rundll32.exe shell32.dll, Control_RunDLL desk.cpl, 0', 9); 
 {显示 属性-屏幕保护程序}
 winexec('rundll32.exe shell32.dll, Control_RunDLL desk.cpl, 1', 9);
 {显示 属性-外观}
 winexec('rundll32.exe shell32.dll, Control_RunDLL desk.cpl, 2', 9);
 {显示 属性-设置}
 winexec('rundll32.exe shell32.dll, Control_RunDLL desk.cpl, 3', 9);
 {Internet 属性-常规}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 0', 9);
 {Internet 属性-安全}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 1', 9);
 {Internet 属性-内容}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 2', 9);
 {Internet 属性-连接}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 3', 9);
 {Internet 属性-程序}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 4', 9);
 {Internet 属性-高级}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 5', 9);
 {区域设置 属性-区域设置}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Intl.cpl, 0', 9);
 {区域设置 属性-数字}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Intl.cpl, 1', 9);
 {区域设置 属性-货币}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Intl.cpl, 2', 9);
 {区域设置 属性-时间}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Intl.cpl, 3', 9);
 {区域设置 属性-日期}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Intl.cpl, 4', 9);
 
 winexec('rundll32.exe shell32.dll, Control_RunDLL Joy.cpl, 0', 9);
 
 winexec('rundll32.exe shell32.dll, Control_RunDLL Joy.cpl, 1', 9);
 {鼠标 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Main.cpl', 9);
 {多媒体 属性-音频}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl, 0', 9);
 {多媒体 属性-视频}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl, 1', 9);
 {多媒体 属性-MIDI}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl, 2', 9);
 {多媒体 属性-CD音乐}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl, 3', 9);
 {多媒体 属性-设备}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl, 4', 9);
 {调制解调器 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Modem.cpl', 9);
 
 winexec('rundll32.exe shell32.dll, Control_RunDLL Netcpl.cpl', 9);
 {密码 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Password.cpl', 9);
 {扫描仪与数字相机 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Sticpl.cpl', 9);
 {系统 属性-常规}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Sysdm.cpl, 0', 9);
 {系统 属性-设备管理器}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Sysdm.cpl, 1', 9);
 {系统 属性-硬件配置文件}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Sysdm.cpl, 2', 9);
 {系统 属性-性能}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Sysdm.cpl, 3', 9);
 {日期时间 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL timedate.cpl', 9);
 {电源管理 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Powercfg.cpl', 9);
 
 winexec('rundll32.exe shell32.dll, Control_RunDLL Telephon.cpl', 9);
关于调用后的判断处理建议:
先声明一个cardinal类型的变量RtnCardinal获取返回值进行判断如:
RtnCardinal = winexec('rundll32.exe shell32.dll, Control_RunDLL Telephon.cpl', 9);
 返回值 可能原因
 0 程序超出内存 
ERROR_BAD_FORMAT 程序为一个非法的Win32.EXE程序
ERROR_FILE_NOT_FOUND 指定文件没找到 
ERROR_PATH_NOT_FOUND 指定路径没找到

使用方法:
点击“开始-程式-Ms-Dos方式”,进入Dos视窗,然後键入rundll32.exe user.exe,restartwindows,再按下回车键,这时你将看到,机器被重启了!怎么样,是不是很有趣?
  当然,Rundll的功能绝不仅仅是重启你的机器。其实,Rundll者,顾名思义,执行Dll也,它的功能就是以命令列的方式呼叫Windows的动态链结库,Rundll32.exe与Rundll.exe的区别就在於前者是呼叫32位的链结库,而後者是运用於16位的链结库,它们的命令格式是:
  RUNDLL.EXE ,,
  这里要注意三点:1.Dll档案名中不能含有空格,比如该档案位於cProgram Files目录,你要把这个路径改成cProgra~1;2.Dll档案名与Dll入口点间的逗号不能少,否则程式将出错并且不会给出任何资讯!3.这是最重要的一点:Rundll不能用来呼叫含返回值参数的Dll,例如Win32API中的GetUserName(),GetTextFace()等。在Visual Basic中,提供了一条执行外部程式的指令Shell,格式为:
  Shell “命令列”
  如果能配合Rundll32.exe用好Shell指令,会使您的VB程式拥有用其他方法难以甚至无法实现的效果:仍以重启为例,传统的方法需要你在VB工程中先建立一个模组,然後写入WinAPI的声明,最後才能在程式中呼叫。而现在只需一句
  Shell “rundll32.exe user.exe,restartwindows”就搞定了!是不是方便多了?
  实际上,Rundll32.exe在呼叫各种Windows控制面板和系统选项方面有著独特的优势。下面,我就将本人在因特网上收集的有关Rundll的指令列举如下(很有用的,能省去你很多呼叫Windows API的时间!!),供大家在程式设计中引用:
  命令列 rundll32.exe shell32.dll,Control_RunDLL
  功能 显示控制面板
  命令列 rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1
  功能 显示“控制面板-辅助选项-键盘”选项视窗
  命令列 rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2
  功能 显示“控制面板-辅助选项-声音”选项视窗
  命令列 rundll32.exe shell32.dll,Control_RunDLL access.cpl,,3
  功能 显示“控制面板-辅助选项-显示”选项视窗
  命令列 rundll32.exe shell32.dll,Control_RunDLL access.cpl,,4
  功能 显示“控制面板-辅助选项-滑鼠”选项视窗
  命令列 rundll32.exe shell32.dll,Control_RunDLL access.cpl,,5
  功能 显示“控制面板-辅助选项-传统”选项视窗
  命令列 rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @1
  功能 执行“控制面板-添加新硬体”向导。
  命令列 rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL AddPrinter
  功能 执行“控制面板-添加新印表机”向导。
  命令列 rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,1
  功能 显示 “控制面板-添加删除程式-安装卸载” 面板。
  命令列 rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,2
  功能 显示 “控制面板-添加删除程式-安装Windows” 面板。
  命令列 rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,3
  功能 显示 “控制面板-添加删除程式-启动盘” 面板。
  命令列 rundll32.exe syncui.dll,Briefcase_Create
  功能 在桌面上建立一个新的“我的公文包”。
  命令列 rundll32.exe diskcopy.dll,DiskCopyRunDll
  功能 显示复制软碟视窗
  命令列 rundll32.exe apwiz.cpl,NewLinkHere %1
  功能 显示“建立快捷方式”的对话框,所建立的快捷方式的位置由%1参数决定。
  命令列 rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,0
  功能 显示“日期与时间”选项视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,1
  功能 显示“时区”选项视窗。
  命令列 rundll32.exe rnaui.dll,RnaDial [某个拨号连接的名称]
  功能 显示某个拨号连接的拨号视窗。如果已经拨号连接,则显示目前的连接状态的视窗。
  命令列 rundll32.exe rnaui.dll,RnaWizard
  功能 显示“新建拨号连接”向导的视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0
  功能 显示“显示属性-背景”选项视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1
  功能 显示“显示属性-萤屏保护”选项视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,2
  功能 显示“显示属性-外观”选项视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3
  功能 显示显示“显示属性-属性”选项视窗。
  命令列 rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL FontsFolder
  功能 显示Windows的“字体”档案夹。
  命令列 rundll32.exe shell32.dll,Control_RunDLL main.cpl @3
  功能 同样是显示Windows的“字体”档案夹。
  命令列 rundll32.exe shell32.dll,SHformatDrive
  功能 显示格式化软碟对话框。
  命令列 rundll32.exe shell32.dll,Control_RunDLL joy.cpl,,0
  功能 显示“控制面板-游戏控制器-一般”选项视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL joy.cpl,,1
  功能 显示“控制面板-游戏控制器-进阶”选项视窗。
  命令列 rundll32.exe mshtml.dll,PrintHTML (HTML文档)
  功能 列印HTML文档。
  命令列 rundll32.exe shell32.dll,Control_RunDLL mlcfg32.cpl
  功能 显示Microsoft Exchange一般选项视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL main.cpl @0
  功能 显示“控制面板-滑鼠” 选项 。
  命令列 rundll32.exe shell32.dll,Control_RunDLL main.cpl @1
  功能 显示 “控制面板-键盘属性-速度”选项视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL main.cpl @1,,1
  功能 显示 “控制面板-键盘属性-语言”选项视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL main.cpl @2
  功能 显示Windows“印表机”档案夹。
  命令列 rundll32.exe shell32.dll,Control_RunDLL main.cpl @3
  功能 显示Windows“字体”档案夹。
  命令列 rundll32.exe shell32.dll,Control_RunDLL main.cpl @4
  功能 显示“控制面板-输入法属性-输入法”选项视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL modem.cpl,,add
  功能 执行“添加新调制解调器”向导。
  命令列 rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,0
  功能 显示“控制面板-多媒体属性-音频”属性页。
  命令列 rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,1
  功能 显示“控制面板-多媒体属性-视频”属性页。
  命令列 rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,2
  功能 显示“控制面板-多媒体属性-MIDI”属性页。
  命令列 rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,3
  功能 显示“控制面板-多媒体属性-CD音乐”属性页。
  命令列 rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,4
  功能 显示“控制面板-多媒体属性-设备”属性页。
  命令列 rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @1
  功能 显示“控制面板-声音”选项视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL netcpl.cpl
  功能 显示“控制面板-网路”选项视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL odbccp32.cpl
  功能 显示ODBC32资料管理选项视窗。
  命令列 rundll32.exe shell32.dll,OpenAs_RunDLL
功能 显示指定档案(drivepathfilename)的“打开方式”对话框。
  命令列 rundll32.exe shell32.dll,Control_RunDLL password.cpl
  功能 显示“控制面板-密码”选项视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL powercfg.cpl
  功能 显示“控制面板-电源管理属性”选项视窗。
  命令列 rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL PrintersFolder
  功能 显示Windows“印表机”档案夹。(同rundll32.exe shell32.dll,Control_RunDLL main.cpl @2)
  命令列 rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0
  功能 显示“控制面板-区域设置属性-区域设置”选项视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,1
  功能 显示“控制面板-区域设置属性-数字”选项视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,2
  功能 显示“控制面板-区域设置属性-货币”选项视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,3
  功能 显示“控制面板-区域设置属性-时间”选项视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,4
  功能 显示“控制面板-区域设置属性-日期”选项视窗。
  命令列 rundll32.exe desk.cpl,InstallScreenSaver [萤屏保护档案名]
  功能 将指定的萤屏保护档案设置为Windows的屏保,并显示萤屏保护属性视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,0
  功能 显示“控制面板-系统属性-传统”属性视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,1
  功能 显示“控制面板-系统属性-设备管理器”属性视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,2
  功能 显示“控制面板-系统属性-硬体配置档案”属性视窗。
  命令列 rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,3
  功能 显示“控制面板-系统属性-性能”属性视窗。
  命令列 rundll32.exe user.exe,restartwindows
  功能 强行关闭所有程式并重启机器。
  命令列 rundll32.exe user.exe,exitwindows
  功能 强行关闭所有程式并关机。
  命令列 rundll32.exe shell32.dll,Control_RunDLL telephon.cpl
  功能 显示“拨号属性”选项视窗
  命令列 rundll32.exe shell32.dll,Control_RunDLL themes.cpl
  功能 显示“桌面主旨”选项面板
  
当然,不止是VisualBasic,象Delphi.VisualC++等其他程式设计语言也可以通过呼叫外部命令的方法来使用Rundll的这些功能,具体方法这里就不再详细叙述了。灵活的使用Rundll,一定会使你的程式设计轻轻松松,达到事半功倍的效果!
8月24日

抛砖引玉,录音处理源码公开

抛砖引玉,录音处理源码公开,高手来看啊……
俺的代码实现了录制各种不同格式的wav音频文件,可以不限时间,不要特殊控件
但是有个问题没有解决:
如何将wav后台转成MP3格式呢?

Declare INTEGER mciSendString IN winmm.DLL STRING ,STRING @,INTEGER ,INTEGER
Buffer=SPACE(100)
录音代码
if this.caption='录音'
 =mcisendstring("close sound ",@BUFFER,80,0)
 if thisform.optiongroup1.value=1
  =mcisendstring("open  yy.wav alias sound",@BUFFER,80,0)
 else
  =mcisendstring("open  yy1.mp3 alias sound",@BUFFER,80,0)
 endif
 =mcisendstring("record sound from 0",@BUFFER,80,0)
 this.caption='停止'
else
 =mcisendstring("stop sound ",@BUFFER,80,0)
 if  cyinzhi=1
  temp=alltrim(cfjl.总编号)+'.wav'
 else
  temp=alltrim(cfjl.总编号)+'d.wav'
 endif
 =mcisendstring('save sound '+temp ,@BUFFER,80,0)
yy.wav和yy1.wav是事先录制好的两组不同格式音频文件,在此文件打开再录制自然就是以前的格式,明白了吧,又是土匪做法:)



播放代码
  Declare INTEGER mciSendString IN winmm.DLL STRING ,STRING @,INTEGER ,INTEGER
  Buffer=SPACE(100)
  =mcisendstring("close sound ",@BUFFER,80,0)
  =mcisendstring("open "+musicname+" alias sound",@BUFFER,80,0)
  =mcisendstring("play sound from 0",@BUFFER,80,0)

play sound from ***(可以是毫秒数,决定跳跃到某点播放)
8月15日

网管人员必备的常用命令(1)

网管人员必备的常用命令(1)

如果你玩过路由器的话,就知道路由器里面那些很好玩的命令缩写。
例如,"sh int" 的意思是 "show interface"。

现在 Windows 2000 也有了类似界面的工具,叫做 netsh。

我们在 Windows 2000 的 cmd shell 下,输入 netsh
就出来:netsh> 提示符,
输入 int ip 就显示:
interface ip>
然后输入 dump ,我们就可以看到当前系统的网络配置:

# ----------------------------------
# Interface IP Configuration
# ----------------------------------
pushd interface ip


# Interface IP Configuration for "Local Area Connection"

set address name = "Local Area Connection" source = static addr = 192.168.1.168
mask = 255.255.255.0
add address name = "Local Area Connection" addr = 192.1.1.111 mask = 255.255.255.0
set address name = "Local Area Connection" gateway = 192.168.1.100 gwmetric = 1
set dns name = "Local Area Connection" source = static addr = 202.96.209.5
set wins name = "Local Area Connection" source = static addr = none


popd
# End of interface IP configuration

上面介绍的是通过交互方式操作的一种办法。
我们可以直接输入命令:
"netsh interface ip add address "Local Area Connection" 10.0.0.2
255.0.0.0"
来添加 IP 地址。

如果不知道语法,不要紧的哦!
在提示符下,输入 ? 就可以找到答案了。方便不方便啊?
原来微软的东西里面,也有那么一些让人喜欢的玩意儿。可惜,之至者甚少啊!


Windows网络命令行程序
这部分包括:

使用 ipconfig /all 查看配置
使用 ipconfig /renew 刷新配置
使用 ipconfig 管理 DNS 和 DHCP 类别 ID
使用 Ping 测试连接
使用 Arp 解决硬件地址问题
使用 nbtstat 解决 NetBIOS 名称问题
使用 netstat 显示连接统计
使用 tracert 跟踪网络连接
使用 pathping 测试路由器
使用 ipconfig /all 查看配置
发现和解决 TCP/IP 网络问题时,先检查出现问题的计算机上的 TCP/IP 配置。可以
使用 ipconfig 命令获得主机配置信息,包括 IP 地址、子网掩码和默认网关。

注意

对于 Windows 95 和 Windows 98 的客户机,请使用 winipcfg 命令而不是 ipconfi
g 命令。
使用带 /all 选项的 ipconfig 命令时,将给出所有接口的详细配置报告,包括任何
已配置的串行端口。使用 ipconfig /all,可以将命令输出重定向到某个文件,并将
输出粘贴到其他文档中。也可以用该输出确认网络上每台计算机的 TCP/IP 配置,或
者进一步调查 TCP/IP 网络问题。

例如,如果计算机配置的 IP 地址与现有的 IP 地址重复,则子网掩码显示为 0.0.0
.0。

下面的范例是 ipconfig /all 命令输出,该计算机配置成使用 DHCP 服务器动态配置
TCP/IP,并使用 WINS 和 DNS 服务器解析名称。

Windows 2000 IP Configuration

Node Type.. . . . . . . . : Hybrid
IP Routing Enabled.. . . . : No
WINS Proxy Enabled.. . . . : No

Ethernet adapter Local Area Connection:

Host Name.. . . . . . . . : corp1.microsoft.com
DNS Servers . . . . . . . : 10.1.0.200
Description. . . . . . . : 3Com 3C90x Ethernet Adapter
Physical Address. . . . . : 00-60-08-3E-46-07
DHCP Enabled.. . . . . . . : Yes
Autoconfiguration Enabled.: Yes
IP Address. . . . . . . . . : 192.168.0.112
Subnet Mask. . . . . . . . : 255.255.0.0
Default Gateway. . . . . . : 192.168.0.1
DHCP Server. . . . . . . . : 10.1.0.50
Primary WINS Server. . . . : 10.1.0.101
Secondary WINS Server. . . : 10.1.0.102
Lease Obtained.. . . . . . : Wednesday, September 02, 1998 10:32:13 AM
Lease Expires.. . . . . . : Friday, September 18, 1998 10:32:13 AM


如果 TCP/IP 配置没有问题,下一步测试能够连接到 TCP/IP 网络上的其他主机。

使用 ipconfig /renew 刷新配置
解决 TCP/IP 网络问题时,先检查遇到问题的计算机上的 TCP/IP 配置。如果计算机
启用 DHCP 并使用 DHCP 服务器获得配置,请使用 ipconfig /renew 命令开始刷新租
约。

使用 ipconfig /renew 时,使用 DHCP 的计算机上的所有网卡(除了那些手动配置的
适配器)都尽量连接到 DHCP 服务器,更新现有配置或者获得新配置。

也可以使用带 /release 选项的 ipconfig 命令立即释放主机的当前 DHCP 配置。有
关 DHCP 和租用过程的详细信息,请参阅客户机如何获得配置。

注意

对于启用 DHCP 的 Windows 95 和 Windows 98 客户,请使用 winipcfg 命令的 rel
ease 和 renew 选项,而不是 ipconfig /release 和 ipconfig /renew 命令,手动
释放或更新客户的 IP 配置租约。
使用 ipconfig 管理 DNS 和 DHCP 类别 ID
也可以使用 ipconfig 命令:

显示或重置 DNS 缓存。
详细信息,请参阅使用 ipconfig 查看或重置客户解析程序缓存。

刷新已注册的 DNS 名称。
详细信息,请参阅使用 ipconfig 更新 DNS 客户注册。

显示适配器的 DHCP 类别 ID。
详细信息,请参阅显示客户机上的 DHCP 类别 ID 信息。

设置适配器的 DHCP 类别 ID。
详细信息,请参阅设置客户机上的 DHCP 类别 ID 信息。

使用 Ping 测试连接
Ping 命令有助于验证 IP 级的连通性。发现和解决问题时,可以使用 Ping 向目标主
机名或 IP 地址发送 ICMP 回应请求。需要验证主机能否连接到 TCP/IP 网络和网络
资源时,请使用 Ping。也可以使用 Ping 隔离网络硬件问题和不兼容配置。

通常最好先用 Ping 命令验证本地计算机和网络主机之间的路由是否存在,以及要连
接的网络主机的 IP 地址。Ping 目标主机的 IP 地址看它是否响应,如下:

ping IP_address

使用 Ping 时应该执行以下步骤:

Ping 环回地址验证是否在本地计算机上安装 TCP/IP 以及配置是否正确。
ping 127.0.0.1

Ping 本地计算机的 IP 地址验证是否正确地添加到网络。
ping IP_address_of_local_host

Ping 默认网关的 IP 地址验证默认网关是否运行以及能否与本地网络上的本地主机通
讯。
ping IP_address_of_default_gateway

Ping 远程主机的 IP 地址验证能否通过路由器通讯。
ping IP_address_of_remote_host

Ping 命令用 Windows 套接字样式的名称解析将计算机名解析成 IP 地址,所以如果
用地址成功,但是用名称 Ping 失败,则问题出在地址或名称解析上,而不是网络连
通性的问题。详细信息,请参阅使用 Arp 解决硬件地址问题。

如果在任何点上都无法成功地使用 Ping,请确认:

安装和配置 TCP/IP 之后重新启动计算机。
“Internet 协议 (TCP/IP) 属性”对话框“常规”选项卡上的本地计算机的 IP 地址
有效而且正确。
启用 IP 路由,并且路由器之间的链路是可用的。
您可以使用 Ping 命令的不同选项来指定要使用的数据包大小、要发送多少数据包、
是否记录用过的路由、要使用的生存时间 (TTL) 值以及是否设置“不分段”标志。可
以键入 ping -? 查看这些选项。

下例说明如何向 IP 地址 172.16.48.10 发送两个 Ping,每个都是 1,450 字节:

C:>ping -n 2 -l 1450 172.16.48.10
Pinging 172.16.48.10 with 1450 bytes of data:

Reply from 172.16.48.10:bytes=1450 time<10ms TTL=32
Reply from 172.16.48.10:bytes=1450 time<10ms TTL=32

Ping statistics for 157.59.8.1:
Packets:Sent = 2, Received = 2, Lost = 0 (0% loss),
Approximate roundtrip times in milli-seconds:
Minimum = 0ms, Maximum = 10ms, Average = 2ms
默认情况下,在显示“请求超时”之前,Ping 等待 1,000 毫秒(1 秒)的时间让每个响应返回。如果通过 Ping 探测的远程系统经过长时间延迟的链路,如卫星链路,则响应可能会花更长的时间才能返回。可以使用 -w (等待)选项指定更长时间的超时。

使用 Arp 解决硬件地址问题
“地址解析协议 (ARP)”允许主机查找同一物理网络上的主机的媒体访问控制地址,如果给出后者的 IP 地址。为使 ARP 更加有效,每个计算机缓存 IP 到媒体访问控制地址映射消除重复的 ARP 广播请求。

可以使用 arp 命令查看和修改本地计算机上的 ARP 表项。arp 命令对于查看 ARP 缓存和解决地址解析问题非常有用。

详细信息,请参阅查看“地址解析协议 (ARP)”缓存和添加静态 ARP 缓存项目。

使用 nbtstat 解决 NetBIOS 名称问题
TCP/IP 上的 NetBIOS (NetBT) 将 NetBIOS 名称解析成 IP 地址。TCP/IP 为 NetBIOS 名称解析提供了很多选项,包括本地缓存搜索、WINS 服务器查询、广播、DNS 服务器查询以及 Lmhosts 和主机文件搜索。

Nbtstat 是解决 NetBIOS 名称解析问题的有用工具。可以使用nbtstat 命令删除或更正预加载的项目:

nbtstat -n 显示由服务器或重定向器之类的程序在系统上本地注册的名称。
nbtstat -c 显示 NetBIOS 名称缓存,包含其他计算机的名称对地址映射。
nbtstat -R 清除名称缓存,然后从 Lmhosts 文件重新加载。
nbtstat -RR 释放在 WINS 服务器上注册的 NetBIOS 名称,然后刷新它们的注册。
nbtstat -a name 对 name 指定的计算机执行 NetBIOS 适配器状态命令。适配器状态命令将返回计算机的本地 NetBIOS 名称表,以及适配器的媒体访问控制地址。
nbtstat -S 列出当前的 NetBIOS 会话及其状态(包括统计),如下例所示:
NetBIOS connection table

Local name State In/out Remote Host Input Output
------------------------------------------------------------------
CORP1 <00> Connected Out CORPSUP1<20> 6MB 5MB
CORP1 <00> Connected Out CORPPRINT<20> 108KB 116KB
CORP1 <00> Connected Out CORPSRC1<20> 299KB 19KB
CORP1 <00> Connected Out CORPEMAIL1<20> 324KB 19KB
CORP1 <03> Listening
使用 netstat 显示连接统计
可以使用 netstat 命令显示协议统计信息和当前的 TCP/IP 连接。netstat -a 命令将显示所有连接,而 netstat -r 显示路由表和活动连接。netstat -e 命令将显示Ethernet 统计信息,而 netstat -s 显示每个协议的统计信息。如果使用 netstat -n,则不能将地址和端口号转换成名称。下面是 netstat 的输出示例:

C:>netstat -e
Interface Statistics

Received Sent
Bytes 3995837940 47224622
Unicast packets 120099 131015
Non-unicast packets 7579544 3823
Discards 0 0
Errors 0 0
Unknown protocols 363054211

C:>netstat -a

Active Connections

Proto Local Address Foreign Address State
TCP CORP1:1572 172.16.48.10:nbsession ESTABLISHED
TCP CORP1:1589 172.16.48.10:nbsession ESTABLISHED
TCP CORP1:1606 172.16.105.245:nbsession ESTABLISHED
TCP CORP1:1632 172.16.48.213:nbsession ESTABLISHED
TCP CORP1:1659 172.16.48.169:nbsession ESTABLISHED
TCP CORP1:1714 172.16.48.203:nbsession ESTABLISHED
TCP CORP1:1719 172.16.48.36:nbsession ESTABLISHED
TCP CORP1:1241 172.16.48.101:nbsession ESTABLISHED
UDP CORP1:1025 *:*
UDP CORP1:snmp *:*
UDP CORP1:nbname *:*
UDP CORP1:nbdatagram *:*
UDP CORP1:nbname *:*
UDP CORP1:nbdatagram *:*

C:>netstat -s
IP Statistics

Packets Received = 5378528
Received Header Errors = 738854
Received Address Errors = 23150
Datagrams Forwarded = 0
Unknown Protocols Received = 0
Received Packets Discarded = 0
Received Packets Delivered = 4616524
Output Requests = 132702
Routing Discards = 157
Discarded Output Packets = 0
Output Packet No Route = 0
Reassembly Required = 0
Reassembly Successful = 0
Reassembly Failures =
Datagrams Successfully Fragmented = 0
Datagrams Failing Fragmentation = 0
Fragments Created = 0

ICMP Statistics
Received Sent
Messages 693 4
Errors 0 0
Destination Unreachable 685 0
Time Exceeded 0 0
Parameter Problems 0 0
Source Quenches 0 0
Redirects 0 0
Echoes 4 0
Echo Replies 0 4
Timestamps 0 0
Timestamp Replies 0 0
Address Masks 0 0
Address Mask Replies 0 0

TCP Statistics

Active Opens = 597
Passive Opens = 135
Failed Connection Attempts = 107
Reset Connections = 91
Current Connections = 8
Segments Received = 106770
Segments Sent = 118431
Segments Retransmitted = 461

UDP Statistics

Datagrams Received = 4157136
No Ports = 351928
Receive Errors = 2
Datagrams Sent = 13809

使用 tracert 跟踪网络连接
Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP 数据报访问目标所采取的路径。Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由。

Tracert 工作原理
通过向目标发送不同 IP 生存时间 (TTL) 值的“Internet 控制消息协议 (ICMP)”回应数据包,Tracert 诊断程序确定到目标所采取的路由。要求路径上的每个路由器在转发数据包之前至少将数据包上的 TTL 递减 1。数据包上的 TTL 减为 0 时,路由器应该将“ICMP 已超时”的消息发回源系统。

Tracert 先发送 TTL 为 1 的回应数据包,并在随后的每次发送过程将 TTL 递增 1,直到目标响应或 TTL 达到最大值,从而确定路由。通过检查中间路由器发回的“ICMP 已超时”的消息确定路由。某些路由器不经询问直接丢弃 TTL 过期的数据包,这在Tracert 实用程序中看不到。

Tracert 命令按顺序打印出返回“ICMP 已超时”消息的路径中的近端路由器接口列表。如果使用 -d 选项,则 Tracert 实用程序不在每个 IP 地址上查询 DNS。

在下例中,数据包必须通过两个路由器(10.0.0.1 和 192.168.0.1)才能到达主机
172.16.0.99。主机的默认网关是 10.0.0.1,192.168.0.0 网络上的路由器的 IP 地
址是 192.168.0.1。

C:>tracert 172.16.0.99 -d
Tracing r

转帖]DirectX—昨天,今天,明天

转帖]DirectX—昨天,今天,明天
[1]

[原创] 龙芯X 2004-01-19
--------------------------------------------------------------------------------

现在游戏的种类与数量几乎呈爆炸式增长,游戏的制作水平也不断提高,那么玩家在欣赏游戏中那绚丽的效果时,有没有想过是什么造就了这一切兀空饩褪荄irectX!DirectX这个词对玩家来说似乎并不陌生,现在的很多游戏说明里都有“该游戏需要DirectX….以上版本支持”此类的话,甚至3DS Max启动时的加速模式选项中也有DirectX身影。那么DirectX究竟是什么呢?现在就让我们揭开它面上这层神秘的面纱,一探究竟吧。

一、初识DirectX
DirectX是Microsoft开发的基于Windows平台的一组API,它是为高速的实时动画渲染、交互式音乐和环境音效等高要求应用开发服务的。从Windows 95开始,人们就开始接触DirectX2.0,WindowsNT4.0里面则是DirectX3.0a,但是没有DirectX4的版本。到了Windows98,它就是Windows家族操作系统中不可缺少的核心成员之一。Windows 98中集成了DirectX5,Windows2000中集成了DirectX 6,Windows Me中集成了DirectX 7,而Windows XP天生就带了DirectX 8.1。
微软开发了DirectX标准平台,并且根据硬件制造厂商和游戏厂商合作共同更新升级DirectX的标准。硬件制造商按照此标准研发制造更好的产品,游戏开发者根据这套标准开发游戏。也就是说,无论硬件是否支持某种特效,只要DirectX标准中有,游戏开发者就可以把它写到游戏中,当这个游戏在硬件上运行,如果此硬件根据DirectX标准把这个效果做到了此硬件驱动程序中,驱动程序驾驭其硬件算出结果,用户就可以欣赏到此效果。这就是“硬件设备无关性”,是DirectX真正意义所在。
通常,Windows对硬件访问的管制非常严格,用通常的办法不易访问,但DirectX通过“硬件抽象层(HAL)”给予了开发人员直接访问硬件的能力,HAL不仅解决了硬件及兼容性问题,而且开发人员可以利用它直接访问计算机的某些硬件设备,例如显示设备的直接显存控制和渲染,键盘、鼠标和游戏杆的控制的直接访问控制,音频设备的直接音频混合与输出能力等等,因此开发人员可以充分利用硬件加速将程序的性能优化到一个新的高度,如果目标机器不支持相应的硬件加速,DirectX还可以仿真加速器以提供强大的多媒体环境。DirectX家族包含的成员有Direct3D、DirectDraw、DirectInput、DirectMusic、DirectPlay、DirectSound和DirectShow。

二、DirectX全家福

通过上面的介绍,相信读者对DirectX已经有一个大概的了解。下面就让我们逐一认识它们吧。
1、Direct3D、DirectDraw和DirectGraphics
DirectDraw是DirectX家族中的元老,它为高速的2D渲染提供了良好的支持,由于其具备直接显存访问和位快传送的能力,使得2D图形的绘制速度相对GDI有了一个质的飞跃,其渲染速度甚至有上百倍的差距。在现在回忆当初玩“红色警戒”和“Diablo”的时候,大家可不要忘了DirectDraw的功劳。

DirectDraw在DirectX3.0时就已经接近极致,但是随着PC图形技术的飞速发展,人们逐渐不再满足于2D的图形效果,而通过2D技术实现伪3D模拟又非常损失效率,这种需求直接导致了Direct3D的诞生,早期的Direct3D技术不甚完善,相对于2D技术还有一定的差距,直到图形加速卡支持硬件3D特效后,Direct3D才逐渐步入正轨,慢慢显示出它的性能优势来。下面让我们来回顾一下历史,看看

Direct3D的“成长过程”:
DirectX6中的Direct3D添加了如下新特性:
?几何形体的灵活顶点格式定义
?几何形体的顶点缓冲存储
?支持多纹理渲染
?自动纹理管理
?可选深度缓冲(使用Z Buffer或W Buffer)
?通过凹凸环境贴图(BUMPENVMAP)为反光面和水波特效提供逐像素的渲染和贴图能力
DirectX7中的Direct3D添加了以下新特性:
?硬件坐标转换和灯光(T&L)支持
?立方体表面的环境贴图
?几何渲染
?改进的纹理渲染
?自动纹理坐标生成、纹理转换、投影纹理和任意面裁剪
?D3DX实用库
?支持Intel MMX架构、Intel单指令多数据流(SIMD)、SSE?和 AMD? 3DNow?架构。

DirectX的版本到了8.0的时候,虽然它依然保持着向前的兼容性,但是它的结构发生了巨大的变化,3D图形处理技术逐渐统一在Vertex Shader和Pixel Shader。Vertex Shader被用来描述和修饰3D物体的几何形状,同时也用来控制光亮和阴影;Pixel Shader则用来操纵物体表面的色彩和外观。Direct3D和DirectDraw合二为一,DirectX家族诞生了一个新的成员-----DirectGraphics。同时也增添了很多令人激动的特性:

?完全集成DirectDraw与Direct3D
简化程序初始化过程并提高数据分配和管理的性能,这将减少内存消耗。同时,集成后的图形应用编程接口(API)允许并行的顶点输入流以达到更加灵活的渲染。
?可编程顶点处理语言
允许你编写定制的着色器,如变形和渐变动画,矩阵调色板蒙皮,用户定义的光照模型,一般环境映射,可编程几何体或者任何其他开发者定义的算法。
?可编程像素处理语言
允许你编写定制的硬件着色器,例如通用纹理组合公式,逐像素光照(凹凸贴图),适用于实现照片(真实)级镜面效果的逐像素环境贴图或者任何其他开发者定义的算法。
?支持多重采样渲染
允许全场景反走样和多重采样效果,例如运动模糊及景深(镜头的聚焦效果)。
?点精灵
允许高性能的粒子系统渲染,例如火花、爆炸、雨、雪等等。
?3-D空间纹理
允许范围衰减,实现逐像素级光照及空间大气效果,甚至是更复杂的几何图形应用。
?支持高维图元
对来自主要的3-D创作工具的3-D内容,增强其外观并简化内容映射。
?高级技术
包含了用于输出Direct3D蒙皮网格的三维内容创建工具插件,使用了Direct3D多种不同技术,多分辨率层次细节(LOD)几何,还有高维表面数据。
?索引顶点混合
扩展了几何混合的支持,允许通过指定使用一个矩阵索引把矩阵应用于顶点混合处理。
?扩充了Direct3DX实用库
包含了大量的新函数。Direct3DX实用库是一个位于Direct3D之上的辅助层,用于简化3-D图形开发者的常规工作。它包括了一个蒙皮库,支持对网格的操作,还有组装顶点与像素着色器的功能。
DirectX每一次升级都会有重大的内核结构改变,它会给我们带来巨大的视觉冲击。DirectX7核心的T&L引擎到DirectX9干脆被抛弃了。因此对于图形芯片开发商、游戏开发商以及广大用户而言,DirectX 9的确是一项“绝无仅有的优越图形技术”。DirectX 9“具有多项令人兴奋的全新功能特征”:




Direct3D图形渲染管道

?Vertex Shader 2.0和Pixel Shader 2.0

在DirectX9中,Vertex Shader和Pixel Shader的版本升级到了2.0,它们都支持64或甚至128位浮点色彩精度。浮点色彩在动态和精度上的增加给图像质量带来质的飞跃,这样在DirectX9中你可以轻易实现电影级别般逼真的效果!
DirectX8和DirectX9的对比参数:



Vertex Shader 2.0引入了流程控制,增加了条件跳转、循环和子程序。Vertex程序现在最多可以由1024条指令组成(之前只能用128条指令),增加的指令带来更加复杂和强大的表现,新的操作如正弦、余弦及其他强大的函数运算大大简化了代码的编写,并且能够表现更加复杂的效果。

Vertex Shader 1.0 VertexShader 2.0
强大的可编程Pixel Shader是实现具有电影质量级别效果的真正精华所在。Pixel Shader 2.0可以支持高级程序语言和汇编语言,开发人员还可以将其汇编代码嵌入较高级的程序语言中。前一版的Pixel Shader语言被限制为只能使用最多6个材质和28条指令,而2.0版则将这一上限提升至最大16材质和160条指令,也新增了很多强化的运算和操作。


Pixel Shader 1.4



Pixel Shader 2.0

此外各种Shader工具的大力协助,如nVidia的Cg语言和ATI的RenderMonkey,使得实时图形渲染的质量飞速提高,nVidia和ATI官方的Demo就足以说明这一点。DirectX9中也改进了部分接口定义,Vertex Shader和Pixel Shader分别单独提供了一个接口,而且提供了常见图形的绘制接口,如线段的绘制等,这进一步减轻了开发人员的负担。

?浮点型色彩和32位帧缓冲格式

目前大多数色彩表示法(如RGB)用8位整数表示红、绿、蓝色,也许对于显示来说这已经足够了,但在运算中似乎还远不够。由于整数没有小数部分,因此当它们经过Pixel Shader极其复杂的数学运算后,就会产生较大的误差,这可能导致色彩明显失真。而DirectX9支持数种浮点色彩格式,使得其精度有了很大提高。同时DirectX9支持精确到每像素32位的帧缓冲格式,能够表现出4倍于目前亮度等级的数量,这使得图像看上去更加清晰和自然。

除此以外,DirectX9还提供位移贴图(displacement maps)以及改进的设备模拟等特性的支持,并且毫无意外地,DirectX9 SDK中也进一步扩展了Direct3DX实用库,提高了开发效率。
DirectX—昨天,今天,明天[2]

[原创] 龙芯X 2004-01-20
--------------------------------------------------------------------------------

2、DirectSound、DirectMusic和DirectX Audio

在DirectX中DirectSound和DirectMusic可以统称DirectX Audio。一个好的游戏是不能没有声音的,DirectX Audio负责了游戏中的音效控制。不仅仅是游戏,很多需要高质量音效的地方都有它们的影子,我们经常在一些播放软件的设置面板中看见是否使用DirectSound支持的选项。

DirectX Audio做的不仅仅只是简单地对声音的回放。它提供了一个完整的系统,能够利用硬件加速的功能动态地操纵控制音轨和声道(soundtrack)。

如果你想在你的程序中使用DirectMusic和DirectSound,你就能够获得以下功能:
?读入且播放例如MIDI, WAVE, 以及DirectMusic Producer run time等格式的声音文件。
?同时对多个声音资源进行混音播放。
?对播放的声轨进行高精度时间控制。
?可以动态地变更播放节拍与节奏,甚至实时地动态控制一些MIDI事件。
?使用DLS合成器(DirectX Audio自带的波表合成器),你的程序就可以确保在不同的计算机上听到相同的MIDI声音。你的程序能够播放不受类别限制,各试各样乐器的声音,使用DirectX Audio,你甚至还能够创造出独一无二的乐器声音类别并将它发布。
?把声音做3D定位,创造出3D的环境声响。
?可以非常容易地实现例如变调、回响,以及别的声音特效。
?能使用数量超过16个的MIDI音轨。DirectX Audio突破了从前只能使用16个MIDI音轨的限制,它把同时回放大数量的音轨变成为了可能,而这个数量仅仅只是受到了你的声音硬件合成器能力的限制。
?播放位于不同的Audiopaths上的声音段(segments),效果就可以各自实现在每一段声音里。
?实现在不同的端口(port)之间捕捉MIDI数据及流("thru")。
?从话筒或者别的输入设备中捕捉声音数据。

如果使用DirectMusic Producer或类似程序中的源文件,你还能够做到
?在声音的回放期间能够做更多的控制,例如动态选择不同的音效变化器(variations)或切换不同的和旋级数。
?精确地定时重放音乐。
?利用变化器(variations)播放声音(wave)
?Audiopaths利用Map performance channels可以使相同的声音段在channel的不同部分产生完全不同的播放效果。
?动态地创造出全新的音乐片段,这不需要专门算法库,仅仅需要你的作曲能力而已。
?动态地将存在的音乐片段进行组合过渡。
?在声音回放时端,程序可以获得存在于特殊节拍点的各类声音特效的信息。

这些功能适用于常常只使用主音频流(mainstream)的程序。如果程序只要实现一些基本简单的功能,开发者将DirectX Audio设计得非常易用,很适合初学者。DirectX Audio也是可扩展的。好的程序可以利用虚函数(virtual)继承设计出新的类,例如:

?支持新的声音格式文件。
?音轨可以包含各类数据。
?处理信息的工具 - 比方说,可以截取记录实现变换,或者将要显示的歌词置入声音片段文件。
?自定义的音序器(sequencer)。
?自定义的合成器(synthesizer)。
?效果过滤器。(Effects filters)。

值得一提的是,在DirectX9中加入了DirectMP3和DirectCD两个功能模块,它们使得主流的音频播放也能够通过DirectX与其调用程序更好地结合在一起。

3、 DirectInput

在DirectX这个大家族中,DirectInput掌管着“行为控制权”。与Winodows事件响应相比,DirectInput可以直接访问硬件,直接从输入缓冲区内检索数据,从而获得比响应Windows消息更快的速度。此外DirectInput也对力反馈游戏杆(Force Feedback)提供了良好支持。

4、 DirectPlay

网络底层程序的开发向来是令开发者头痛的一件事,而DirectPlay似乎兼顾了速度与易用性两个方面,在网络游戏这样一类对速度和效率要求较高的软件来说,针对游戏优化设计的DirectPlay显然是一个比较好的选择。DirectPlay提供了一个额外的层,使你的游戏和网络底层相隔。并且,你的游戏可以非常简单地使用DirectPlay API,并使用DirectPlay管理网络通讯。DirectPlay提供的特性,使多人游戏在开发中得到了很多简化。其中包括:
? 创建和管理点对点、客户/服务会话(Session)
? 在一个会话中管理用户(User)和组(Group)
? 管理在不同网络平台上进行会话的成员之间发送的消息
? 使游戏在大厅(Lobby)中互动
? 使用户可以进行语音交互

5、 DirectShow

作为DirectX中的又一重要成员,DirectShow提供了Windows平台下高质量的媒体捕获和回放能力,支持很多格式:ASF、MPG、AVI、MP3和WAV。DirectShow支持使用WDM设备或老式视频设备进行视频捕获。当有硬件支持的环境下,它会在使用视频或音频时自动选择是否使用硬件加速。

DirectShow简化了媒体回放、格式转换和捕获任务。同时,当应用程序需要自定义底层流媒体解决方案时,它也提供直接流访问控制的功能。

你可以用DirectShow编写DVD播放器、视频编缉程序、AVI到 ASF转换器、MP3播放器和数字视频捕获程序等等。

三、.NET架构的挑战-----Managed DirectX

不知大家发现没有,安装了DirectX9 SDK后它的文档里似乎悄悄多了一个不小的板块,那就是Managed DirectX。那么这个神秘的家伙究竟是干什么的呢?

.NET Framework的发表打响了Microsoft .NET战略的第一枪,ASP.NET、Web Service等词也伴随着.NET 技术的普及几乎变得家喻户晓。大家已经知道DirectX是基于COM技术的,而COM技术主要是为本地机服务的,在本地机上DirectX可以尽量把硬件的性能发挥到极限,但是它在.NET的网络时代是不是就无法施展它原有的威力呢?答案肯定是“否”。现在,DirectX已经成为Windows核心API的一部分,而Microsoft表示不会再提供更多的Win32API,今后的Windows API可能将全部集成到.NET Framework中去,那么DirectX到哪里去了呢?原来它早就已经改头换面,与.NET Framework达成了“默契”,这也就是Managed DirectX的由来。

Managed DirectX 实质上是对DirectX进行了一个轻量级的封装,Microsoft在2003年10月初发布了Microsoft DirectX 9.0 SDK Update (Summer 2003),其中就着重改进了Managed DirectX部分。一方面使它能与.NET Framework紧密集成,可供.NET 平台下的其他语言调用 (如C#);另一方面对DirectX程序编写进行了进一步简化,使得DirectX向RAD开发的方向又迈进了一大步,毕竟ASP.NET、WinForm这些东西是在网络上运行的。如此我们可以试想将来可以在网页上看到有硬件加速支持的绚丽的3D动画实时演示,这将是多么令人激动的事啊!

四、开发环境的支持与配置

在进行DirectX开发之前,我们需要下载并安装相应版本的DirectX SDK,这个可以从Microsoft的官方站点上免费获得,最新的DirectX 9.0 SDK Update(Summer 2003)大约是185MB,相关的还有DirectX9 SDK for Pocket PC 、DirectX9 Meltdown、DirectX9 SDK Extras等,下载的相关页面是http://msdn.microsoft.com/directx

下载了相应的SDK后,我们就可以开始利用它进行DirectX开发了。

1、Microsoft Visual Studio 6.0/.NET/.NET 2003中的配置
因为DirectX是Microsoft的产品,所以在Visual Studio系列中,DirectX开发所需的配置显得格外简单,下面以最新的Microsoft Visual Studio .NET 2003为例说明。

第一步:配置Include和Library的目录,


设置包含文件(Include)


设置库文件(Lib)

第二步:添加链接所需的库文件
如下图所示菜单操作,添加相应的库文件,如dxguid.lib、d3d9.lib、d3dx9.lib等,不同的程序需要不同的库文件,但是dxguid.lib是必须要包含的。

其他办法:在设置了Include和Library文件路径后,我们还可以使用在程序首部加入以下语句变相实现相应库文件的链接。

#pragma comment (lib,"dxguid.lib")

#pragma comment (lib,"d3d9.lib")

........

2、Borland C++ Builder 5/6/X中的配置
很不幸,自DirectX8.0 SDK起,Microsoft就不再提供Borland编译器支持的库文件。Borland C++ Builder是一款非常优秀的RAD开发工具,它在开发桌面应用程序上的便捷性令人叹为观止,那么是不是就无法在C++ Builder中进行DirectX开发了呢?这似乎有点可惜。但是Borland自有它的高招,既然标准的DirectX SDK中不提供Borland版的库文件,那我就自己做!方法如下:

首先,在C++Builder安装目录下的bin子目录中,我们可以找到一个名为implib.exe的文件;其次,打开 MSDOS命令行窗口,输入:implib [库文件名] [源DLL文件名],即可成成相应链接所需的库文件。

例如:从d3d9.dll中导出编译所需的d3d9.lib,并将生成的d3d9.lib保存到C盘根目录下。

implib c:d3d9.lib c:windowssystem32d3d9.dll

这样我们就得到了所需的lib文件,然后将它和原来SDK中所提供的.h文件混合使用,就可以在C++ Builder中进行梦寐以求的DirectX开发了,此方法在C++ Builder X和DirectX9 SDK Update(Summer 2003)环境下测试通过。(在上述环境下似乎不需要dxguid.lib编译也能通过)

五、DirectX的未来

DirectX的基本模型架构:


DirectX9 DirectX10

在现有的DirectX 8和DirectX 9中,可编程顶点着色和像素渲染是分开来的两个单元,也就是说,GPU生产厂家需要在GPU中划分两个区域来存放Vertex Shader阵列和Pixel Shader贴图流水线,那么,能否把这两者整合在一起呢?可以!那就是DirectX 10!如图所示,预计DirectX10中的Vertex Shader和Pixel Shader将会合并成一个Integrated Shader单元。

五、结束语

正如本文所展现的历代DirectX的发展史,及其一步步改进的足迹,DirectX的确在媒体技术上占有至关重要的地位,它是一代又一代媒体技术发展的催化剂。可以预见,未来的DirectX将给我们带来前所未有的、更加震撼的视听冲击,让我们拭目以待!

[转帖]为了积分:打印屏暮源码,可以直接使用

[转帖]为了积分:打印屏暮源码,可以直接使用

*******************************************
*-- 程序名称:将表单的内容直接打印 --*
*-- 将窗口中的内容以一个位图的形式打印 --*
*-- 程序作者:未知,来源论坛转帖 --*
*-- 使用方法:在表单中执行该程序既可 --*
* 例:在某表单的一个command --*
* 按纽中执行 do PrintForm.prg with  left,top, width, Heitht--*
* 参数:左,上,宽,高
*******************************************
PARAMETERS oForm, nLeft, nTop, nWidth, nHeight, nBL
*-- 定义常量
#DEFINE LOGPIXELSX 88
#DEFINE LOGPIXELSY 90
#DEFINE PHYSICALOFFSETX 112
#DEFINE PHYSICALOFFSETY 113
#DEFINE SRCCOPY 13369376
#DEFINE DIB_RGB_COLORS 0
*SET STEP ON


*-- 调用本程序段中的子过程声明API函数
DO decl

*-- 定义变量
PRIVATE pnWidth, pnHeight, lnBitsPerPixel, lnBytesPerScan
STORE 0 TO pnWidth, pnHeight, lnBitsPerPixel, lnBytesPerScan
LOCAL hwnd, hFormDC, hPrnDC, hMemDC, hMemBmp, hSavedBitmap,;
xOffsPrn, yOffsPrn, xScale, yScale, lcDocInfo, lcBInfo, lpBitsArray

*-- 得到打印机设备的坐标偏移量
hPrnDC = getDefaultPrnDC() && 没有进行错误检查
IF hPrnDC=0
 MESSAGEBOX('没找到打印机驱动!',0+16,'屏幕打印')
 RETURN
ENDIF
xOffsPrn = GetDeviceCaps(hPrnDC, PHYSICALOFFSETX)
yOffsPrn = GetDeviceCaps(hPrnDC, PHYSICALOFFSETY)

*-- 得到屏幕的窗口句柄,及她们的宽度、高度等。
*hwnd = GetFocus() && a window with keyboard focus
hwnd = oForm.hwnd
hFormDC = GetWindowDC(hwnd)
= getWinRect (hwnd, @pnWidth, @pnHeight)
*----调整逻辑坐标为实际坐标,操作系统不同,边框的宽度不一样
nLeft = nleft + (pnWidth-oForm.Width)/2
nTop = nTop + (pnHeight-oForm.Height)-(pnWidth-oForm.Width)/2
*pnWidth=lnWidth
*pnHeight=lnHeight

*-- 根据屏幕和打印机得到缩放值,该值同时要包含自定义缩放倍数
IF TYPE("nBL")<>"N"
 nBL=1
ENDIF
IF nBL=0   &&---适应A4纸的宽度的倍数
 nBL=1
ENDIF
xScale = nBL* GetDeviceCaps(hPrnDC, LOGPIXELSX)/GetDeviceCaps(hFormDC,LOGPIXELSX)
yScale = nBL* GetDeviceCaps(hPrnDC, LOGPIXELSY)/GetDeviceCaps(hFormDC,LOGPIXELSY)

*-- 将屏幕的内容创建为位图图象数据,宽度为pnWidth,高度pnHeight
hMemDC = CreateCompatibleDC (hFormDC)
hMemBmp = CreateCompatibleBitmap (hFormDC, nWidth, nHeight)
hSavedBitmap = SelectObject(hMemDC, hMemBmp)

*-- 将位图数据从屏幕拷贝到虚拟设备上(拷贝指定的区域)
oForm.zorder
= BitBlt (hMemDC, 0,0, nWidth,nHeight, hFormDC, nLeft, nTop, SRCCOPY)
= SelectObject(hMemDC, hSavedBitmap)

* retrieving bits from the compatible bitmap into a buffer
* as a device-independent bitmap (DIB) with a BitsPerPixel value
* as one of the printer device context
*InitBitmapInfo是自定义函数
lcBInfo = InitBitmapInfo(hPrnDC)
lpBitsArray = InitBitsArray()
= GetDIBits (hMemDC, hMemBmp, 0, nHeight,;
lpBitsArray, @lcBInfo, DIB_RGB_COLORS)

lcDocInfo = Chr(20) + Repli(Chr(0), 19) && DOCINFO struct - 20 bytes
IF StartDoc(hPrnDC, @lcDocInfo) > 0
= StartPage(hPrnDC)

= StretchDIBits (hPrnDC, xOffsPrn, yOffsPrn,;
xOffsPrn + Int(xScale * nWidth),;
yOffsPrn + Int(yScale * nHeight),;
0,0, nWidth, nHeight,;
lpBitsArray, @lcBInfo, DIB_RGB_COLORS, SRCCOPY)

= EndPage(hPrnDC)
= EndDoc(hPrnDC)
ENDIF

*-- 退出时释放系统资源
= GlobalFree(lpBitsArray)
= DeleteObject(hMemBmp)
= DeleteDC(hMemDC)
= DeleteDC(hPrnDC)
= ReleaseDC(hwnd, hFormDC)
RETURN

PROCEDURE getWinRect (lnHwnd, lnWidth, lnHeight)
*-- 返回指定句柄的窗口的宽和高
#DEFINE maxDword 4294967295 && 0xffffffff
LOCAL lpRect, lnLeft, lnTop, lnRight, lnBottom
lpRect = REPLI (Chr(0), 16)
= GetWindowRect (lnHwnd, @lpRect)

lnRight = buf2dword(SUBSTR(lpRect, 9,4))
lnBottom = buf2dword(SUBSTR(lpRect, 13,4))

lnLeft = buf2dword(SUBSTR(lpRect, 1,4))
IF lnLeft > lnRight
lnLeft = lnLeft - maxDword
ENDIF
lnTop = buf2dword(SUBSTR(lpRect, 5,4))
IF lnTop > lnBottom
lnTop = lnTop - maxDword
ENDIF

lnWidth = lnRight - lnLeft
lnHeight = lnBottom - lnTop
RETURN

FUNCTION getDefaultPrnDC
* returns device context for the default printer
#DEFINE PD_RETURNDC 256
#DEFINE PD_RETURNDEFAULT 1024
LOCAL lcStruct, lnFlags
lnFlags = PD_RETURNDEFAULT + PD_RETURNDC

* fill PRINTDLG structure
lcStruct = num2dword(66) + Repli(Chr(0), 16) +;
num2dword(lnFlags) + Repli(Chr(0), 42)
IF PrintDlg (@lcStruct) <> 0
RETURN buf2dword (SUBSTR(lcStruct, 17,4))
ENDIF
RETURN 0

*-----自定义函数,初始化位图结构头
FUNCTION InitBitmapInfo(hTargetDC)
#DEFINE BI_RGB 0
#DEFINE RGBQUAD_SIZE 4 && RGBQUAD
#DEFINE BHDR_SIZE 40 && BITMAPINFOHEADER

LOCAL lnRgbQuadSize, lcRgbQuad, lcBIHdr

* use printer BitPerPixel value
lnBitsPerPixel = 24

* initializing BitmapInfoHeader structure
lcBIHdr = num2dword(BHDR_SIZE) +;
num2dword(nWidth) + num2dword(nHeight) +;
num2word(1) + num2word(lnBitsPerPixel) +;
num2dword(BI_RGB) + Repli(Chr(0), 20)

*----建立颜色调色板?
* creating a buffer for the color table
IF lnBitsPerPixel <= 8
lnRgbQuadSize = (2^lnBitsPerPixel) * RGBQUAD_SIZE
lcRgbQuad = Repli(Chr(0), lnRgbQuadSize)
ELSE
lcRgbQuad = ""
ENDIF
RETURN lcBIHdr + lcRgbQuad


*----自定义函数,功能是?
PROCEDURE InitBitsArray()
#DEFINE GMEM_FIXED 0
LOCAL lnPtr, lnAllocSize

* making sure the value is DWORD-aligned
lnBytesPerScan = Int((nWidth * lnBitsPerPixel)/8)
IF Mod(lnBytesPerScan, 4) <> 0
lnBytesPerScan = lnBytesPerScan + 4 - Mod(lnBytesPerScan, 4)
ENDIF

lnAllocSize = pnHeight * lnBytesPerScan
lnPtr = GlobalAlloc (GMEM_FIXED, lnAllocSize)
= ZeroMemory (lnPtr, lnAllocSize)
RETURN lnPtr

FUNCTION num2word (lnValue)
RETURN Chr(MOD(m.lnValue,256)) + CHR(INT(m.lnValue/256))

FUNCTION num2dword (lnValue)
#DEFINE m0 256
#DEFINE m1 65536
#DEFINE m2 16777216
LOCAL b0, b1, b2, b3
b3 = Int(lnValue/m2)
b2 = Int((lnValue - b3*m2)/m1)
b1 = Int((lnValue - b3*m2 - b2*m1)/m0)
b0 = Mod(lnValue, m0)
RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)

FUNCTION buf2word (lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
Asc(SUBSTR(lcBuffer, 2,1)) * 256

FUNCTION buf2dword (lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
Asc(SUBSTR(lcBuffer, 2,1)) * 256 +;
Asc(SUBSTR(lcBuffer, 3,1)) * 65536 +;
Asc(SUBSTR(lcBuffer, 4,1)) * 16777216

PROCEDURE decl && so many of them declared here
DECLARE INTEGER GetFocus IN user32
DECLARE INTEGER EndDoc IN gdi32 INTEGER hdc
DECLARE INTEGER GetWindowDC IN user32 INTEGER hwnd
DECLARE INTEGER DeleteObject IN gdi32 INTEGER hObject
DECLARE INTEGER CreateCompatibleDC IN gdi32 INTEGER hdc
DECLARE INTEGER ReleaseDC IN user32 INTEGER hwnd, INTEGER hdc
DECLARE INTEGER GetWindowRect IN user32 INTEGER hwnd, STRING @lpRect
DECLARE INTEGER GlobalAlloc IN kernel32 INTEGER wFlags, INTEGER dwBytes
DECLARE INTEGER GetDeviceCaps IN gdi32 INTEGER hdc, INTEGER nIndex
DECLARE INTEGER SelectObject IN gdi32 INTEGER hdc, INTEGER hObject
DECLARE INTEGER StartDoc IN gdi32 INTEGER hdc, STRING @ lpdi
DECLARE INTEGER GlobalFree IN kernel32 INTEGER hMem
DECLARE INTEGER PrintDlg IN comdlg32 STRING @ lppd
DECLARE INTEGER DeleteDC IN gdi32 INTEGER hdc
DECLARE INTEGER StartPage IN gdi32 INTEGER hdc
DECLARE INTEGER EndPage IN gdi32 INTEGER hdc

DECLARE RtlZeroMemory IN kernel32 As ZeroMemory;
INTEGER dest, INTEGER numBytes

DECLARE INTEGER CreateCompatibleBitmap IN gdi32;
INTEGER hdc, INTEGER nWidth, INTEGER nHeight

DECLARE INTEGER BitBlt IN gdi32;
INTEGER hDestDC, INTEGER x, INTEGER y,;
INTEGER nWidth, INTEGER nHeight, INTEGER hSrcDC,;
INTEGER xSrc, INTEGER ySrc, INTEGER dwRop

DECLARE INTEGER StretchDIBits IN gdi32;
INTEGER hdc, INTEGER Xdest, INTEGER Ydest,;
INTEGER nDestWidth, INTEGER nDestHeight, INTEGER XSrc,;
INTEGER Ysrc, INTEGER nSrcWidth, INTEGER nSrcHeight,;
INTEGER lpBits, STRING @lpBitsInfo,;
INTEGER iUsage, INTEGER dwRop

DECLARE INTEGER GetDIBits IN gdi32;
INTEGER hdc, INTEGER hbmp, INTEGER uStartScan,;
INTEGER cScanLines, INTEGER lpvBits, STRING @lpbi,;
INTEGER uUsage
RETURN && decl

8月11日

在SQL Server中利用日志备份前滚到上个备份之间的任何时间点上

在SQL Server中利用日志备份前滚到上个备份之间的任何时间点上

-- 标题:在SQL Server中利用日志备份前滚到上个备份之间的任何时间点上
-- 红虎于 2006年6月9日
 
-- 首先需要有数据库的备份,称为A点
backup database ct_mms to disk='d:\A_DataBackup.bak' with init

-- 正常的对数据库进行操作,称为B点,29分操作
Insert Into Users (UserCode,UserName,Department,CanAudit) values ('000','Test','IT',1)
Update Users Set UserName = 'RedTiger' Where UserCode = '000'
-- 其他操作..
-- 不小心删除了表记录,称为C点,31分操作
Delete From Users

-- 此时需要恢复从A点到C点之间的数据,即恢复到C点未发生之前的数据,称为D点
 
-- 为实现上述要求,首先备份当前数据库的日志,恢复第一步
BACKUP LOG ct_mms TO DISK='d:\D_LogBackup.bak' WITH INIT
-- 将A点备份的数据恢复,恢复第二步(此时不能使用数据库,企业管理器应关闭)
RESTORE DATABASE ct_mms from disk='d:\A_DataBackup.bak' WITH NORECOVERY
-- 恢复D点时备份的日志,但是指定其时间要小于D的时间点,也就是从A点开始到D点之前根据日志记录重新处理一遍数据
RESTORE LOG ct_mms
        FROM disk='d:\D_LogBackup.bak' WITH RECOVERY,STOPAT='2006-6-9 0:30'
-- 此时可恢复到C点之前的数据状态
 

转载一篇pagecode的文章

转载一篇pagecode的文章- -

                                      

转:http://www.evget.com/articles/evget_1092.html
这几天研究UTF-8编码,太晕了,把我的看法和各位讨论讨论。欢迎来批啊。以下都是我的想法,哪里有不对的请不吝赐教,帮忙指出来。

相关的题外话:

一、操作系统
window系统内部都是unicode的。文件夹名,文件名等都是unicode的,任何语言系统下都能正常显示。

二、输入法:
微软拼音输出的是Unicode的,智能ABC输出是简体中文的(所以智能ABC在非简体中文系统根本不能用,只能打英文)。

三、网页的textarea
网页的textarea是用unicode显示的。所以往里打什么字都能显示。而一些flash做的输入框就不行了。

四、Access2000
access里面保存的数据是unicode的,在任何语言系统下都能显示。
如果数据视图查看有些字符不正常,那是因为显示所用的字体不是Unicode字体,
换用Arial Unicode MS 字体就能全部显示了。(access帮助,搜索,输入unicode,有说明)

五、Word
word里的繁简转换,简体转换到繁体后,内码仍是简体中文的,其实只是简体中的繁体字。

六、ASP内部是Unicode的,所有文本都是Unicode存储的。需要时转换到指定字符集。

首先说下结论:

<%@ codepage=936%>简体中文
<%@ codepage=950%>繁体中文
<%@ codepage=65001%>UTF-8

codepage指定了IIS按什么编码读取传递过来的串串(表单提交,地址栏传递等)。

也指定了所有文本变量从Unicode转换到的编码,
也就指定了从数据库取出的数据从Unicode转换到的编码。(注意这个,很重要。)

关键字:
读取:一个串串,按简体读取是一些字,按繁体读取是一些字,串串本身编码没有变。

转换:系统主动的转换,比如从Unicode的“化”字到Big5的“化”字,内码变成Big5的。如果Big5没有对应的字,保留Unicode形式(xxx;)

简体中文:化六个结论
Unicode16进制形式:化六个结论
Unicode10进制形式:化六个结论

下面是我推测出来的编码转换的过程:
客户端:输入法Unicode--输入框unicode--从Unicode按charset转换到对应编码()--表单发送编码

服务器端:IIS解开表单编码--按codepage指定编码读取--转换到对应的Unicode--可以用request("")读取了--进行一些处理--以Unicode编码保存到数据库

服务器端:读取数据库的Unicode数据,转换到codepage指定编码---生成源代码--IE按charset读取显示。

下面举例说明:
例一:
假设有三个asp页面,典型的留言页面:
1.write.asp 简单的输入表单,提交到add.asp。

2.add.asp 接收留言,保存到数据库
<%@ codepage=936%>
3.read.asp 从数据库取得留言,显示。
<%@ codepage=936%> charset=GB2312 或
<%@ codepage=950%> charset=big5

大家可以猜一猜,我在write.asp里用微软拼音输入法输入“化六个讨论”。最后在read.asp里会显示什么样?
是不是晕了。让我们从头分析。
例二:
把例一的add.asp的<%@ codepage=936%>改为<%@ codepage=950%>,又会怎么样呢?

到这里发现了什么?

1.如果输入的文字和Charset对应的不同,一转换,就可能出现Unicode形式的字了。这里就是原因所在。以后整个过程都保留着。

2.Add.asp里codepage决定了保存到数据库的文字,用的是哪个语言对应的Unicode.如codepage=936,
那么数据库保存的就是简体中文的Unicode(数据库拿回简体中文系统,一切正常的),
codepage=950保存的就是繁体中文的Unicode.(拿回简体中文系统,就不对了)。

3.注意一下串串的变化过程:

1)输入法---CharsetUnicode----指定字符集的映射
2)Charset----表单编码串串简单编码
3)表单解码上步的逆过程,两步抵消了。
4)串串à按codepage读取串串没变,这步有可能“误会读取”
5)转为对应的Unicode Codepage指定字符集----Unicode映射
6)中间处理,进数据库无变化,直接以Unicode形式进入
7)按codepage读取数据库 Unicode----codepage指定字符集的映射
8)显示,按Charset指定字符集读取串串没变。
案例1:
简体中文系统下跑的好好的代码,放到国外空间上,数据库里乱码,原有的数据也乱码。
分析:因为大多数人平时用的都是简体中文系统,默认的codepage=936,所以平时大家不写也没有关系。
但到了国外空间问题就出来了。从数据库里的Unicode转换到英文编码去了,所以数据库原有的简体中文转换到英文后,按GB显示自然乱码。
如图,新输入的文字显示正常,但数据库里保存的是英文的Unicode的。
解决方法:全部加上<%@codepage=936即可%>。
全程只有简体中文与对应Unicode间的转换。



案例二:
简体中文的代码和数据,想转为完全的繁体版,该怎么办?
分析:1。代码文件编码全部改为Big5的,文件本身保存编码选繁体。
2.<%@ codepage=936 %>
3.Charset=big5
4.access版本无所谓,因为access里的数据是Unicode的。
5.好了,代码可以在纯繁体系统下跑了。
6.遗留问题:原有的简体中文数据读出会有一些问号。效果同例一的950读取,big5显示。因为从简体中文的Unicode转换到繁体中文了,有些字繁体中没有,就会出问号。
7.解决:用一个临时asp页,codepage=65001,读出为简体中文的Unicode,用一个Unicode->Big5的函数,转为繁体中文,然后写回数据库,应该行了吧?


两个案例完全是我按照理论推导出来了,未经证实。有类似经历的欢迎批评指正。
附:我个人的一些理解
charset页面对它进行编码
encode服务器对它编码
MS的东东都是以UNICODE的形式存在(即不是UNICODE会转换成UNICODE.

7月28日

在局域网内发给指定用户消息

在局域网内发给指定用户消息
PROCEDURE NetSend
LPARAMETERS pcUser, pcMessage

DECLARE INTEGER NetMessageBufferSend IN netapi32 ;
STRING @ servername, STRING @ UserName, STRING @ fromname, ;
STRING @ MessageBuf, INTEGER buflen

LOCAL lnLen, lcFrom, lcMsgName, lcUser, lcMsg
lcUser = strconv( StrConv(pcUser,1), 5)
lcMsg = strconv( StrConv(pcMessage,1), 5)
lcFrom = strconv( Strconv(Sys(0),1), 5)
lnLen = len(pcMessage)*2+2
res=NetMessageBufferSend( 0, lcUser, 0, lcMsg, lnLen )

[分享]VFP中将表单的内容直接打印

[分享]VFP中将表单的内容直接打印

VFP中将表单的内容直接打印

( 作者: 不详 )


*******************************************
*-- 程序名称:将表单的内容直接打印      --*
*-- 将窗口中的内容以一个位图的形式打印  --*
*-- 程序作者:未知,来源论坛转帖        --*
*-- 使用方法:在表单中执行该程序既可    --*
*           例:在某表单的一个command   --*
*           按纽中执行 do PrintForm.prg --*
*-- 红虎工作室(honghoo.NET) 整理、编排  --*
*******************************************

*-- 定义常量
#DEFINE LOGPIXELSX           88
#DEFINE LOGPIXELSY           90
#DEFINE PHYSICALOFFSETX     112
#DEFINE PHYSICALOFFSETY     113
#DEFINE SRCCOPY        13369376
#DEFINE DIB_RGB_COLORS        0

*-- 调用本程序段中的子过程
DO decl

*-- 定义变量
PRIVATE pnWidth, pnHeight, lnBitsPerPixel, lnBytesPerScan
STORE 0 TO pnWidth, pnHeight, lnBitsPerPixel, lnBytesPerScan
LOCAL hwnd, hFormDC, hPrnDC, hMemDC, hMemBmp, hSavedBitmap,;
	xOffsPrn, yOffsPrn, xScale, yScale, lcDocInfo, lcBInfo, lpBitsArray

*-- 得到打印机设备的坐标偏移量
hPrnDC = getDefaultPrnDC()  && 没有进行错误检查
xOffsPrn = GetDeviceCaps(hPrnDC, PHYSICALOFFSETX)
yOffsPrn = GetDeviceCaps(hPrnDC, PHYSICALOFFSETY)

*-- 得到屏幕的窗口句柄,及她们的宽度、高度等。
hwnd = GetFocus()  && a window with keyboard focus
hFormDC = GetWindowDC(hwnd)
= getWinRect (hwnd, @pnWidth, @pnHeight)

*-- 根据屏幕和打印机得到缩放值
xScale = GetDeviceCaps(hPrnDC, LOGPIXELSX)/GetDeviceCaps(hFormDC,LOGPIXELSX)
yScale = GetDeviceCaps(hPrnDC, LOGPIXELSY)/GetDeviceCaps(hFormDC,LOGPIXELSY)

*-- 将屏幕的内容创建为位图图象数据
hMemDC = CreateCompatibleDC (hFormDC)
hMemBmp = CreateCompatibleBitmap (hFormDC, pnWidth, pnHeight)
hSavedBitmap = SelectObject(hMemDC, hMemBmp)

*-- 将位图数据从屏幕拷贝到虚拟设备上
= BitBlt (hMemDC, 0,0, pnWidth,pnHeight, hFormDC, 0,0, SRCCOPY)
= SelectObject(hMemDC, hSavedBitmap)

* retrieving bits from the compatible bitmap into a buffer
* as a device-independent bitmap (DIB) with a BitsPerPixel value
* as one of the printer device context
lcBInfo = InitBitmapInfo(hPrnDC)
lpBitsArray = InitBitsArray()
= GetDIBits (hMemDC, hMemBmp, 0, pnHeight,;
	lpBitsArray, @lcBInfo, DIB_RGB_COLORS)

lcDocInfo = Chr(20) + Repli(Chr(0), 19) && DOCINFO struct - 20 bytes
IF StartDoc(hPrnDC, @lcDocInfo) > 0
	= StartPage(hPrnDC)

	= StretchDIBits (hPrnDC, xOffsPrn, yOffsPrn,;
		xOffsPrn + Int(xScale * pnWidth),;
		yOffsPrn + Int(yScale * pnHeight),;
		0,0, pnWidth, pnHeight,;
		lpBitsArray, @lcBInfo, DIB_RGB_COLORS, SRCCOPY)

	= EndPage(hPrnDC)
	= EndDoc(hPrnDC)
ENDIF

*-- 退出时释放系统资源
= GlobalFree(lpBitsArray)
= DeleteObject(hMemBmp)
= DeleteDC(hMemDC)
= DeleteDC(hPrnDC)
= ReleaseDC(hwnd, hFormDC)
RETURN

PROCEDURE  getWinRect (lnHwnd, lnWidth, lnHeight)
	*-- 返回指定句柄的窗口的宽和高
	#DEFINE maxDword  4294967295  && 0xffffffff
	LOCAL lpRect, lnLeft, lnTop, lnRight, lnBottom
	lpRect = REPLI (Chr(0), 16)
	= GetWindowRect (lnHwnd, @lpRect)

	lnRight  = buf2dword(SUBSTR(lpRect,  9,4))
	lnBottom = buf2dword(SUBSTR(lpRect, 13,4))

	lnLeft   = buf2dword(SUBSTR(lpRect,  1,4))
	IF lnLeft > lnRight
		lnLeft = lnLeft - maxDword
	ENDIF
	lnTop    = buf2dword(SUBSTR(lpRect,  5,4))
	IF lnTop > lnBottom
		lnTop = lnTop - maxDword
	ENDIF

	lnWidth = lnRight - lnLeft
	lnHeight = lnBottom - lnTop
	RETURN

FUNCTION  getDefaultPrnDC
	* returns device context for the default printer
	#DEFINE PD_RETURNDC         256
	#DEFINE PD_RETURNDEFAULT   1024
	LOCAL lcStruct, lnFlags
	lnFlags = PD_RETURNDEFAULT + PD_RETURNDC

	* fill PRINTDLG structure
	lcStruct = num2dword(66) + Repli(Chr(0), 16) +;
		num2dword(lnFlags) + Repli(Chr(0), 42)
	IF PrintDlg (@lcStruct) <> 0
		RETURN buf2dword (SUBSTR(lcStruct, 17,4))
	ENDIF
	RETURN  0

FUNCTION  InitBitmapInfo(hTargetDC)
	#DEFINE BI_RGB         0
	#DEFINE RGBQUAD_SIZE   4  && RGBQUAD
	#DEFINE BHDR_SIZE     40  && BITMAPINFOHEADER

	LOCAL lnRgbQuadSize, lcRgbQuad, lcBIHdr

	* use printer BitPerPixel value
	lnBitsPerPixel = 24

	* initializing BitmapInfoHeader structure
	lcBIHdr = num2dword(BHDR_SIZE) +;
		num2dword(pnWidth) + num2dword(pnHeight) +;
		num2word(1) + num2word(lnBitsPerPixel) +;
		num2dword(BI_RGB) + Repli(Chr(0), 20)

	* creating a buffer for the color table
	IF lnBitsPerPixel <= 8
		lnRgbQuadSize = (2^lnBitsPerPixel) * RGBQUAD_SIZE
		lcRgbQuad = Repli(Chr(0), lnRgbQuadSize)
	ELSE
		lcRgbQuad = ""
	ENDIF
	RETURN  lcBIHdr + lcRgbQuad

PROCEDURE  InitBitsArray()
	#DEFINE GMEM_FIXED   0
	LOCAL lnPtr, lnAllocSize

	* making sure the value is DWORD-aligned
	lnBytesPerScan = Int((pnWidth * lnBitsPerPixel)/8)
	IF Mod(lnBytesPerScan, 4) <> 0
		lnBytesPerScan = lnBytesPerScan + 4 - Mod(lnBytesPerScan, 4)
	ENDIF

	lnAllocSize = pnHeight * lnBytesPerScan
	lnPtr = GlobalAlloc (GMEM_FIXED, lnAllocSize)
	= ZeroMemory (lnPtr, lnAllocSize)
	RETURN  lnPtr

FUNCTION  num2word (lnValue)
	RETURN Chr(MOD(m.lnValue,256)) + CHR(INT(m.lnValue/256))

FUNCTION  num2dword (lnValue)
	#DEFINE m0       256
	#DEFINE m1     65536
	#DEFINE m2  16777216
	LOCAL b0, b1, b2, b3
	b3 = Int(lnValue/m2)
	b2 = Int((lnValue - b3*m2)/m1)
	b1 = Int((lnValue - b3*m2 - b2*m1)/m0)
	b0 = Mod(lnValue, m0)
	RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)

FUNCTION  buf2word (lcBuffer)
	RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
		Asc(SUBSTR(lcBuffer, 2,1)) * 256

FUNCTION  buf2dword (lcBuffer)
	RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
		Asc(SUBSTR(lcBuffer, 2,1)) * 256 +;
		Asc(SUBSTR(lcBuffer, 3,1)) * 65536 +;
		Asc(SUBSTR(lcBuffer, 4,1)) * 16777216

PROCEDURE  decl   && so many of them declared here
	DECLARE INTEGER GetFocus IN user32
	DECLARE INTEGER EndDoc IN gdi32 INTEGER hdc
	DECLARE INTEGER GetWindowDC IN user32 INTEGER hwnd
	DECLARE INTEGER DeleteObject IN gdi32 INTEGER hObject
	DECLARE INTEGER CreateCompatibleDC IN gdi32 INTEGER hdc
	DECLARE INTEGER ReleaseDC IN user32 INTEGER hwnd, INTEGER hdc
	DECLARE INTEGER GetWindowRect IN user32 INTEGER hwnd, STRING @lpRect
	DECLARE INTEGER GlobalAlloc IN kernel32 INTEGER wFlags, INTEGER dwBytes
	DECLARE INTEGER GetDeviceCaps IN gdi32 INTEGER hdc, INTEGER nIndex
	DECLARE INTEGER SelectObject IN gdi32 INTEGER hdc, INTEGER hObject
	DECLARE INTEGER StartDoc IN gdi32 INTEGER hdc, STRING @ lpdi
	DECLARE INTEGER GlobalFree IN kernel32 INTEGER hMem
	DECLARE INTEGER PrintDlg IN comdlg32 STRING @ lppd
	DECLARE INTEGER DeleteDC IN gdi32 INTEGER hdc
	DECLARE INTEGER StartPage IN gdi32 INTEGER hdc
	DECLARE INTEGER EndPage IN gdi32 INTEGER hdc

	DECLARE RtlZeroMemory IN kernel32 As ZeroMemory;
		INTEGER dest, INTEGER numBytes

	DECLARE INTEGER CreateCompatibleBitmap IN gdi32;
		INTEGER hdc, INTEGER nWidth, INTEGER nHeight

	DECLARE INTEGER BitBlt IN gdi32;
		INTEGER hDestDC, INTEGER x, INTEGER y,;
		INTEGER nWidth, INTEGER nHeight, INTEGER hSrcDC,;
		INTEGER xSrc, INTEGER ySrc, INTEGER dwRop

	DECLARE INTEGER StretchDIBits IN gdi32;
		INTEGER hdc, INTEGER XDest, INTEGER YDest,;
		INTEGER nDestWidth, INTEGER nDestHeight, INTEGER XSrc,;
		INTEGER YSrc, INTEGER nSrcWidth, INTEGER nSrcHeight,;
		INTEGER lpBits, STRING @lpBitsInfo,;
		INTEGER iUsage, INTEGER dwRop

	DECLARE INTEGER GetDIBits IN gdi32;
		INTEGER hdc, INTEGER hbmp, INTEGER uStartScan,;
		INTEGER cScanLines, INTEGER lpvBits, STRING @lpbi,;
		INTEGER uUsage
	RETURN       
 && decl


7月27日

马云给雅虎员工作的精彩演讲

这是马云给雅虎员工作的精彩演讲

今天是我第一次和雅虎的朋友们面对面交流。我希望把我成功的经验和大家分享,尽管我认为你们其中的绝大多数勤劳聪明的人都无法从中获益,但我坚信,一定有个别懒的去判断我讲的是否正确就效仿的人,可以获益匪浅。

让我们开启今天的话题吧!

世界上很多非常聪明并且受过高等教育的人,无法成功。就是因为他们从小就受到了错误的教育,他们养成了勤劳的恶习。很多人都记得爱迪生说的那句话吧:天才就是99%的汗水加上1%的灵感。并且被这句话误导了一生。勤勤恳恳的奋斗,最终却碌碌无为。其实爱迪生是因为懒的想他成功的真正原因,所以就编了这句话来误导我们。

很多人可能认为我是在胡说八道,好,让我用100个例子来证实你们的错误吧!事实胜于雄辩。

世界上最富有的人,比尔盖茨,他是个程序员,懒的读书,他就退学了。他又懒的记那些复杂的dos命令,于是,他就编了个图形的界面程序,叫什么来着?我忘了,懒的记这些东西。于是,全世界的电脑都长着相同的脸,而他也成了世界首富。

世界上最值钱的品牌,可口可乐。他的老板更懒,尽管中国的茶文化历史悠久,巴西的咖啡香味浓郁,但他实在太懒了。弄点糖精加上凉水,装瓶就卖。于是全世界有人的地方,大家都在喝那种像血一样的液体。

世界上最好的足球运动员,罗纳耳朵,他在场上连动都懒的动,就在对方的门前站着。等球砸到他的时候,踢一脚。这就是全世界身价最高的运动员了。有的人说,他带球的速度惊人,那是废话,别人一场跑90分钟,他就跑15秒,当然要快些了。

世界上最厉害的餐饮企业,麦当劳。他的老板也是懒的出奇,懒的学习法国大餐的精美,懒的掌握中餐的复杂技巧。弄两片破面包夹块牛肉就卖,结果全世界都能看到那个M的标志。必胜客的老板,懒的把馅饼的馅装进去,直接撒在发面饼上边就卖,结果大家管那叫PIZZA,比10张馅饼还贵。

还有更聪明的懒人:

懒的爬楼,于是他们发明了电梯;

懒的走路,于是他们制造出汽车,火车,和飞机;

懒的一个一个的杀人,于是他们发明了原子弹;

懒的每次去计算,于是他们发明了数学公式;

懒的出去听音乐会,于是他们发明了唱片,磁带和CD;

这样的例子太多了,我都懒的再说了。

还有那句废话也要提一下,生命在于运动,你见过哪个运动员长寿了?世界上最长寿的人还不是那些连肉都懒的吃的和尚?

如果没有这些懒人,我们现在生活在什么样的环境里,我都懒的想!

人是这样,动物也如此。世界上最长寿的动物叫乌龟,他们一辈子几乎不怎么动,就趴在那里,结果能活一千年。他们懒的走,但和勤劳好动的兔子赛跑,谁赢了?牛最勤劳,结果人们给它吃草,却还要挤它的奶。熊猫傻了吧唧的,什么也不干,抱着根竹子能啃一天,人们亲昵的称它为“国宝“。

回到我们的工作中,看看你公司里每天最早来最晚走,一天像发条一样忙个不停的人,他是不是工资最低的?那个每天游手好闲,没事就发呆的家伙,是不是工资最高,据说还有不少公司的股票呢!

我以上所举的例子,只是想说明一个问题,这个世界实际上是靠(kao)懒人来支撑的。世界如此的精彩都是拜懒人所赐。现在你应该知道你不成功的主要原因了吧!

懒不是傻懒,如果你想少干,就要想出懒的方法。要懒出风格,懒出境界。像我从小就懒,连长肉都懒的长,这就是境界。

7月26日

VFP中调用API锁定鼠标的活动范围

[转帖]VFP中调用API锁定鼠标的活动范围 [原创 2005-04-28 20:53:39 | 发表者: RMHB] VFP中调用API锁定鼠标的活动范围 [原创 2005-04-28 20:53:39 | 发表者: RMHB] 在程序中,我们有时会需要把鼠标限制在一定的区域中活动,VFP自身的函数是无法提供这一功能的,我们可以通过调用WINDOWS API来实现这一效果 下面的自定义过程是作用是可以应用在VFP的控件内部的,效果是把MOUSE锁在控件内部 笔者已经在自己的程序多次使用过,效果不错,在WIN98,WIN2000,WINXP下都经过测试 VFP适用版本:VFP6.0或以上版本 *过程:锁定鼠标范围(锁定) *参数:控件的left,top,width,height属性 para lnleft,lntop,lnwidth,lnheight DECLARE INTEGER ClipCursor IN user32 STRING lpRect DECLARE INTEGER GetCursorPos IN user32 STRING @ lpPoint DECLARE INTEGER GetClipCursor IN user32 STRING @ lpRect DECLARE INTEGER GetSystemMetrics IN user32 INTEGER nIndex #DEFINE m0 256 #DEFINE m1 65536 #DEFINE m2 16777216 LOCAL b0, b1, b2, b3 local zb(4) lprectlock='' zb(1)=this.left+5+lnleft zb(2)=this.top+5+lntop+GetSystemMetrics (15)+GetSystemMetrics (4) zb(3)=this.left+lnwidth+GetSystemMetrics (32)+lnleft zb(4)=this.top+lnheight+GetSystemMetrics (4)+GetSystemMetrics (33)+lntop++GetSystemMetrics (15) for i=1 to 4 b3 = INT(zb(i)/m2) b2 = INT((zb(i) - b3 * m2)/m1) b1 = INT((zb(i) - b3*m2 - b2*m1)/m0) b0 = MOD(zb(i), m0) lprectlock=lprectlock+CHR(b0)+CHR(b1)+CHR(b2)+CHR(b3) NEXT mouse at lntop+GetSystemMetrics (15)+GetSystemMetrics (4),lnleft PIXEL =clipcursor(lprectlock) 另:解锁的方法: 1建表单新属性:mouserect 2建表单新方法::relemouse 1首先保留原先的鼠标活动范围表单init里: DECLARE INTEGER GetClipCursor IN user32 STRING @ lpRect lpRect = REPLI (CHR(0), 16) = GetClipCursor (@lpRect) this.mouserect= lpRect 2、解锁鼠标 relemouse里 lpar mouserect DECLARE INTEGER ClipCursor IN user32 STRING lpRect =clipcursor(mouserect) 调用的方法:解锁: thisform.relemouse(thisform.mouserect) 本文作者:RMHB

 

串口

**这样可能更好,后面的是我的一些变量,你一看就会懂.

**初始化通信端口

TRY
with OMscomm
.commport=nCom_number &&串口的端口号
.handshaking=nHandshaking &&握手协议
.EOFEnable=IIF(inlist(nHandshaking,1,3),.T.,.F.) &&是否用EOF协议
.settings=cBpds &&波率等
.rthreshold=nRthreshold
.inBufferSize=nbuffersize &&输入缓冲
.inputlen=0
.portopen=1 &&最后打开端口
endwith

CATCH
ENDTRY

7月10日

乱弹

这年头,大棚把季节搞乱,小姐把辈份搞乱,关系把程序搞乱,级别把能力搞乱,公安把秩序搞乱,金钱把官场搞乱,手机把家庭搞乱!
这年头,女人漂亮的不下厨房,下厨房的不温柔,温柔的没主见,有主见的没女人味,有女人味的乱花钱,不乱花钱的不时尚,时尚的不放心,放心的没法看!
这年头,老婆像小灵通经济实惠但限本地使用,二奶像中国电信安全固定但带不出门,小蜜像中国移动使用方便但话费太贵。情人像中国联通优雅新潮但常不在服务区!

在发布一个 Visual FoxPro 9.0 开发的可执行程序,你需要考虑发布下面的文件

在发布一个 Visual FoxPro 9.0 开发的可执行程序(.exe)文件时,你需要考虑发布下面的文件
在一些论坛中(包括本论坛)不时会看到有人询问有关软件发布时需要同时发布那些运行库的问题。因此,我在这里也说上几句。不过,如果你用过 FoxPro 的早期版本的话应该比较熟悉这些了.......
在发布一个 Visual FoxPro 9.0 开发的可执行程序(.exe)文件时,你需要考虑发布下面的文件:
①.VFPV9R.dll/VFPV9T.dll
VFPV9R.dll 文件是单线程运行库,而 VFPV9T.dll 文件是多线程运行库。如果你用 Visual
FoxPro 开发的是一个服务程序或是.dll 文件,必须同时发布 VFPV9T.dll 文件。
②.VFP9Rchs.dll/VFPV9Rcht.dll
VFPV9Rchs.dll 是简体中文运行库,VFPV9Rcht.dll 是繁体中文运行库。根据运行环境的不同,这两个文件只需要发布一个。
③.GDIPlus.dll
这个文件需要发布。从 Visual FoxPro 8.0 开始,Visual FoxPro 支持 GDI+ 了。因此 Visual FoxPro 的 Image 控件具有了 RotateFlipproperty 属性,你可通过此属性来旋转、反转和翻转图片。
支持的文件格式如下:
.ani、.bmp、.cur、.dib、.emf、.exif、.gif/.gif 动画/.gfa、.ico、.jpg/.jpeg/.jpe/.jfif、.png、.tif/.tiff、.wmf 文件
注意:
在 Visual FoxPro 中,指针、动画指针和图标文件等均可被当作普通图形文件使用。例如,你可为 Image 控件的 Picture 属性指定一个动画指针文件,只不过 Image 控件显示的是静态的指针图像罢了。
④.MSVCR71.dll
Visual C++ 运行库,这是必须发布的一个文件。
⑤.Visual FoxPro 9.0 自带的 ActiveX 控件
下面这些 ActiveX 控件(.ocx 文件) 是在安装 Visual FoxPro 9.0 时默认安装的,它们可随你的应用程序一起自由发布。ActiveX 控件是在使用 Visual FoxPro OLE 容器控件时被添加到表单的。你在开发软件时不一定都会用到。因此,只需将用到的.ocx 文件和你的程序一起发布即可。这些控件的帮助文件在 MSDN 中提供。
MSCOMCtl.ocx 包括: ImageCombo、ImageList、ListView、ProgressBar、Slider、StatusBar、TabStrip、Toolbar 和 TreeView 控件 ( 注意:在 7.0 及以前的版本中该文件的名字是 Comctl32.ocx )
MSCOMCt2.ocx 包括: Animation、DateTimePicker、FlatScrollBar、MonthView 和 UpDown 控件
MCI32.ocx 包括: Multimedia MCI 控件
MSChrt20.ocx 包括: MsChart 控件
MSCOMM32.ocx 包括: MSComm 控件
MSInet.ocx 包括: Microsoft Internet Transfer 控件
MSMapi32.ocx 包括: MAPIMessages 和 MAPISession 控件
MSMask32.ocx 包括: Masked Edit 控件
MSWinsck.ocx 包括: Winsock 控件
Picclp32.ocx 包括: PictureClip 控件
Richtx32.ocx 包括: RichTextBox 控件
Sysinfo.ocx 包括: SysInfo 控件
⑥.VfpOleDB.dll
这个文件是其它程序设计语言及应用程序中访问 Visual FoxPro 数据库和表的 OLE DB 接口,一般用不到。
⑦.vfpodbc.dll
vfpodbc.dll 文件是 ODBC(数据库链接) 驱动程序,需要你就发布。
⑧.你在开发时用到的其它第三方控件

[原创]vfp自身交叉表的改进

[原创]vfp自身交叉表的改进

*****交叉表函数
CREATE cursor kk (ry c(10) ,xm c(10),je n(10,2))
INSERT INTO kk VALUES ('张三','西药',1.00)
INSERT INTO kk VALUES ('李四','中药',2.00)
INSERT INTO kk VALUES ('王五','检查',3.00)
INSERT INTO kk VALUES ('刘六','治疗',4.00)
INSERT INTO kk VALUES ('张三','治疗',5.00)
INSERT INTO kk VALUES ('李四','西药',6.00)
INSERT INTO kk VALUES ('王五','中药',7.00)
INSERT INTO kk VALUES ('刘六','检查',8.00)
brow

SELECT ry,xm,je ORDER BY 1,2 FROM kk INTO CURSOR lsk
mxab=xtab('lsk','xk',3) &&&源表,目标表,mtotal=0 无合计,1 水平合计,2垂直合计,3 水平+垂直合计
SELECT * FROM xk INTO CURSOR temp
brow

FUNCTION Xtab

PARAMETERS mxtable,mxtable2,mtotal
Select * From &mxtable Into Cursor Sys(2015)
m8=ICASE(mtotal=2 Or mtotal=3,.t.,.f.)
Do (_Genxtab) With mxtable2,.T.,.T.,.F.,1,2,3,m8,0,0
IF m8=.t.
   ALTER TABLE &mxtable2 RENAME COLUMN total TO 合计
ENDIF
mf=Field(1)
If mtotal=1 Or mtotal=3
 Total To _hjk On 1
 Update _hjk Set &mf = ' 合计'
 Append From _hjk
 Use In _hjk
 Delete File _hjk.Dbf
ENDIF
RETURN mxtable2

* Parameters:
*
*    Parm1 - output file/cursor name (default "xtab.dbf")
*    Parm2 - cursor only (default .F.)
*    Parm3 - close input table after (default .T.)
*    Parm4 - show thermometer (default .T.)
*    Parm5 - row field  (default 1)
*    Parm6 - column field  (default 2)
*    Parm7 - data field  (default 3)
*    Parm8 - total rows (default .F.)
*    Parm9 - totaling options (0-sum, 1-count, 2-% of total)
*    Parm10 - display Null values

译文:圖像數據開發者工具

译文:圖像數據開發者工具 
出处:http://fox.wikis.com/wc.dll?Wiki~ImageDataDeveloperTools
发布者:命名空間: VFP

1. Kodak Wang Desktop Imaging. 
工作在Windows操作系統下。 沒有OCR和增強圖像質量的工具。找不到任何文檔,所以只有使用為 KodakProfessionalDesktopImaging而出的文檔和示例:
在http://www.eistream.com/support_PRO/ Igor ,關於控件的幫助文件是:IMGOCXD.HLP

2. KodakProfessionalDesktopImaging. 官方網址http://www.eistream.com/support_PRO/
不貴 (2002年的報價是$ 99)。 
有OCR ActiveX和一些工具增強圖像質量。不支持掃描儀插件(例如imprinter)。 
也可以到: http://www.global360.com/products/g360_imaging/去找。

3. PixelTranslations. 官方網址 http://www.pixeltranslations.com/products/products.shtml
貴, 不過支持掃描儀插件(例如imprinter). 無試用版。

4. Image Magick 官方網址http://imagemagick.org
強大,跨平台,開源而免費。

5. Dosadi's EZTWAIN. 官方網址http://www.dosadi.com/ 
驅動TWAIN兼容設備,操作捕捉圖像的DLL集合。也能夠從VFP中控制TWAIN設備。

---
GNU Image Manipulation Program(GNU圖像操作程序)官方網址http://gimp.org 
為諸如圖像潤飾,構成和發布之類的任務,而免費的軟件。它工作在多操作系統之下,有多種語言。
"開發者將喜歡它,因為它支持用script-fu/tiny-fu/其他語言編寫的插件。"
注冊請到http://registry.gimp.org

GOCR 官方網址http://jocr.sourceforge.net 
GOCR是一種OCR (光學字元辨識)程序,在GNU公共授權協定下開發。它轉換掃描出來的圖像,使之變成文本文件,也可以作條形碼(BarCodes)還原。

译文:用VFP創建電子郵件

译文:用VFP創建電子郵件
出处:http://fox.wikis.com/wc.dll?Wiki~CdoEmail
发布者:命名空間: VFP
  
最近當我閱讀一篇關於ASP主題的文章時, 意外地發現用VFP創建電子郵件是如此容易。假如你像我一樣,曾經嚐試過很多種方法,比如說直接請教ISP(互聯網服務提供商),自動化MS Outlook,或是使用第三方工具。 我使用的是來自西風連接工具包的IPStuff.vcx類,它為我好好地工作已經相當長時間了。(譯者注:本人所用的是PowerTCP工具包,也很好用。)不論如何,我真正找到了一個超容易的方法,更讚的是它還提供一些更高級的功能。

為此,您需要有 Windows 2000 和 MS Outlook Express, 盡管我猜測您可能在使用outlook express的替代程序。

微軟包含了一個新的(對我而言極新) COM 對象,以再簡易不過的方式發送電子郵件。
這是精簡版本:

oMSG = createobject("CDO.Message")

** 別忘了把它變成你真正的信息! 
oMSG.To = "jordanbaumgardnerNOMATCH@earthlink.net"
oMSG.From = "jordanbaumgardnerNOMATCH@earthlink.net"
oMSG.Subject = "Hello Email"
oMSG.TextBody = "This is an easy way to create an email"
oMSG.Send()

(譯者注:能夠成功。不過與我用PowerTCP所作的相比,速度還是慢了些。大約十分鐘後才收到信。而PowerTCP幾乎是立等可取。)

在首次使用時我遇到了一些麻煩。CDO.Message利用計算機的缺省電郵配置,命名為Outlook express。 所以您首先要有一個缺省的電郵帳號。

這是帶其他功能的版本:

oMSG = createobject("CDO.Message")

** 別忘了把它變成你真正的信息! 
oMSG.To = "jordanbaumgardnerNOMATCH@earthlink.net"
oMSG.From = "jordanbaumgardnerNOMATCH@earthlink.net"
oMSG.Subject = "Hello Email"
oMSG.AddAttachment(:\myfile.txt?
oMSG.AddAttachment(:\MySecondFile.gif?
oMSG.Send()


這是內嵌入你的網頁的版本:

oMSG = createobject("CDO.Message")

** 別忘了把它變成你真正的信息! 
oMSG.To = "jordanbaumgardnerNOMATCH@earthlink.net"
oMSG.From = "jordanbaumgardnerNOMATCH@earthlink.net"
oMSG.Subject = "Hello Email"
oMSG.CreateMHTMLBody("http://www.cnn.com")
oMSG.Send()


這是在郵件中添加HTML格式的版本:

oMSG = createobject("CDO.Message")

** 別忘了把它變成你真正的信息! 
oMSG.To = "jordanbaumgardnerNOMATCH@earthlink.net"
oMSG.From = "jordanbaumgardnerNOMATCH@earthlink.net"
oMSG.Subject = "Hello Email"
oMSG.HTMLBody = [< b >< P >< FONT COLOR="#CC0000" >Hello In Color< /FONT >< /b >]
oMSG.Send()

我希望它對您也有用。它確實幫助了我節約了太多的時間。

若想得知有關CDO.Message的所有屬性和方法的列表,請訪問:http://msdn.microsoft.com/library/psdk/cdosys/_cdosys_imessage_interface.htm 

若我能幫到您,請用EMAIL與我聯繫:
Jordanbaumgardner@earthlink.net

--------------------------------------------------------------------------------
您能夠用CDO閱讀那些已經存在的郵件嗎?例如,在收件箱中的郵件,CDO讀郵件頭以便知道它來自哪個IP?是的,你能!我上傳了一個文件Mail.zip到fox wiki的ftp站點。 它寫於1997年,也許有些新功能不被支持。文檔在壓縮包內。

http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,40a6327a-44f7-4e98-9e83-cb50c2ebd4c1.aspx

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

提問1:上文提到的微軟的URL 已失效。(我不明白微軟為何還保留孤零的文檔!)請問有誰能夠提供有效的URL(即使是到Jordanbaumgardner@earthlink.net也是發不通的。)

提問2:我用了CDO Mail。它工作得不錯。我只有一個問題,那就是我無法改變郵件的優先級!有誰知道嗎?請賜教!我試了下面的語句,可它們的優先級還是"普通"。

   .Item("urn:schemas:httpmail:importance") = 2
   .Item("urn:schemas:mailheader:importance") = "High"

   .Item("urn:schemas:httpmail:priority") = 1
   .Item("urn:schemas:mailheader:priority") = 1

    .Item("urn:schemas:mailheader:X-MSMail-Priority") = 0
    .Item("urn:schemas:mailheader:X-Priority") = 1


--------------------------------------------------------------------------------
回答2:以下是[b]設置優先級[/b]的辦法。包括了完整的代碼,工作在Win XP SP2+MS Exchange Server 5.5下正常。 其它情況未測試。

LOCAL loConfig AS CDO.Configuration, loFlds AS Object, loMsg AS CDO.Message
loConfig = CREATEOBJECT("CDO.Configuration")
loFlds = loConfig.Fields
WITH loFlds
  *- 設置CDOSYS配置字段,在SMTP服務器上打開端口25
  .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort && 25

  *- 輸入遠端STMP服務器的IP地址或者名稱
  .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "MySMTPServer"

  *- 設定超時
  .Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 10

  *- 發送更新到對象
  .Update()
ENDWITH

*- 創建並發送消息
loMsg = CREATEOBJECT("CDO.Message")
WITH loMsg

  .Configuration = loConfig
  .To = "sample@somedomain.com"
  .From = "sender@mydomain.com"
  .Subject = "This is a test of CDO sending e-mail"
  .HTMLBody = "This is the HTML content of the mail message"

  *- 若需要,設置優先級
  IF tlUrgent
     .Fields("Priority").Value = 1 && -1=低, 0=普通, 1=高
     .Fields.Update()
  ENDIF

  .Send()

Form I n Form解决办法

已经不算什么了,还要钱?我在论坛上发表的东西从不要钱。

其实非常简单,就是在_screen或顶层表单中建立一个form(name:inform),然后在每个其他的form的INIT中加入ACTIVATE WINDOW (this.name) IN WINDOW (inform)

一切OK

 

還有更好的方法

用api Setparent


DECLARE INTEGER SetParent IN user32;
INTEGER hWndChild,;
INTEGER hWndNewParent
hWndChild:-子窗口的句柄,

hWndNewParent -要放入的父窗口句柄
=SetParent(hWndChild,hWndNewParent )

 

 

本方法利用Setparent API 函数

这个函数非常简单,定义如下:

DECLARE INTEGER SetParent IN user32;
INTEGER hWndChild,;
INTEGER hWndNewParent

hWndChild—要处理的表单窗口句柄

hWndNewParent —要放入的父窗口句柄

你可以先建立一个没有标题栏的窗口,用于放其他窗口,并保存其窗口句柄到一个全局变量hWndNewParent

用do form 运行表单后,获得其窗口句柄

然后

=SetParent IN (hWndChild,hWndNewParent )

看看最后的结果吧,你会偷着乐!!

7月9日

用简洁的SQL语句写交叉表

用简洁的SQL语句写交叉表!
http://www.blogcup.com/read_afflaltus_3531.html

SQL交叉表实例

很简单的一个东西,见网上好多朋友问“怎么实现交叉表?”,以下是我写的一个例子,数据库基于SQL SERVER 2000。

-- ======================================================

--交叉表实例

-- ======================================================

建表:

在查询分析器里运行:

CREATE TABLE [Test] (

[id] [int] IDENTITY (1, 1) NOT NULL ,

[name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,

[subject] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,

[Source] [numeric](18, 0) NULL

) ON [PRIMARY]

GO

INSERT INTO [test] ([name],[subject],[Source]) values (N'张三',N'语文',60)

INSERT INTO [test] ([name],[subject],[Source]) values (N'李四',N'数学',70)

INSERT INTO [test] ([name],[subject],[Source]) values (N'王五',N'英语',80)

INSERT INTO [test] ([name],[subject],[Source]) values (N'王五',N'数学',75)

INSERT INTO [test] ([name],[subject],[Source]) values (N'王五',N'语文',57)

INSERT INTO [test] ([name],[subject],[Source]) values (N'李四',N'语文',80)

INSERT INTO [test] ([name],[subject],[Source]) values (N'张三',N'英语',100)

Go




交叉表语句的实现:

--用于:交叉表的列数是确定的

select name,sum(case subject when '数学' then source else 0 end) as '数学',

sum(case subject when '英语' then source else 0 end) as '英语',

sum(case subject when '语文' then source else 0 end) as '语文'

from test

group by name





--用于:交叉表的列数是不确定的

declare @sql varchar(8000)

set @sql = 'select name,'



select @sql = @sql + 'sum(case subject when '''+subject+'''

then source else 0 end) as '''+subject+''','

from (select distinct subject from test) as a



select @sql = left(@sql,len(@sql)-1) + ' from test group by name'

exec(@sql)

go

表单控件自动缩放

控件 nValue 说明

TextBoxEditBox

10

调整父控件大小时,调整被锚定控件的水平大小。*译者注:2+8=10 (左绝对+右绝对)

CommandButton

12

显示两个一组的控件,例如,右下角的 OK 和 Cancel。*译者注:4+8=12 (下绝对+右绝对)

CommandButton

128 和 32

保持命令按钮距离左边和右边的位置。*译者注:128(右相对) & 32(左相对)

CommandButton

260

保持控件中心距离表单底部的位置。*译者注:4+256=260 (下绝对+固定水平大小)

有效控件*译者加

15

随容器放大或缩小控件,控件四边保持与容器四边的绝对距离。1+2+4+8=15

有效控件*译者加

240

随容器放大或缩小控件,控件四边保持与容器四边的相对距离。16+32+64+128=240

个金币值得,又学了一招ANCHOR=240 效果就是比例放大啦

 

我感觉上当啦!

以下内容需要支付 2 个金币方可查看,您已经购买。

首先,在表单的查看类中添加SOLUTION可视类库,该类库位于\Program Files\Microsoft Visual FoxPro 9\Samples\Solution目录下,然后拖放如图的Resizable类到表单,再在表单的RESIZE事件中加入thisform.Resizable1.adjustcontrols(),保存退出。缩放你的表单,哈哈,看到效果了。原来在VFP9中缩放表单控件如此简单啊?我爱VFP。

7月8日

网络较时

这个 Focus.Fll 也很好
集成了 FoxPro 的 2000+ 多个扩展函数
使用简单不加密共享软件

Set Library To Focus.fll

*!* 显示 UTC 原子钟时间
? TIM_CTime( NET_InternetTime( "time.nist.gov" ) )
NET_InternetTime() : Returns the Atomic clock date/time with 1sec accuracy.


*!* 更改系统时间为 Universal Coordinated Time (UTC)
Local nUCTime
Local cUCTime

nUCTime = TIM_time()
cUCTime = TIM_gmt( nUCTime )

? TIM_SetSystemTime( cUCTime )

0

评论Comments