收集PB使用中的一些资料及技巧 PowerBuilder应用服务器SybaseWindows数据结构
程序员文章站
2024-03-22 19:29:40
...
收集PB使用中的一些资料及技巧!
[转]自定义事件ID含义:
Event ID 含义 内容浅析
单选或多选按钮消息(前缀:pbm_bm)
pbm_bmgetcheck 单选按钮或多选按钮是否被选。
pbm_bmgetstate 按钮是否加亮。
pbm_bmsetcheck 将无线按钮或确认框的选中状态改为未选中状态,反之亦然。
pbm_bmsetstate 加亮或不加亮按钮。
pbm_bmchange 改变按钮的风格,例如,改为单选按钮或组合框。
单选或多选按钮通知消息(前缀:pbm_bn)
pbm_bnclicked 按钮控件被点中。
pbm_bndisable 使按钮控件无效。
pbm_bndoubleclicked 按钮控件被双点。
pbm_bndragdrop 一个对象被放到按钮控件。
pbm_bndragenter 一个对象被拖到按钮控件。
pbm_bndragleave 一个对象被拖离按钮控件。
pbm_bndragover 一个对象被拖经按钮控件。
pbm_bnhilite 按钮控件被加亮。
pbm_bnpaint 按钮控件被绘制。
pbm_bnsetfocus 按钮控件获得聚焦。
pbm_bnunhilite 按钮控件不被加亮。
通用对话框消息(前缀:pbm_cb)
pbm_cbaddstring 将字符串加到通用对话框。
pbm_cbdeletestring 从通用对话框删除一个字符串。
pbm_cbdir 加一个目录列表到通用对话框。
pbm_cbfindstring 搜索以一组字符开头的字符串。
pbm_cbfindstringexact 搜索与所提供的字符完全匹配的字符串。
pbm_cbgetcount 列表框中的项数。
pbm_cbgetcursel 当前被选项的数目。
pbm_cbgetdroppedcontrolset 列表框在屏幕上的坐标位置。
pbm_cbgeteditsel 编辑器控件中被选字符的范围。
pbm_cbgetextendedui 缺省或扩展的用户界面。
pbm_cbgetitemdata 重画的列表框中的4字节(32位)项。
pbm_cbgetitemheight 列表框中某一项的高度。
pbm_cbgetlbtext 列表框中的文本。
pbm_cbgetlbtextlen 列表框中文本的长度。
pbm_cbinsertstring 向列表框中增加新的字符串或4字节项。
pbm_cblimittext 限制能被输入到列表框中的字符数。
pbm_cbresetcontent 删除列表框中所有元素。
pbm_cbselectstring 搜索匹配的字符串并显示。
pbm_cbsetcursel 在列表框中选择并显示一项。
pbm_cbseteditsel 在列表框的编辑区域中选择一块文本。
pbm_cbsetextendedui 设置缺省或扩展的用户界面。
pbm_cbsetitemdata 在列表框中设定4字节(32位)项。
pbm_cbsetitemheight 设置列表框中项的高度。
pbm_cbshowdropdown 转换(显示或隐藏)列表框中拖放区域。
通用对话框通知消息(前缀:pbm_cbn)
pbm_cbndblclk 用户在列表中某一项上双点。
pbm_cbndragdrop 一个对象被放到通用对话框控件上。
pbm_cbndragenter 一个对象被拖到通用对话框控件上。
pbm_cbndragleave 一个对象被拖离通用对话框控件。
pbm_cbndragover 一个对象被拖经通用对话框控件。
pbm_cbndropdown 列表框的下放区域即将被显示。
pbm_cbneditchange 编辑器控件中的文本发生变化。
pbm_cbneditupdate 列表框编辑器控件中的文本即将被改变。
pbm_cbnerrspace 列表框满,不能再向其中加入项。
pbm_cbnkillfocus 通用列表框失去聚焦。
pbm_cbnselchange 列表框中被选文本被改变。
pbm_cbnselendcancel 用户按下了"取消"按钮。
pbm_cbnselendok 用户按下了"确认"按钮。
pbm_cbnsetfocus 通用对话控件拥有聚焦。
数据窗口消息(前缀:pbm_dw)
pbm_dwclosedropdown 关闭下拉式数据窗口。
pbm_dwscrollend 在数据窗口中卷滚到最后一行。
pbm_dwscrollhome 在数据窗口中卷滚到第一行。
pbm_dwscrolllineend 卷滚到当前行的行尾(水平方向)。
pbm_dwscrolllinehome 卷滚到当前行的行首(水平方向)。
数据窗口通知消息(前缀:pbm_dwn)
pbm_dwnbacktabout 即将通过Shift+Tab组合键离开该控件。
pbm_dwnchanging 控件即将被改变。
pbm_dwndropdown 下拉式列表框的下拉部分即将可见。
pbm_dwngraphcreate 即将创建图形。
pbm_dwnitemchangefocus 数据窗口控件中当前项的聚焦改变。
pbm_dwnitemvalidationerror 对当前项的修改引起了一个合法性检查错误。
pbm_dwnkey 有键被按下。使用KeyDown()处理键盘值。
pbm_dwnlbuttondown 鼠标左键被按下。
pbm_dwnlbuttonup 鼠标左键被松开。
pbm_dwnmbuttonclk 鼠标中键点击。
pbm_dwnmbuttondbclk 鼠标中键双击。
pbm_dwnmousemove 鼠标移动。
pbm_dwnprintmarginchange 打印边界被改变。
pbm_dwnprocessenter 回车键被按下。
pbm_dwnrowchange 数据窗口中聚焦从一行转向另一行。
pbm_dwntabdownout 用户在数据窗口最后一行按了下箭头键。
pbm_dwntabout 用户在数据窗口的最后一行/列中按了tab键。
pbm_dwntabupout 用户在数据窗口第一行中按了上箭头键。
动态数据交换(DDE)消息(前缀:pbm_dde)
pbm_ddeddeack 收到一个DDE消息。
pbm_ddeddeinitiate 开始一个DDE会话。
pbm_ddeddeterminate 终止一个DDE会话。
编辑器控件消息(前缀:pbm_em)
pbm_emcanundo 编辑器控件是否能撤消上一次修改。
pbm_ememptyundobuffer 清空由Windows管理的取消操作的缓冲区。
pbm_emfmtlines 在多行编辑器控件的行尾增加或删除回车换行。
pbm_emgetfirstvisibleline 返回编辑器控件中可见的第一行的行号。
pbm_emgethandle 获得编辑器控件使用的内存句柄。
pbm_emgetline 从编辑器控件中复制一行到内存中的一个缓冲区。
pbm_emgetlinecount 返回多行编辑器控件的行数。
pbm_emgetmodify 文本是否被用户修改。
pbm_emgetrect 返回控件的长方形域。
pbm_emgetsel 返回被选文本的起始位置。
pbm_emlimittext 限制用户键入的文本长度。
pbm_emlinefromchar 返回被选文本的行号。
pbm_emlineindex 返回编辑器控件中被选行第一个字符在编辑串中的位置。
pbm_emlinelength 返回编辑器控件中被选行中的字符数。
pbm_emlinescroll 水平或垂直卷滚编辑器控件。
pbm_emreplacesel 从剪贴板或从键盘上用新文本替换被选文本。
pbm_emsethandle 设置编辑器控件的句柄指向内存中的一个缓冲区。
pbm_emsetmodify 设置编辑器控件的modified标志。
pbm_emsetpasswordchar 设置用户输入任何文本时显示的字符,在输入密码时的显示。
pbm_emsetrect 设置/重置编辑器控件所在的长方形区域,编辑器控件中的文本被重画。
pbm_emsetrectnp 除了不重画文本,大致与setrect相同。
pbm_emsetsel 选择字符。
pbm_emsettabstops 在多行编辑器控件中设置tabstops。
pbm_emsetwordbreak 设置新的词拆分函数。
pbm_emsetwordbreakproc 设置新的词拆分过程。
pbm_emundo 撤消最近的编辑操作。
编辑控件通知消息(前缀:pbm_en)
pbm_enchange 编辑器控件中的文本发生改变。
pbm_enerrspace 编辑器控件内存缓冲区溢出。
pbm_enhscroll 用户点中上水平卷滚条。
pbm_enmaxtext 用户试图输入比允许更多的文本。
pbm_enupdate 编辑器控件即将显示用户的修改。
pbm_envscroll 用户点中了垂直卷滚条。
列表框消息(前缀:pbm_lb)
pbm_lbaddstring 向列表框控件中增加一项或一个字符串。
pbm_lbdeletestring 从列表框中删除一项或一个字符串。
pbm_lbdir 用目录列表填充列表框。
pbm_lbfindstring 在列表框中搜索与所给字符串部分匹配的第一项。
pbm_lbfindstringexact 在列表框中搜索与所给字符串精确匹配的第一项。
pbm_lbgetcaretindex 在列表框中搜索拥有聚焦的项。
pbm_lbgetcount 确定列表框中的项数。
pbm_lbgetcursel 确定所选项是第几项。
pbm_lbgethorizontalextent 获得列表框的宽度、计算水平卷滚。
pbm_lbgetitemheight 确定列表框控件中项的高度。
pbm_lbgetitemrect 确定列表框的尺寸。
pbm_lbgetsel 获得列表框中当前所选的项。
pbm_lbgetselcount 在多选列表框中获得所选项的数目。
pbm_lbgetselitems 用列表框中表框各自的项号填充一个给定的整数数组。
pbm_lbgettext 获得列表框中当前所选项的文本。
pbm_lbgettextlen 获得列表框中当前所选项的文本中的字符数。
pbm_lbgettopindex 确定列表框中可见的最上面一项的项号。
pbm_lbinsertstring 向列表框中加入一个新字符串。
pbm_lbresetcontent 重置(消除)列表框中的内容。
pbm_lbselectstring 搜索并加亮与所给字符匹配的字符串。
pbm_lbselitemrange 选择/取消列表框中某一范围中的项。
pbm_lbsetcaretindex 设置列表框中的某一项拥有聚焦。
pbm_lbsetcolumnwidth 设置列表框中列的宽度。
pbm_lbsetcursel 在列表框中选择并加亮一项;如果需要,卷滚到列表框。
pbm_lbsethorizontaltext 设置列表框中被水平卷滚的单元数。
pbm_lbsetitemdata 设置与列表框相关的32位/4字节值。
pbm_lbsetitemheight 设置列表框中项的高度。
pbm_lbsetsel 在列表框中选择一个字符串。
pbm_lbsettabstops 设置列表框控件中tabstops的位置。
pbm_lbsettopindex 卷滚列表框使特定的项成为可见的最上面一项。
列表框通知消息(前缀:pbm_en)
pbm_endblclk 用户在列表框控件中的某一项上双击。
pbm_enerrspace 用户试图超越可在列表框中输入字符的最大限制。
pbm_enselcancel 当前选取文本被取消。
pbm_enselchange 用户在列表框中选择或取消了一项。
窗口消息(前缀:pbm_)
pbm_activateapp 被激活的窗口属于另外一个应用。
pbm_askcbformatname 要求剪贴板中的内容被复制到一个使用自定义格式的文本缓冲区中。
pbm_char 传送键盘上按下的键。
pbm_chartoitem 通过转换键盘来的字符,帮助列表框定位其中的项。
pbm_childactivate 一个子窗口被移动或激活。
pbm_clear 用户要删除当前编辑器控件中的内容。
pbm_command 用户选择了一个菜单项、控件,或使用了加速键。
pbm_compacting 系统内存资源不足;当Windows占用了多于1/8的CPU时间紧缩内存时,产生这条消息。
pbm_compareitem 当新的一项被加入列表框或组合框时产生此消息,Window用这条消息进行项之间的比较。
pbm_ctlcolor 一个控件即将被画出,可在此时改变控件的颜色。
pbm_deadchar 用户选择了一种非英语字符集或其它特殊字符集,这将改变下面将要输入的字符。
pbm_deleteitem 从列表框或通用对话框中移去一项。
pbm_destroyclipboard 剪贴板内容被清除。
pbm_devmodechanged WIN.INI中的一个设备名被修改。
pbm_drawclipboard 剪贴板内容发生改变。
pbm_drawitem 列表框或通用对话框的一项内容被改变。
pbm_dropfiles 当鼠标左键在一个注册为拖放文件接受器的应用上释放时,发出该消息。
pbm_erasebkgnd 窗口的客户区需要重画。
pbm_fontchange 应用可用的字体数改变。
pbm_getdlgcode 通知消息,说明当前使用哪种类型的键盘。
pbm_getfont 获取当前激活的字体。
pbm_getminmaxinto Windows正在检查最小化或最大化窗口的尺寸。
pbm_gettext 从一个控件(如按钮或编辑器控件)中复制文本到一个内存缓冲区。
pbm_gettextlength 用来确定一个控件中的字符数。
pbm_hscrollclipboard 剪贴板的水平卷滚条被使用。
pbm_iconerasebkgnd 一个最小化窗口需要重化背景。
pbm_initdialog 一个对话框即将被显示。
pbm_initmenu 一个菜单即将被显示。
pbm_initmenupopup 一个弹出式窗口即将被显示。
pbm_keydown 键盘上的一个键被按下。
pbm_keyup 键盘上的一个键被释放。
pbm_mdiactive 一个MDI子窗口(表单)被激活。
pbm_mdicascade 以重叠的形式重排所有的表单。
pbm_mdicreate 创建一个表单。
pbm_mdidestroy 从MDI框架中移去一个表单。
pbm_mdigetactive 获得当前活动的MDI表单的句柄。
pbm_mdiiconrange 在一个MDI框架中重排最小化表单的图标。
pbm_mdimaximize 最大化一个MDI子表单。
pbm_mdinext 激活下一个MDI表单(紧接着活动表单的表单)。
pbm_mdirestore 把MDI表单恢复到它原来的大小。
pbm_mdisetmenu 将一个菜单与一个MDI表单联系起来。
pbm_mdifitle 平铺所有的MDI表单。
pbm_measureitem 这个消息被送给即将创建的、内有按钮或其它控件的窗口。
pbm_menuchar 用户使用了一个快捷键,但系统不支持该快捷键。
pbm_menuselect 用户选择了一个菜单项。
pbm_mouseactivate 用户在一个非活动窗口中点击了鼠标。
pbm_mousemove 用户移动了鼠标。
pbm_ncactivate 窗口的非客户区即将被激活。
pbm_nccalcsize 窗口的尺寸需要重新计算。
pbm_nccreate 窗口即将创建它的非客户区。
pbm_ncdestroy 窗口的非共享区被析构。
pbm_nchittest 每次非客户区被移动时都发送该消息。
pbm_nclbuttondblclk 用户在非客户区双点了鼠标左键。
pbm_ncpaint 非客户需要画出。
pbm_nextdlgctl 在对话框中将聚焦转给另一个控件。
pbm_paint 窗口的客户区需要被画出。
pbm_paintclipboard 剪贴板应用有剪贴操作,剪贴板查看器需重画。
pbm_palettechanged 系统调色板被改变。
pbm_paletteischanging 系统调色板即将被改变。
pbm_parentnotify 通知父窗口一个子窗口即将被创建。
pbm_querydragicon 用户要拖一个最小化窗口。
pbm_queryendsession 通知消息,说明窗口即将被关闭。
pbm_querynewpalette 应用即将收到输入聚焦,应该执行必要的颜色调整。
pbm_queryopen 一个最小化窗口即将被恢复。
pbm_quit 应用处理的最后一个消息。
pbm_renderallformats 通知一个剪贴板格式的拥有者,应用将失去所有的格式。
pbm_renderformats 通知消息,说明放在剪贴板中的数据应该用一种特殊格式传送。
pbm_setcursor 通知消息,说明鼠标指针在一个窗口中移动。
pbm_setfont 用来在对话框中改变字体。
pbm_setredraw 在加一个新项之前发送给列表框或通用对话框。
pbm_settext 用来改变窗口的标题或文本。
pbm_sizeclipboard 剪贴板查看器应用改变尺寸。
pbm_spoolerstatus 一个打印管理器任务被添加或删除。
pbm_syschar <ALT>键和其它某键同时被按下。
pbm_syscolorchange 一种或多种系统颜色被改变。
pbm_syscommand 用户选择了一个系统菜单命令。
pbm_sysdeadchar 通知消息,说明一种非英语字符集被选定。
pbm_syskeydown 用户按下某键的同时按下了<ALT>键。
pbm_syskeyup 用户释放了<ALT>组合键。
pbm_timechange 系统时钟被修改。
pbm_undo 从undo缓冲区复制文本到编辑器控件。
pbm_vkeytoitem 当一个列表框拥有聚焦时,用户按下了一个键。
pbm_vscroll 用户点击了垂直卷滚条。
pbm_vscrollclipboard 剪贴板查看器的垂直卷滚条被点击。
pbm_windowposchanged 窗口位置发生改变。
pbm_windowposchanging 窗口位置即将发生改变。
pbm_wininichange WIN.INI文件被修改。
[转]SHELL 命令
1.命令: rundll32.exe shell32.dll,Control_RunDLL
功能: 显示控制面板
2.命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1
功能: 显示“控制面板->辅助选项->键盘”选项视窗
3.命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2
功能: 显示“控制面板->辅助选项->声音”选项视窗
4.命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,3
功能: 显示“控制面板->辅助选项->显示”选项视窗
5.命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,4
功能: 显示“控制面板->辅助选项->鼠标”选项视窗
6.命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,5
功能: 显示“控制面板->辅助选项->常规”选项视窗
7.命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @1
功能: 执行“控制面板->添加新硬件”向导。
8.命令: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL AddPrinter
功能: 执行“控制面板->添加新打印机”向导。
9.命令: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,1
功能: 显示 “控制面板->添加/删除程序->安装/卸载” 面板。
10.命令: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,2
功能: 显示 “控制面板->添加/删除程序->安装Windows” 面板。
11.命令: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,3
功能: 显示 “控制面板->添加/删除程序->启动盘” 面板。
12.命令: rundll32.exe syncui.dll,Briefcase_Create
功能: 在桌面上建立一个新的“我的公文包”。
13.命令: rundll32.exe diskcopy.dll,DiskCopyRunDll
功能: 显示复制软盘视窗
14.命令: rundll32.exe apwiz.cpl,NewLinkHere %1
功能: 显示“建立快捷方式”的对话框,所建立的快捷方式的位置由%1参数决定。
15.命令: rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,0
功能: 显示“日期与时间”选项视窗。
16.命令: rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,1
功能: 显示“时区”选项视窗。
17.命令: rundll32.exe rnaui.dll,RnaDial [某个拨号连接的名称]
功能: 显示某个拨号连接的拨号视窗。如果已经拨号连接,则显示目前的连接状态的视窗。
18.命令: rundll32.exe rnaui.dll,RnaWizard
功能: 显示“新建拨号连接”向导的视窗。
19.命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0
功能: 显示“显示属性->背景”选项视窗。
20.命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1
功能: 显示“显示属性->屏幕保护”选项视窗。
21.命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,2
功能: 显示“显示属性->外观”选项视窗。
22.命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3
功能: 显示显示“显示属性->属性”选项视窗。
23.命令: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL FontsFolder
功能: 显示Windows的“字体”文件夹。
24.命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @3
功能: 同样是显示Windows的“字体”文件夹。
25.命令: rundll32.exe shell32.dll,SHformatDrive
功能: 显示格式化软盘的对话框。
26.命令: rundll32.exe shell32.dll,Control_RunDLL joy.cpl,,0
功能: 显示“控制面板->游戏控制器->常规”选项视窗。
27.命令: rundll32.exe shell32.dll,Control_RunDLL joy.cpl,,1
功能: 显示“控制面板->游戏控制器->高级”选项视窗。
28.命令: rundll32.exe mshtml.dll,PrintHTML (HTML文档)
功能: 打印HTML文档。
29.命令: rundll32.exe shell32.dll,Control_RunDLL mlcfg32.cpl
功能: 显示Microsoft Exchange常规选项视窗。
30.命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @0
功能: 显示“控制面板->鼠标” 选项 。
31.命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @1
功能: 显示 “控制面板->键盘属性->速度”选项视窗。
32.命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @1,,1
功能: 显示 “控制面板->键盘属性->语言”选项视窗。
33.命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @2
功能: 显示Windows“打印机”文件夹。
34.命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @3
功能: 显示Windows“字体”文件夹。
35.命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @4
功能: 显示“控制面板->输入法属性->输入法”选项视窗。
36.命令: rundll32.exe shell32.dll,Control_RunDLL modem.cpl,,add
功能: 执行“添加新调制解调器”向导。
37.命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,0
功能: 显示“控制面板->多媒体属性->音频”属性页。
38.命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,1
功能: 显示“控制面板->多媒体属性->视频”属性页。
39.命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,2
功能: 显示“控制面板->多媒体属性->MIDI”属性页。
40.命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,3
功能: 显示“控制面板->多媒体属性->CD音乐”属性页。
41.命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,4
功能: 显示“控制面板->多媒体属性->设备”属性页。
42.命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @1
功能: 显示“控制面板->声音”选项视窗。
43.命令: rundll32.exe shell32.dll,Control_RunDLL netcpl.cpl
功能: 显示“控制面板->网络”选项视窗。
44.命令: rundll32.exe shell32.dll,Control_RunDLL odbccp32.cpl
功能: 显示ODBC32资料管理选项视窗。
45.命令: rundll32.exe shell32.dll,OpenAs_RunDLL {drive:\path\filename}
功能: 显示指定文件(drive:\path\filename)的“打开方式”对话框。
46.命令: rundll32.exe shell32.dll,Control_RunDLL password.cpl
功能: 显示“控制面板->密码”选项视窗。
47.命令: rundll32.exe shell32.dll,Control_RunDLL powercfg.cpl
功能: 显示“控制面板->电源管理属性”选项视窗。
48.命令: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL PrintersFolder
功能: 显示Windows“打印机”文件夹。(同rundll32.exe shell32.dll,Control_RunDLL main.cpl @2)
49.命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0
功能: 显示“控制面板->区域设置属性->区域设置”选项视窗。
50.命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,1
功能: 显示“控制面板->区域设置属性->数字”选项视窗。
51.命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,2
功能: 显示“控制面板->区域设置属性->货币”选项视窗。
52.命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,3
功能: 显示“控制面板->区域设置属性->时间”选项视窗。
53.命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,4
功能: 显示“控制面板->区域设置属性->日期”选项视窗。
54.命令: rundll32.exe desk.cpl,InstallScreenSaver [屏幕保护档案名]
功能: 将指定的屏幕保护文件设置为Windows的屏保,并显示屏幕保护属性视窗。
55.命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,0
功能: 显示“控制面板->系统属性->传统”属性视窗。
56.命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,1
功能: 显示“控制面板->系统属性->设备管理器”属性视窗。
57.命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,2
功能: 显示“控制面板->系统属性->硬件配置文件”属性视窗。
58.命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,3
功能: 显示“控制面板->系统属性->性能”属性视窗。
59.命令: rundll32.exe user.exe,restartwindows
功能: 强行关闭所有程式并重启机器。
60.命令: rundll32.exe user.exe,exitwindows
功能: 强行关闭所有程式并关机。
61.命令: rundll32.exe shell32.dll,Control_RunDLL telephon.cpl
功能: 显示“拨号属性”选项视窗。。
62.命令: rundll32.exe shell32.dll,Control_RunDLL themes.cpl
功能: 显示“桌面主题”选项面板。
转:如何提高SQL语言的查询效率?
由于SQL是面向结果而不是面向过程的查询语言,所以一般支持SQL语言的大型关系型数据库都使用一个基于查询成本的优化器,为即时查询提供一个最佳的执行策略。对于优化器,输入是一条查询语句,输出是一个执行策略。
一条SQL查询语句可以有多种执行策略,优化器将估计出全部执行方法中所需时间最少的所谓成本最低的那一种方法。所有优化都是基于用记所使用的查询语句中的where子句,优化器对where子句中的优化主要用搜索参数(Serach Argument)。
搜索参数的核心思想就是数据库使用表中字段的索引来查询数据,而不必直接查询记录中的数据。
带有 =、<、<=、>、>= 等操作符的条件语句可以直接使用索引,如下列是搜索参数:
emp_id = "10001" 或 salary > 3000 或a =1 and c = 7
而下列则不是搜索参数:
salary = emp_salary 或 dep_id != 10 或 salary * 12 >= 3000 或 a=1 or c=7
应当尽可能提供一些冗余的搜索参数,使优化器有更多的选择余地。请看以下3种方法:
第一种方法:
select employee.emp_name,department.dep_name from department,employee where (employee.dep_id = department.dep_id) and (department.dep_code='01') and (employee.dep_code='01');
它的搜索分析结果如下:
Estimate 2 I/O operations
Scan department using primary key
for rows where dep_code equals '01'
Estimate getting here 1 times
Scan employee sequentially
Estimate getting here 5 times
第二种方法:
select employee.emp_name,department.dep_name from department,employee where (employee.dep_id = department.dep_id) and (department.dep_code='01');
它的搜索分析结果如下:
Estimate 2 I/O operations
Scan department using primary key
for rows where dep_code equals '01'
Estimate getting here 1 times
Scan employee sequentially
Estimate getting here 5 times
第一种方法与第二种运行效率相同,但第一种方法最好,因为它为优化器提供了更多的选择机会。
第三种方法:
select employee.emp_name,department.dep_name from department,employee where (employee.dep_id = department.dep_id) and (employee.dep_code='01');
这种方法最不好,因为它无法使用索引,也就是无法优化……
使用SQL语句时应注意以下几点:
1、避免使用不兼容的数据类型。例如,Float和Integer,Char和Varchar,Binary和Long Binary不兼容的。数据类型的不兼容可能使优化器无法执行一些本可以进行的优化操作。例如:
select emp_name form employee where salary > 3000;
在此语句中若salary是Float类型的,则优化器很难对其进行优化,因为3000是个整数,我们应在编程时使用3000.0而不要等运行时让DBMS进行转化。
2、尽量不要使用表达式,因它在编绎时是无法得到的,所以SQL只能使用其平均密度来估计将要命中的记录数。
3、避免对搜索参数使用其他的数学操作符。如:
select emp_name from employee where salary * 12 > 3000;
应改为:
select emp_name from employee where salary> 250;
4、避免使用 != 或 <> 等这样的操作符,因为它会使系统无法使用索引,而只能直接搜索表中的数据。
转:键码常数值描述
vbKeyLButton 1 鼠标左键
vbKeyRButton 2 鼠标右键
vbKeyCancel 3 CANCEL 键
vbKeyMButton 4 鼠标中键
vbKeyBack 8 BACKSPACE 键
vbKeyTab 9 TAB 键
vbKeyClear 12 CLEAR 键
vbKeyReturn 13 ENTER 键
vbKeyShift 16 SHIFT 键
vbKeyControl 17 CTRL 键
vbKeyMenu 18 菜单键
vbKeyPause 19 PAUSE 键
vbKeyCapital 20 CAPS LOCK 键
vbKeyEscape 27 ESC 键
vbKeySpace 32 SPACEBAR 键
vbKeyPageUp 33 PAGEUP 键
vbKeyPageDown 34 PAGEDOWN 键
vbKeyEnd 35 END 键
vbKeyHome 36 HOME 键
vbKeyLeft 37 LEFT ARROW 键
vbKeyUp 38 UP ARROW 键
vbKeyRight 39 RIGHT ARROW 键
vbKeyDown 40 DOWN ARROW 键
vbKeySelect 41 SELECT 键
vbKeyPrint 42 PRINT SCREEN 键
vbKeyExecute 43 EXECUTE 键
vbKeySnapshot 44 SNAP SHOT 键
vbKeyInser 45 INS 键
vbKeyDelete 46 DEL 键
vbKeyHelp 47 HELP 键
vbKeyNumlock 144 NUM LOCK 键
A 键到 Z 键与其 ASCII 码的相应值'A' 到 'Z' 是一致的
常数 值 描述
vbKeyA 65 A 键
vbKeyB 66 B 键
vbKeyC 67 C 键
vbKeyD 68 D 键
vbKeyE 69 E 键
vbKeyF 70 F 键
vbKeyG 71 G 键
vbKeyH 72 H 键
vbKeyI 73 I 键
vbKeyJ 74 J 键
vbKeyK 75 K 键
vbKeyL 76 L 键
vbKeyM 77 M 键
vbKeyN 78 N 键
vbKeyO 79 O 键
vbKeyP 80 P 键
vbKeyQ 81 Q 键
vbKeyR 82 R 键
vbKeyS 83 S 键
vbKeyT 84 T 键
vbKeyU 85 U 键
vbKeyV 86 V 键
vbKeyW 87 W 键
vbKeyX 88 X 键
vbKeyY 89 Y 键
vbKeyZ 90 Z 键
0 键到 9 键与其 ASCII 码的相应值 '0' 到 '9' 是一致的
常数 值 描述
vbKey0 48 0 键
vbKey1 49 1 键
vbKey2 50 2 键
vbKey3 51 3 键
vbKey4 52 4 键
vbKey5 53 5 键
vbKey6 54 6 键
vbKey7 55 7 键
vbKey8 56 8 键
vbKey9 57 9 键
数字小键盘上的键
常数 值 描述
vbKeyNumpad0 96 0 键
vbKeyNumpad1 97 1 键
vbKeyNumpad2 98 2 键
vbKeyNumpad3 99 3 键
vbKeyNumpad4 100 4 键
vbKeyNumpad5 101 5 键
vbKeyNumpad6 102 6 键
vbKeyNumpad7 103 7 键
vbKeyNumpad8 104 8 键
vbKeyNumpad9 105 9 键
vbKeyMultiply 106 乘号 (*) 键
vbKeyAdd 107 加号 (+) 键
vbKeySeparator 108 ENTER 键(在数字小键盘上)
vbKeySubtract 109 减号 (-) 键
vbKeyDecimal 110 小数点 (.) 键
vbKeyDivide 111 除号 (/) 键
功能键
常数 值 描述
vbKeyF1 112 F1 键
vbKeyF2 113 F2 键
vbKeyF3 114 F3 键
vbKeyF4 115 F4 键
vbKeyF5 116 F5 键
vbKeyF6 117 F6 键
vbKeyF7 118 F7 键
vbKeyF8 119 F8 键
vbKeyF9 120 F9 键
vbKeyF10 121 F10 键
vbKeyF11 122 F11 键
vbKeyF12 123 F12 键
vbKeyF13 124 F13 键
vbKeyF14 125 F14 键
vbKeyF15 126 F15 键
vbKeyF16 127 F16 键
PowerBuilder 7.0 运行库文件
File Name Purpose Runtime Development
PBADD70.DLL Utilities (Profiler, DWSyntax, etc) No Yes
PBAPL70.DLL Application Painter & Project Painter No Yes
PBCGB70.DLL Code Generation 1 No Yes
PBCGC70.DLL Code Generation Compiler 1 No Yes
PBCGL70.DLL Code Generation Linker 1 No Yes
PBCGR70.DLL Code Generation Resource Compiler 1 No Yes
PBCGS70.DLL Code Generation 1 No Yes
PBCH70.DLL Machine code generation No Yes
PBCMP70.DLL Compiler No Yes
PBCOM70.DLL COM Generator No Yes
PBCPP70.DLL C++ Generator No Yes
PBDEV70.DLL Shared Development Utilities No Yes
PBDIR70.DLL DirectConnect Database Driver Optional Optional
PBDPP70.DLL Pipeline Painter No Yes
PBDTS70.DLL Table/Database Painter No Yes
PBDWE70.DLL DataWindow Engine Yes Yes
PBDWO70.DLL DataWindow Objects for Painters No Yes
PBDWP70.DLL DataWindow Painter No Yes
PBDWR70.DLL HTML DataWindow Optional No
PBGEN70.DLL Application Template No Yes
PBIN770.DLL Informix 7 Database Driver Optional Optional
PBIN970.DLL Informix 9 Database Driver Optional Optional
PBISA70.DLL MS Internet InfoServices API Optional No
PBJAG70.DLL Jaguar Interfaces – required on server Optional No
PBJCG70.DLL Jaguar Interfaces No Yes
PBJDC70.DLL Jaguar Interfaces No Yes
PBJDM70.DLL Microsoft JDBC Database Driver Optional Optional
PBJDS70.DLL Sun JDBC Database Driver Optional Optional
PBJPG70.DLL Jaguar Component Generator No Yes
PBJPX70.DLL Jaguar Proxy Generator No Yes
PBLIB70.DLL Library Painter No Yes
PBMSS70.DLL Microsoft SQLServer Database Driver Optional Optional
PBNS170.DLL WEB.PB Netscape API Version 1 Optional No
PBNS270.DLL WEB.PB Netscape API Version 2 Optional No
PBNS370.DLL WEB.PB Netscape API Version 3 Optional No
PBO7370.DLL Oracle 7.3 Database Driver Optional Optional
PBO8470.DLL Oracle 8.04 Database Driver Optional Optional
PBODB70.DLL ODBC Database Driver Optional Optional
File Name Purpose Runtime Development
PBOGR70.DLL Registry Utility No Yes
PBOLE70.DLL OLE DB Database Driver Optional Optional
PBOR870.DLL Oracle 8 Database Driver Optional Optional
PBORC70.DLL ORCA interface No No
PBPRX70.DLL Proxy Generator No Yes
PBRTC70.DLL Rich Text Control Optional Yes
PBSCC70.DLL SCC Source Control Driver No Optional
PBSCR70.DLL Script Painter & Debugger No Yes
PBSQL70.DLL SQL Painter & Query Painter No Yes
PBSYC70.DLL Sybase ASE Database Driver Optional Optional
PBSYD70.DLL UNIX Sybase Database Driver Optional Optional
PBSYJ70.DLL Jaguar Sybase ASE Database Driver Optional No
PBSYS70.DLL System Utility No Yes
PBTRA70.DLL Database Trace Utility (pbtrace.log) Optional Optional
PBUDO70.DLL User Object Painter & Menu Painter No Yes
PBVM70.DLL Virtual Machine Yes Yes
PBWED70.DLL Script Editor 2 No Yes
PBWEI70.DLL Script Editor 2 No Yes
PBWEP70.DLL Script Editor 2 No Yes
PBWES70.DLL Script Editor 2 No Yes
PBWIZ70.DLL Start Wizards No Yes
PBWPB70.DLL Web PB Wizard No Yes
PSDWC70.CAB DataWindow Web ActiveX Optional No
pbapl70.dll 应用画笔
pbbgr70.dl 商业图形引擎
pbcgc70.dll 编译代码
pbcgl.dll 链接代码
pbcgr.dll资源编译
pbch70.dll 头文件
pbcmp70.dll powerscript编译器
pbctl70.dll 窗口/报表和用户自定义对象画板
pbdpp70.dll 分布式powerbuilder
pbdts70.dll数据库画板工具
pbdwe70.dll数据窗口引擎
pbdwo70.dll数据窗口对话框
pbdwp70.dll数据窗口画板
pbgen70.dll应用模板
pbin970.dllinformix 数据库接口
pblib70.dll库画板和浏览器
pbmss70.dllms sql server数据库接口
pbodb70.dllodbc数据库接口
pborc70.dll orcle数据库接口
pbrtc70.dll rtf支持软件
pbscr70.dll script画板
pbsql70.dll sql画板
pbsyc70.dll sybase数据库接口
pbsys70.dll 开发系统
pbtra70.dll 数据库接口
pbudo70.dll 用户对象画板
pbwed70.dll 编辑器
pbwei70.dll 编辑器的自动缩进
pbwep70.dll 编辑器的powerscript颜色
pbwes70.dll 编辑器的sql颜色
在PB中用OLE存取blob类型数据
--------------------------------------------------------------------------------
前言:在数据库的开发过程中,经常需要在数据库中存储一些备注信息,而这些备注信息的内容一般较大,格式多样-如有可能是语音文件、视频文件、图片文件、文本文件等,怎样在PB中实现这些格式不同的备注文件的存取及预览,一直是PB开发人员比较关心的一个问题,本文系统的介绍了三种存取备注二进制信息的方法。
对备注二进制信息的存储可以采用以下三种方式;
方法一:文件保存在固定的路径下,数据库中存取文件路径和名称
方法二:数据库中用blob类型或者varbinary类型字段存储备注文件
方法三:在本地用OLE存储结构存储备注文件
1、OLE的基本概念
OLE是Object Linking Embedding(对象链结与嵌入)的缩写,它可以使windows应用程序共享数据和程序。
2、OLE控件
在PB中OLE控件是一个OLE对象的包容器,可以使用服务器应用程序提供的功能和命令来编辑对象,也可以使用自动化OLE交互,在程序中激活对象和向服务器应用程序发送命令;在PB 的window画板中的OLE控件允许用户从多个应用程序嵌入和链结组件
2.1建立和设置OLE控件
从window画板中选择OLE控件插入window。
当建立一个OLE控件并且插入一个对象时,PB将激活服务器应用程序以允许对对象进行编辑和修改;在使OLE中的对象称为非活动状态后,可以使用控件属性选项卡来设置控件的属性。
2.2 激活修改window画板中的OLE对象
在OLE控件的弹出菜单中选择open可以激活画板中OLE对象
使用服务器应用程序修改OLE对象
结束修改:使对象恢复为非活动状态,只要单击服务器应用对象之外的任何区域即可,也可以直接关闭服务器应用程序的窗口。
2.3 嵌入和链结OLE控件
可以将OLE对象嵌入或者链结到自己的应用程序中。嵌入对象的数据放在应用程序中,在开发过程中这些数据放在应用程序的PBl库中,当生成应用后,这些数据将存放在exe或PBd文件中,虽然在程序的运行过程中可以修改,但修改的数据不会保存;链结对象的数据存放在PB应用程序以外,当链结一个对象时,在PB应用程序中不存放数据文件,而是存放引用数据的指针, 使用链结的数据,对数据的管理和保存都由服务器应用程序负责。这样可以用服务器应用程序修改处理数据,处理后的数据可以保存回原文件中。链结方式应用于需要多个应用程序共享的数据文件,任何一个应用程序修改了数据文件,都将影响到所有链结该文件的应用程序。
2.4 OLE控件的激活方式
OLE控件的激活方式有offsite和in-place两种激活方式,offsite激活方式是指在PB应用程序的界面以外单独打开OLE对象,in-place激活方式是指PB应用程序的界面的原位置打开OLE对象。在数据窗口中的dbOLE默认的是offsite激活方式,而window中的OLE默认的激活方式是in-place。
在PB应用程序中可以用命令
OLE_control.active(offsite) 或者OLE_control.active(in-place)设置OLE对象的以何种方式打开。
2.5 设置和插入OLE对象
在程序运行时可以用函数:
OLE_control.insertfile(soucefile) 插入对象
OLE_control.objectdata = blobvar 设置对象
3、OLE存储
3.1 OLE存储(OLEstorage)的概念
OLE存储(OLEstorage)是OLE数据的一个仓库,存储就象磁盘上的目录结构,它可以是一个OLE对象,也可以包含在OLE对象中,每个对象都包含在OLE存储或者存储内的子存储内。保存在OLE存储中数据称作OLE流(OLE stream),OLE流同OLE对象的关系就象文件同目录的关系。含有OLE对象的存储或子存储可以看做是属于特殊服务器的信息,在该层次之下的各部分都可以被相应的服务器程序操作。OLE存储对象是类用户对象,可以说明相应类型的变量,建立与之相应的实例和打开存储等,在使用完存储后需要关闭存储、释放分配的内存。
3.2 OLE存储的打开和保存
OLE存储可以用open函数打开,open函数的格式为:
Olecontrol.Open(OLEsourcefile),
此函数在OLEsourcefile不存在时,自动创建该文件,所以创建OLE文件也用该函数; OLE存储可以用save函数保存,save函数的格式为:
OLEcontrol.save() // 保存OLE控件
OLEstorage.save() //保存OLE存储
4、处理blob类型数据
对于大二进制数据,在PB Script中是用blob数据类型表示并加以处理。标准SQL语句中的select、insert和update语句无法直接查询blob类型的数据,在PB中操作blob类型的数据只能用专用的语句,从数据库中查询blob类型的数据的命令是:
selectblob restofselectstatement {using transactionobject};
更新数据库中blob类型数据的格式是:
updateblob tablename
set blobcolumn = blobvarible
restofupatestatement {using transctionobject};
如连接的数据库是sybase或者Sql,则selectblob和updateblob语句要求数据库的自动提交方式为true,所以在在每次调用selectblob和updateblob语句以前必须用命令 Sqlca.autocommit=true,把数据库的自动提交方式设置为true,在updateblob语句的结束后,再用命令Sqlca.autocommit = false,把自动提交方式设置为false。 索数据的参数(如flag),然后在可修改列的Protect后的框中输入(user_name是该DataWindow中的一列,代表输入者的名称):
5、数据窗口的blob列
5.1 数据窗口blob列的功能
在PB 的datawindow画板中DBOLE控件允许用户利用这个控件浏览和操作数据库中的大二进制数据,即通过DBOLE控件可以作如下操作:
往数据库中存储大二进制数据,如:excel工作表、word文档、视频文件、图片文件等各种格式的文件;
● 从数据库中检索数据到datawindow对象;
● 使用OLE服务器程序察看修改数据;
● 将修改后的数据保存回数据库;
5.2 在数据窗口中添加blob列的的步骤
1) 选择具有二进制字段的数据表作为数据源建立一新的数据窗口(该窗口可以至少需要包含非数据库表的标识列)
2) 选择insert -control-OLE database blob 菜单,在数据窗口的detail节中要插入blob列的位置单击鼠标,这时将显示如图1所示的对话框
下面解释这些属性的具体含义
1) client class: 客户类名,默认为datawindow
2) client name:客户名,默认为untitled
3) table: 选择含有blob列的数据库表,所选表的字段将出现在右侧的large binary/text column列表框中。
4) large binary/text column:选择一个blob类型的字段列
5) key clause:检索和更新blob数据的关键字表达式其中使用带冒号前缀的变量指出是数据窗口对象的列,如 表达式 id=:id,id是数据库表中的列,变量指出数据窗口对象的列
6) filetemplate :如果需要OLE应用服务器每次打开相同的文件,则在filetemplate框中输入文件名。
7) OLE class :如果不需要OLE应用服务器每次打开相同的文件,则在OLE class框中选择一个OLE类,如Pbrush。
8) Client name expression:显示在OLE服务器应用程序窗口标题的文字,可以输入为:"对应记录的id号是"+id
单击ok按钮关闭对话框,将dbole列添加到适当的位置,保存数据窗口。 预览则可以对数据库中的blob数据进行存取,但是在新建的记录中只能存取OLE class框中选择的一种格式的blob数据,不能存储多种格式的数据;但如果数据库中存有多种格式的数据,可以预览各种格式的数据。
6、源程序建立
1) 首先在数据库中建立如下结构的表blobsave:
字段名称数据类型备注
idchar(4)primairy key index
s_pathchar(50)
pic binary (50)
2) 在PB建立PBl库blobsave.PBl
3) 在PBl库blobsave.PBl中建立应用blobsave
在应用的open事件中设置数据库连接程序(本程序中采用的是odbc方式连接数据库,读者可根据自己所建立的数据库的不同选用不同的连接方式,以下连接数据库的代码也有所改动,至于连接不同的数据库的方法,请参考有关资料,本文不做详细介绍):
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "Connectstring='DSN=blob'"
connect;
open(w_main)
其中命令按钮cb_path的clicked中的代码格式如下:open(w_path)
其中命令按钮cb_dbblob的clicked中的代码格式如下:open(w_dbblob)
其中命令按钮cb_OLEblob的clicked中的代码格式如下:open(w_OLEblob)
4) 建立数据窗口dw_blobsave
按照上文中建立数据窗口的blob列的方法建立数据窗口dw_blobsave如图所示:
其中:add,del,save,cancel,,retrieve等分别为数据窗口dw_blobsave的append row,delete row,update,retrieve动作按钮。
首先创建实例变量 OLEstorage stor1
然后如图建立窗口w_path,其中数据窗口控件dw_1的rowfocuschanged中的代码如下:
long row_num
row_num=dw_1.getrow()
if row_num >0 then
ole_1.insertfile(dw_1.object.s_path[row_num])
end if
其中数据窗口dw_1的buttonclicked中的代码如下:
if dwo.name="cbselect" then
long row_num
row_num=dw_1.getrow()
string filepath,filename
getfileopenname("请选择备注文件",filepath,filename)
dw_1.object.s_path[row_num]=filepath
ole_1.insertfile(filepath)
end if
PB API调用原型[摘自Sybase中国]
The tens of thousands of function calls in the Windows environment can be helpful to PowerBuilder users, but documenting them is nearly impossible. After hundreds of user inquiries, Powersoft Technical Support compiled these technical tips to enable PowerBuilder developers to translate standard Microsoft function calls into PowerBuilder syntax, and to empower developers to use any of the external API calls within their owerBuilder environments..
The following information will help you translate and Windows SDK call to a PowerBuilder API function call. It doesn't matter whether you're using PowerBuilder 4.0, 5.0, 6.0, 7.0 or 8.0 but there are important differences between the 16- and 32-bit versions, as we'll discuss below.
Step 1: Converting an SDK Call to a PowerBuilder API Call.
First you need to get the syntax that wil be converted. This can be obtained from either a Windows API Bible or the MSDN (Microsoft Developers Network).
Step 2: Determining Whether it is a Function or a Subroutine.
Function calls return a value; subroutines do not.
Here is an example of a Microsoft function:
BOOL GetFileVersionInfo( LPTSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData );
Here is an example of a Microsoft subroutine:
VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer);
Step 3: Converting the datatypes from Microsoft to PowerBuilder. MICROSOFT PB(16Bit) PB(32Bit)
Bool Boolean Boolean
Char* Ref string Ref String
Colorref Uint Ulong
Dword Uint Ulong
Handle Uint Ulong
Hdc Uint Ulong
Hfile Uint Ulong
Hinstance Uint Ulong
Hwnd Uint Ulong
Int Int Int
Lparam Uint Ulong
Lpbyte Ref Int Ref Long
Lpdword Ref Uint Ref Ulong
Lpfiletime Ref Time Ref Time
Lpint Ref Int Ref Long
Lpstr,Lpststr Ref String Ref String
Lpvoid Ref Structstruct_inst Ref Struct struct_inst
Mcierror Long Long
Lpstr,Lpststr Ref String Ref String
Lpvoid Ref Structstruct_inst Ref Struct struct_inst
Pbyte Ref Int[#] Ref Long[#]
Short Int Int
Structure Ref Struct struct_inst Ref Struct Struct_inst
Uint Uint Uint
Void** SUBROUTINE SUBROUTINE
Word Int Ulong
Wparam Uint Ulong
Most of the datatypes are listed above, but some may be missing. When in doubt read the datatype description first. If still unsure, it is usually safe to assume a 16 bit datatype is a "uint" and a 32 bit datatype is a "ulong", since they are the most common.
*If the word "Callback appears as a datatype, it cannot be performed by PowerBuilder. Callback routines are functions that are called from within functions.
Step 4: Coding the Global/Local External Function:
This is a Microsoft function:
BOOL GetFileVersionInfo( LPTSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData );
The BOOL represents a boolean return code, which is translated to "Boolean" in PB for both 16 and 32 bit. A LPCTSTR means a pointer to a string (see step 3). In PowerBuilder, simply use the word "ref" before declaring the string in either 16- or 32-bit platofrms. DWORD is translated to "uint" for 16 bit and "ulong" for 32 bit. An LPVOID indicates that a structure is being used. In PowerBuilder, create a structure, assign it to an instance variable of that structure and pass it by reference. As a result, the following function declarations can be derived:
PowerBuilder 16 bit:
FUNCTION boolean GetFileVersionInfo(ref string filename, uint f_handle, uint f_length, ref lpdata lpdata2) LIBRARY "ver.dll"
PowerBuilder 32 bit:
FUNCTION boolean GetFileVersionInfoA(ref string filename, ulong f_handle, ulong f_length, ref lpdata lpdata2) LIBRARY "version.dll"
Note: In the "gotchas" section listed below, you'll get a further explanation why an "A" is appended to the 32-bit function. You'll also find a handy technique to help you locate function calls within the DLLs.
Step 5: Creating a Structure
In this particular example a structure is needed so you'll need information on what elements are contained within this structure. The MSDN provides this information since the function being called is a Windows function.
In the MSDN the structure appears like this:
LPDATA = { DWORD dwSignature ; DWORD dwStrucVersion ; DWORD dwFileVersionMS ; DWORD dwFileVersionLS ; DWORD dwProductVersionMS ; DWORD dwProductVersionLS ; DWORD dwFileFlagsMask ; DWORD dwFileFlags ; DWORD dwFileOS ; DWORD dwFileType ; DWORD dwFileSubtype ; DWORD dwFileDateMS ; DWORD dwFileDateLS }
In PB you would go into the structure painter and in this particular case all of these elements would be converted to ULONG. If one of the elements within the structure was a nested structure or callback routine you would not be able to use this function within PB. In that case the only option would be to create a C DLL that makes the function call and call it from PB.
Step 6: Scripting the Function Call.
Now that you have the function declaration you need to pass it the proper arguments. Taking the function " GetFileVersionInfoA" listed in Step 4 the following script would be needed:
First you'll need to declare the datatypes. Keep in mind the variable names do not have to match the function declaration listed in step 4.
boolean lb_rtn // Return code
string ls_filename // 1st argument - filename
ulong lu_hand // 2nd argument - f_handle
ulong lu_len // 3rd argument - f_length
lpdata lpdata2 // Last argument - assigning an instance of a structure.
Next is the hardest part and that is assigning values to the arguments. This part may require use of the MSDN, API Bible or whatever reference is available that covers the function you are calling. In this particular case the information is contained within the MSDN.
The first argument " ls_filename ", should be set to the path and filename of the target file.
ls_filename = "c:\windows\calc.exe" // The calculator would be a good file to test against.
The second argument "lu_hand" according to the MSDN is ignored. This is probably reserved for a future version of Windows to use. To be safe the argument should be set to null.
setnull(lu_hand)
The third argument "lu_len" contains the size of the buffer that the information will be returned into. It is critical that the buffer size not be too small or the information may overflow into another part of memory causing a GPF or Dr. Watson error. In this particular case since the structure contains 13 elements that are all ulong, the number 256 should be sufficient to contain the information.
lu_len = 256
The last argument "lpdata2" is an instance of the structure "lpdata" and it will be populated by the function call.
The final script will appear as follows:
boolean lb_rtn
string ls_filename
ulong lu_hand, lu_len
lpdata lpdata2
ls_filename = "c:\windows\calc.exe" // The calculator would be a good file to test against.
setnull(lu_hand)
lu_len = 256
lb_rtn = GetFileVersionInfoA(ls_filename, lu_hand, lu_len, lpdata2)
// Viewing the output -------------------------------------------------------------
sle_1.text = string(lpdata2.dwSignature)
sle_2.text = string(lpdata2.dwStrucVersion)
sle_3.text = string(lpdata2.dwFileVersionMS)
sle_4.text = string(lpdata2.dwFileVersionLS)
sle_5.text = string(lpdata2.dwProductVersionMS)
sle_6.text = string(lpdata2.dwProductVersionLS)
sle_7.text = string(lpdata2.dwFileFlagsMask)
sle_8.text = string(lpdata2.dwFileFlags)
sle_9.text = string(lpdata2.dwFileOS)
sle_10.text = string(lpdata2.dwFileType)
sle_11.text = string(lpdata2.dwFileSubtype)
sle_12.text = string(lpdata2.dwFileDateMS)
sle_13.text = string(lpdata2.dwFileDateLS)
Messagebox("Return Code", string(lb_rtn))
// -----------------------------------------------------------------------------------------
Gotcha's to look out for:
1. Make sure the DLL you are referencing is the right bit level. This can sometimes be done by looking at the DLL's properties but most likely you'll need a third party product to determine this.Remember, a 16 bit application cannot make a 32 bit API call and visaversa.
2. Some functions are cap sensitive. "Findwindowa" might fail whereas "FindWindowA" works.
3. All handles in PowerBuilder 16 bit are UINT and 32 bit are ULONG. Using the datatypes INT or LONG may work but if the handle points to an area in high memory the la