PB编程实例
- 格式:doc
- 大小:131.00 KB
- 文档页数:47
PB中制作位图菜单下面通过一个实例来叙述如何通过API函数实现位图菜单。
在本实例中,假设在创建一个应用对象Application之后,再分别创建一个菜单对象m_main和窗口对象w_main。
在菜单对象m_main中有如下菜单项:File/New、File/Open、File/Save、File/Exit、Edit/Copy、Edit/Cut、Edit/Paste和Edit/Delete。
在窗口对象w_main中,将其"Title"属性设置为"位图菜单",并且将菜单"w_main"关连到窗口"w_main"上。
1)首先为窗口w_main声明局部外部函数FUNCTION ulong LoadImageA(ulong hintance, string filename,uint utype, int x,int y,uint fload) & LIBRARY "USER32.DLL"//该函数实现装入图象数据的功能FUNCTION boolean SetMenuItemBitmaps(ulong hmenu,uint upos,uint flags,&ulong handle_bm1,ulong handle_bm2) LIBRARY "USER32.DLL"//该函数设置菜单位图FUNCTION int GetSystemMetrics( int nIndex ) LIBRARY "USER32.DLL"//该函数获取菜单的位图尺寸FUNCTION ulong GetMenuItemID(ulong hMenu,uint uItem) LIBRARY "USER32.DLL"//该函数获取菜单项目的ID号FUNCTION int GetSubMenu (ulong hMenu,int pos) LIBRARY "USER32.DLL"//该函数获取子菜单项的句柄FUNCTION ulong GetMenu(ulong hWindow) LIBRARY "USER32.DLL"//该函数获取应用的菜单项FUNCTION boolean ModifyMenu(ulong hMnu, ulong uPosition, ulong uFlags, &ulong uIDNewItem, long lpNewI) alias for ModifyMenuA LIBRARY "USER32.DLL"//该函数用来更新菜单项2)其次为窗口w_main声明实例变量//Win32常量CONSTANT Integer IMAGE_BITMAP = 0CONSTANT Integer LR_LOADFROMFILE = 16CONSTANT Integer SM_CXMENUCHECK = 71CONSTANT Integer SM_CYMENUCHECK = 72CONSTANT Integer MF_BITMAP = 4CONSTANT Integer MF_BYPOSITION = 10243)最后给窗口w_main的Open事件添加脚本long ll_MainHandlelong ll_SubMenuHandleinteger li_MenuItemIDlong ll_Xlong ll_Ylong ll_BitmapNewlong ll_BitmapOpenlong ll_BitmapSavelong ll_BitmapExitlong ll_BitmapCopylong ll_BitmapCutlong ll_BitmapPastelong ll_BitmapDelete//取得菜单句柄ll_MainHandle = GetMenu(Handle(this))//取得第一个菜单项的句柄ll_SubMenuHandle = GetSubMenu(ll_MainHandle,0)//装入图像数据ll_BitmapNew = LoadImageA(0,'new.bmp',IMAGE_BITMAP,0,0,LR_LOADFROMFILE)ll_BitmapOpen = LoadImageA(0,'open.bmp',IMAGE_BITMAP,0,0,LR_LOADFROMFILE)//取得第一个子菜单项的ID并修改菜单li_MenuItemID = GetMenuItemID(ll_SubMenuHandle,0)ModifyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapNew) //取得第二个子菜单项的ID并修改菜单li_MenuItemID = GetMenuItemID(ll_SubMenuHandle,1)ModifyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapOpen) //取得菜单缺省check-mark位图的尺寸ll_x = GetSystemMetrics(SM_CXMENUCHECK)ll_y = GetSystemMetrics(SM_CYMENUCHECK)//按系统尺寸装入图像ll_BitmapSave = LoadImageA(0,'save.bmp', IMAGE_BITMAP ,ll_x,ll_y,LR_LOADFROMFILE) ll_BitmapExit= LoadImageA(0,'exit.bmp', IMAGE_BITMAP ,ll_x,ll_y,LR_LOADFROMFILE) //设置菜单位图SetMenuItemBitmaps(ll_SubMenuHandle,2,MF_BYPOSITION,ll_BitmapSave,ll_BitmapSave) SetMenuItemBitmaps(ll_SubMenuHandle,3,MF_BYPOSITION,ll_BitmapExit,ll_BitmapExit)//取得第二个菜单项的句柄Ll_SubMenuHandle = GetSubMenu(ll_MainHandle,1)//装入图像数据ll_BitmapCopy = LoadImageA(0,'copy.bmp',IMAGE_BITMAP,0,0,LR_LOADFROMFILE)ll_BitmapCut = LoadImageA(0,'cut.bmp',IMAGE_BITMAP,0,0,LR_LOADFROMFILE)//取得第一个子菜单项的ID并修改菜单li_MenuItemID = GetMenuItemID(ll_SubMenuHandle,0)ModifyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapCopy)上面的代码知识如何设置File与Edit子菜单项的脚本。
pb中实现系统托盘pb 程序托盘化(taskbar status area)一、涉及的API//托盘程序需要的API1、shell_notifyicon(long dwmessage,ref nstr_notifyicondata lpdata)功能:创建、修改、删除托盘图标参数:dwmessage 0:创建托盘图标;1:修改托盘图标;2:删除图标lpdata 结构体结构体定义:long cbsize 结构体长度,固定为88;long hwnd 图标消息接收窗口;long uid 任务栏图标对应的应用程序定义的标识符;long uflags 结构体成员有效标志,1:hicon有效,2:ucallbackmessage有效,4:sztip有效,可以组合long ucallbackmessage 返回给窗口hwnd的消息long hicon 图标character sztip[64] 鼠标移动到图标时显示的文字pb声明:function integer shell_notifyicon (long dwmessage,ref nstr_notifyicondata lpdata) library "shell32" alias for "Shell_NotifyIconA"2、loadimage(long hinst,string lpszName,long uType ,long cxDesired ,long cyDesired ,long fuLoad )功能:装载图片参数:hinst 包含要装载图片的模块实例的句柄,如果是OEM图片,则此参数为0lpszName 图片文件名(带路径)uType 装载图片的类型,0:bitmap,2:cursor,1:iconcxDesired utype为1,2时表示图像的宽度(象素),如果utype为0则必须设为0cyDesired utype为1,2时表示图像的高度(象素),如果utype为0则必须设为0fuLoad 设为0pb声明:function long loadimage (long hinst,string lpsz,long un1,long n1,long n2,longun2) library "user32" alias for "LoadImageA"3、destroyicon(long hicon)功能:销毁图片参数:hicon 图片句柄pb声明:function long destroyicon (long hicon) library "user32" alias for "DestroyIcon"4、CreatePopupMenu()功能:创建一个弹出菜单pb声明:Function long CreatePopupMenu() Library "user32"5、AppendMenu (long hMenu, long wFlags,long wIDNewItem,string lpNewItem)功能:增加一个菜单项参数:hMenu 弹出菜单句柄wFlags 控制菜单项的各种参数(可组合,详细标识请参考MSDN)wIDNewItem 菜单项ID,通过此ID来确定选择的菜单lpNewItem 菜单显示文字pb声明:Function long AppendMenu (long hMenu, long wFlags,long wIDNewItem,string lpNewItem) Library "user32" Alias for"AppendMenuA"6、TrackPopupMenu (long hMenu,long wFlags,long xx,long yy,long nReserved,long hwnd,long lprc)功能:弹出菜单参数:hmenu 菜单句柄wflags 弹出菜单显示选项(详细选项请参考MSDN)xx 弹出菜单的X坐标yy 弹出菜单的Y坐标nReserved 设为0hwnd 弹出菜单对应的窗口lprc 无效参数(设为0)Function long TrackPopupMenu (long hMenu,long wFlags,long xx,long yy,long nReserved,long hwnd,long lprc) Library "user32"7、GetCursorPos (POINT lpPoint)功能:获取鼠标所在的屏幕位置参数:lppoint 结构体结构体定义:long x x坐标long y y坐标pb声明:Function long GetCursorPos (ref POINT lpPoint) Library "user32"8、DestroyMenu (long hMenu)功能:销毁菜单参数:hMenu 菜单句柄pb声明:Function long DestroyMenu (long hMenu) Library "user32" Alias for "DestroyMenu"9、SetForegroundWindow(ulong hwnd)功能:将窗口设置在前参数:hwnd 窗口句柄Function ulong SetForegroundWindow(ulong hwnd) LIBRARY "user32.dll"二、PB实例(实例变量nstr_notifyicondata istr_notifyicon)1、创建图盘图标(窗口OPEN时):long ll_hndstring ls_iconname//图标文件ls_iconname = 'comm.ico'll_hnd = loadimage(0,ls_iconname,1,0,0,16)if ll_hnd = 0 thenmessagebox("错误","装载位图文件失败,程序无法启动!",stopsign!)return falseelseistr_notifyicon.cbsize = 88istr_notifyicon.hwnd = handle(this)istr_notifyicon.uid = 0istr_notifyicon.hicon = ll_hndistr_notifyicon.uflags = 7istr_notifyicon.ucallbackmessage = 1025 //pb自定义消息pbm_custom02istr_notifyicon.sztip = '托盘程序'shell_notifyicon(0,istr_notifyicon)return trueend if2、接收消息(自定义pbm_custom02事件)int li_selectpoint lp_positionlong ll_hmenuchoose case lparamcase 516 //鼠标右键单击按下ll_hMenu = CreatePopupMenu()AppendMenu(ll_hMenu,0,1,"菜单A")AppendMenu(ll_hMenu,2048,5,"")//菜单分隔横线AppendMenu(ll_hMenu,0,2,"关闭")GetCursorPos(lp_position)SetForegroundWindow(handle(this)) //将窗口前置,防止点击右键后必须选择菜单项才能关闭菜单li_select = TrackPopupMenu(ll_hMenu,2 + 256 +128,lp_position.x,lp_position.y,0,handle(this),0)choose case li_selectcase 1//菜单A相关操作case 2post close(this)end chooseDestroyMenu(ll_hmenu)end choose3、窗口关闭(CLOSE事件)istr_notifyicon.ucallbackmessage = 0 shell_notifyicon(2,istr_notifyicon)if istr_notifyicon.hicon <> 0 then destroyicon(istr_notifyicon.hicon) end ifistr_notifyicon.hicon = 0。
PB的OLE编程技术OLE,全称Object Linking and Embedding,即对象链接和嵌入技术,是Windows系统中允许应用程序共享数据和程序功能的一种标准的便利方法。
在PowerBuilder中,在窗口画板上,可以放置OLE控件,把Windows系统内注册的OLE 对象嵌入到界面中,该控件是被嵌入的对象的容器,用户能激活该OLE对象,调出产生它的原始服务程序,可视化编辑修改。
也能用编程的方法,在内存中创建对象,连接到服务程序,调用相应功能,设置对象的各种属性。
这种方法不可视地操作对象,发送命令,并不需要在窗口中放置一个OLE控制,叫做“OLE自动化”。
在这种情况下,还可以设置服务程序的可视属性为“True”,让服务程序显示在用户面前。
在PowerBuilder中,OLEObject对象类型是专门用于“OLE自动化”的。
OLEObject是个动态对象类型,这意味着编译器会接受这个对象的任何属性、方法和参数列表,PowerBuilder不知道你调用的属性和方法是否有效,而是把它留给服务程序自己去判断,如果确实没有,就会在运行的时候报错。
使用OLEObject对象变量编程,少不了如下四步:1.声明变量,创建对象OLEObject myoleobjectmyoleobject = CREATE OLEObject2.连接到某个具体的OLE对象myoleobject.ConnectToObject … 或者myo leobject.ConnectToNewObject …3.利用OLE服务器的属性和方法操作该对象myoleobject.property = … /* 属性 */myoleobject.function(…) /* 方法 */4.断开和OLE对象的连接,销毁对象,释放内存。
myoleobject.Quit()myoleobject.DisconnectObject()Destroy myoleobject这种用编程的方法操作OLE对象,应用非常普遍。
一、URL的作用及重要性在互联网世界中,URL(统一资源定位符)扮演着非常重要的角色。
它是互联全球信息站用来标识资源的位置区域,不仅可以定位到特定的网页、图片、视瓶等内容,还能够指示浏览器如何访问这些资源。
正确使用和理解URL对于全球信息站的访问速度、搜索引擎优化、用户体验等方面都至关重要。
二、URL()函数的基本概念URL()函数是前端开发中常用的一个函数,它主要用于在CSS中引用其他资源,例如图片、字体等。
通过URL()函数,可以将资源的位置区域嵌入到样式表中,从而实现对这些资源的引用和展示。
URL()函数还能够根据需要进行资源路径的转换和定制,使得前端开发者能够更加灵活地控制页面上的各种元素。
三、URL()函数的语法和用法URL()函数的语法非常简单,通常由一个或多个参数组成。
最常见的用法是将资源的相对路径作为参数传入URL()函数中,然后通过该函数生成该资源的绝对路径。
例如:```cssbackground-image: url('images/background.jpg');```在这个例子中,URL()函数的参数是相对于CSS文件的路径,但它最终会被解析为全球信息站根目录下图片文件的绝对路径。
四、URL()函数的常见问题及解决方法尽管URL()函数在前端开发中被广泛应用,但依然存在一些常见的问题需要注意。
其中,最为常见的问题就是资源路径定位错误,导致页面上的图片、字体等无法正常显示。
为了解决这个问题,开发者需要对URL()函数中的路径进行仔细检查,并确保路径的正确性和一致性。
还需要注意不同环境下资源路径的变化,例如开发环境和生产环境可能有不同的路径规则,需要做出相应的调整。
五、URL()函数的性能优化由于URL()函数会在加载页面时实时解析生成资源的绝对路径,因此在页面中过多地使用URL()函数可能会对页面的加载速度产生一定的影响。
为了优化性能,开发者可以考虑将一些静态资源的绝对路径硬编码到样式表中,而不是依赖URL()函数来动态生成。
(1)获得安装的打印机在这个例子中,我们生成一个以打印机名的下拉框string printers[]int rtn, i, nbPrintersrtn = RegistryKeys &(\"HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Print\\Printers\", &printers)nbPrinters = UpperBound(printers)FOR i = 1 TO nbPrinterslb_1.addItem(printers[i])NEXT(2)获得当前的用户名和机器名在这个应用中,需要定义下面的两个API函数FUNCTION long GetComputerNameA(ref string ComputerName, ref ulong BufferL ength)LIBRARY \"KERNEL32.DLL\"FUNCTION long GetUserNameA(ref string UserName, ref ulong BufferLength) LIBRARY \"ADVAPI32.DLL\"and thenlong ll_retstring ls_ComputerName, ls_UserNameulong BufferLength = 250 // you may need to adjust this. see Notels_ComputerName = Space(BufferLength)ls_UserName = Space(BufferLength)ll_ret = GetComputerNameA(ls_ComputerName, BufferLength)ll_ret = GetuserNameA(ls_UserName, BufferLength)注意:通过一些实验,在使用函数GetUserNameA获得用户名时,如果定义的BUFFERLE NGTH小于实际的用户名长度,函数可能会出现异常.(3)获得当前的目录首先定义API函数FUNCTION long GetCurrentDirectoryA( long length , ref string path) &LIBRARY \"Kernel32\"接下来long ll_retstring ls_pathls_path = Space(250)ll_ret = GetCurrentDirectoryA(250, ls_path)IF ll_ret > 0 THENls_path = Left(ls_path,ll_ret)MessageBoxBox(\"\", ls_path)ELSEMessagebox(\"Error\",\"Err GetCurrentDirectory \" + String(ll_ret))END IF(4)创建或删除目录首先定义如下API函数FUNCTION boolean CreateDirectoryA(ref string path, long attr)LIBRARY \"kernel32.dll\"FUNCTION boolean RemoveDirectoryA( ref string path )LIBRARY \"kernel32.dll\"接下来CreateDirectoryA( \"C:\\TempDir\", 0 ) // always 0RemoveDirectoryA( \"C:\\TempDir\" )注意:没有办法同时创建两个以上的目录.可以一个一个的创建.(5)文件改名使用下面的函数,把文件\"移动\"成一个新的名字(没有关系,不会真的移动文件,只是改名)Simply \"move\" it under a new name with the functionFUNCTION BOOLEAN MoveFileA(STRING oldfile, STRING newfile)LIBRARY \"Kernel32.dll\"(6)禁止ODBC的“LOGIN”窗口在DbParm中使用如下的连接选项Use this ConnectOption in your DbParm :SQLCA.DBParm=\"ConnectString=\'DSN=mydb;UID=dba;PWD=sql\',\" + & \"ConnectOption=\'SQLDRIVER_CONNECT,SQL_DRIVER_NOPROMPT\'\ "(7)使应用休眠定义:SUBROUTINE Sleep(Long lMilliSec) LIBRARY \"Kernel32.dll\"使应用休眠2秒Sleep(2000)(8)使用文件关联的应用来打开一个文档使用外部函数ShellExecuteA().函数如下定义:FUNCTION long ShellExecuteA &(long hwnd, string lpOperation, &string lpFile, string lpParameters, string lpDirectory, &integer nShowCmd ) LIBRARY \"SHELL32\"在脚本中,例如:启动一个缺省的浏览器string ls_Nulllong ll_rcSetNull(ls_Null)ll_rc = ShellExecuteA &( Handle( This ), \"open\", \"MyPage.html\", ls_Null, ls_Null, 1)可能返回的代码如下:SE_ERR_FNF 2 // file not foundSE_ERR_PNF 3 // path not foundSE_ERR_ACCESSDENIED 5 // access deniedSE_ERR_OOM 8 // out of memorySE_ERR_DLLNOTFOUND 32SE_ERR_SHARE 26SE_ERR_ASSOCINCOMPLETE 27SE_ERR_DDETIMEOUT 28SE_ERR_DDEFAIL 29SE_ERR_DDEBUSY 30SE_ERR_NOASSOC 31使用下面的代码,实现以指定的扩展名对应的程序打开你指定的文件(不是你指定的文件扩展名的关联程序)[structure nvos_shellexecuteinfo]long cbSizelong fMasklong hwndstring lpVerbstring lpFilestring lpParametersstring lpDirectorylong nShowlong hInstApplong lpIDListstring lpClasslong hkeyClasslong dwHotKeylong hIconlong hProcess[External Function]FUNCTION long ShellExecuteEx(REF nvos_shellexecuteinfo lpExecInfo) LIBRARY \"shell32.dll\" ALIAS FOR ShellExecuteExA[powerscript]function boolean of_execute(readonly string as_file, readonly string as_extension)CONSTANT long SEE_MASK_CLASSNAME = 1CONSTANT long SW_NORMAL = 1string ls_classlong ll_retnvos_shellexecuteinfo lnvos_shellexecuteinfoInet l_InetIF lower(as_extension) = \"htm\" OR lower(as_extension) = \"html\" THEN // Open html file with HyperlinkToURL// So, a new browser is launched// (with the code using ShellExecuteEx, it is not sure)GetContextService(\"Internet\", l_Inet)ll_ret = l_Inet.HyperlinkToURL(as_file)IF ll_ret = 1 THENRETURN trueEND IFRETURN falseEND IF// Search for the classname associated with extensionRegistryGet(\"HKEY_CLASSES_ROOT\\.\" + as_extension, \"\", ls_class)IF isNull(ls_class) OR trim(ls_class) = \"\" THEN// The class is not found, try with .txt (why not ?)RegistryGet(\"HKEY_CLASSES_ROOT\\.txt\", \"\", ls_class)END IFIF isNull(ls_class) OR Trim(ls_class) = \"\" THEN// No class : errorRETURN falseEND IFlnvos_shellexecuteinfo.cbsize = 60lnvos_shellexecuteinfo.fMask = SEE_MASK_CLASSNAME // Use classname lnvos_shellexecuteinfo.hwnd = 0lnvos_shellexecuteinfo.lpVerb = \"open\"lnvos_shellexecuteinfo.lpfile = as_filelnvos_shellexecuteinfo.lpClass = ls_classlnvos_shellexecuteinfo.nShow = SW_NORMALll_ret = ShellExecuteEx(lnvos_shellexecuteinfo)IF ll_ret = 0 THEN// ErrorRETURN falseEND IFRETURN true例如,创建一个C:\\test.txt文件,使用如下的脚本:// Open c:\\test.txt with Word, or Wordpad (or with another .doc file viewer) of_execute(\"c:\\test.txt\", \"doc\")// Open c:\\test.txt with the default browserof_execute(\"c:\\test.txt\", \"htm\")这段代码在你打算以不同的扩展名保存文件(保密)时有用。
PB的OLE编程技术OLE,全称Object Linking and Embedding,即对象链接和嵌入技术,是Windows系统中允许应用程序共享数据和程序功能的一种标准的便利方法。
在PowerBuilder中,在窗口画板上,可以放置OLE控件,把Windows系统内注册的OLE 对象嵌入到界面中,该控件是被嵌入的对象的容器,用户能激活该OLE对象,调出产生它的原始服务程序,可视化编辑修改。
也能用编程的方法,在内存中创建对象,连接到服务程序,调用相应功能,设置对象的各种属性。
这种方法不可视地操作对象,发送命令,并不需要在窗口中放置一个OLE控制,叫做“OLE自动化”。
在这种情况下,还可以设置服务程序的可视属性为“True”,让服务程序显示在用户面前。
在PowerBuilder中,OLEObject对象类型是专门用于“OLE自动化”的。
OLEObject是个动态对象类型,这意味着编译器会接受这个对象的任何属性、方法和参数列表,PowerBuilder不知道你调用的属性和方法是否有效,而是把它留给服务程序自己去判断,如果确实没有,就会在运行的时候报错。
使用OLEObject对象变量编程,少不了如下四步:1.声明变量,创建对象OLEObject myoleobjectmyoleobject = CREATE OLEObject2.连接到某个具体的OLE对象myoleobject.ConnectToObject … 或者myo leobject.ConnectToNewObject …3.利用OLE服务器的属性和方法操作该对象myoleobject.property = … /* 属性 */myoleobject.function(…) /* 方法 */4.断开和OLE对象的连接,销毁对象,释放内存。
myoleobject.Quit()myoleobject.DisconnectObject()Destroy myoleobject这种用编程的方法操作OLE对象,应用非常普遍。
pb 窗口开发实例标题:使用PB窗口开发实例的故事在这个故事中,我将向您展示如何使用PowerBuilder(PB)窗口开发来创建一个简单而有趣的应用程序。
这个应用程序是一个天气预报小工具,可以帮助用户获取当地的天气信息。
为了开始这个项目,我首先创建了一个新的PB应用程序,并添加了一个主窗口。
这个主窗口包含了一个输入框用于用户输入城市名称,并有一个按钮用于查询天气信息。
当用户点击按钮时,应用程序将调用一个天气API来获取天气数据,并将其显示在一个新的窗口中。
在编写代码之前,我需要先注册一个免费的天气API,并获取API 密钥。
这个API提供了一个简单的接口,可以根据城市名称获取当地的天气信息。
接下来,我在PB的代码编辑器中编写了一些逻辑代码。
首先,我创建了一个函数来处理用户点击按钮的事件。
在这个函数中,我首先获取用户输入的城市名称,并将其作为参数传递给天气API。
然后,我使用API返回的数据来创建一个新的窗口,并将天气信息显示在这个窗口中。
为了使应用程序更加用户友好,我还添加了一些错误处理的代码。
如果用户输入的城市名称无效或API返回的数据有误,我会显示一个错误消息框,并提示用户重新输入。
完成了代码编写后,我进行了一些测试,确保应用程序可以正常工作。
我首先输入了一个有效的城市名称,点击查询按钮后,新窗口显示了该城市的天气信息,包括温度、湿度和风力等。
然后,我尝试输入一个无效的城市名称,应用程序成功地显示了错误消息。
通过这个PB窗口开发实例,我学到了如何使用PB来创建一个简单的应用程序并与外部API进行交互。
这个故事向读者展示了我的学习过程,并希望它能激发更多人对PB窗口开发的兴趣。
希望这个故事能够给读者带来一些启发,鼓励他们尝试使用PB窗口开发来实现自己的创意和想法。
PB窗口开发不仅可以帮助我们构建功能强大的应用程序,还可以提高我们的编程技能和逻辑思维能力。
让我们一起享受PB窗口开发的乐趣吧!。
(1)获得安装的打印机在这个例子中,我们生成一个以打印机名的下拉框string printers[]int rtn, i, nbPrintersrtn = RegistryKeys &(\"HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Print\\Printers\", &printers)nbPrinters = UpperBound(printers)FOR i = 1 TO nbPrinterslb_1.addItem(printers[i])NEXT(2)获得当前的用户名和机器名在这个应用中,需要定义下面的两个API函数FUNCTION long GetComputerNameA(ref string ComputerName, ref ulong BufferL ength)LIBRARY \"KERNEL32.DLL\"FUNCTION long GetUserNameA(ref string UserName, ref ulong BufferLength) LIBRARY \"ADVAPI32.DLL\"and thenlong ll_retstring ls_ComputerName, ls_UserNameulong BufferLength = 250 // you may need to adjust this. see Notels_ComputerName = Space(BufferLength)ls_UserName = Space(BufferLength)ll_ret = GetComputerNameA(ls_ComputerName, BufferLength)ll_ret = GetuserNameA(ls_UserName, BufferLength)注意:通过一些实验,在使用函数GetUserNameA获得用户名时,如果定义的BUFFERLE NGTH小于实际的用户名长度,函数可能会出现异常.(3)获得当前的目录首先定义API函数FUNCTION long GetCurrentDirectoryA( long length , ref string path) &LIBRARY \"Kernel32\"接下来long ll_retstring ls_pathls_path = Space(250)ll_ret = GetCurrentDirectoryA(250, ls_path)IF ll_ret > 0 THENls_path = Left(ls_path,ll_ret)MessageBoxBox(\"\", ls_path)ELSEMessagebox(\"Error\",\"Err GetCurrentDirectory \" + String(ll_ret))END IF(4)创建或删除目录首先定义如下API函数FUNCTION boolean CreateDirectoryA(ref string path, long attr)LIBRARY \"kernel32.dll\"FUNCTION boolean RemoveDirectoryA( ref string path )LIBRARY \"kernel32.dll\"接下来CreateDirectoryA( \"C:\\TempDir\", 0 ) // always 0RemoveDirectoryA( \"C:\\TempDir\" )注意:没有办法同时创建两个以上的目录.可以一个一个的创建.(5)文件改名使用下面的函数,把文件\"移动\"成一个新的名字(没有关系,不会真的移动文件,只是改名)Simply \"move\" it under a new name with the functionFUNCTION BOOLEAN MoveFileA(STRING oldfile, STRING newfile)LIBRARY \"Kernel32.dll\"(6)禁止ODBC的“LOGIN”窗口在DbParm中使用如下的连接选项Use this ConnectOption in your DbParm :SQLCA.DBParm=\"ConnectString=\'DSN=mydb;UID=dba;PWD=sql\',\" + & \"ConnectOption=\'SQLDRIVER_CONNECT,SQL_DRIVER_NOPROMPT\'\ "(7)使应用休眠定义:SUBROUTINE Sleep(Long lMilliSec) LIBRARY \"Kernel32.dll\"使应用休眠2秒Sleep(2000)(8)使用文件关联的应用来打开一个文档使用外部函数ShellExecuteA().函数如下定义:FUNCTION long ShellExecuteA &(long hwnd, string lpOperation, &string lpFile, string lpParameters, string lpDirectory, &integer nShowCmd ) LIBRARY \"SHELL32\"在脚本中,例如:启动一个缺省的浏览器string ls_Nulllong ll_rcSetNull(ls_Null)ll_rc = ShellExecuteA &( Handle( This ), \"open\", \"MyPage.html\", ls_Null, ls_Null, 1)可能返回的代码如下:SE_ERR_FNF 2 // file not foundSE_ERR_PNF 3 // path not foundSE_ERR_ACCESSDENIED 5 // access deniedSE_ERR_OOM 8 // out of memorySE_ERR_DLLNOTFOUND 32SE_ERR_SHARE 26SE_ERR_ASSOCINCOMPLETE 27SE_ERR_DDETIMEOUT 28SE_ERR_DDEFAIL 29SE_ERR_DDEBUSY 30SE_ERR_NOASSOC 31使用下面的代码,实现以指定的扩展名对应的程序打开你指定的文件(不是你指定的文件扩展名的关联程序)[structure nvos_shellexecuteinfo]long cbSizelong fMasklong hwndstring lpVerbstring lpFilestring lpParametersstring lpDirectorylong nShowlong hInstApplong lpIDListstring lpClasslong hkeyClasslong dwHotKeylong hIconlong hProcess[External Function]FUNCTION long ShellExecuteEx(REF nvos_shellexecuteinfo lpExecInfo) LIBRARY \"shell32.dll\" ALIAS FOR ShellExecuteExA[powerscript]function boolean of_execute(readonly string as_file, readonly string as_extension)CONSTANT long SEE_MASK_CLASSNAME = 1CONSTANT long SW_NORMAL = 1string ls_classlong ll_retnvos_shellexecuteinfo lnvos_shellexecuteinfoInet l_InetIF lower(as_extension) = \"htm\" OR lower(as_extension) = \"html\" THEN // Open html file with HyperlinkToURL// So, a new browser is launched// (with the code using ShellExecuteEx, it is not sure)GetContextService(\"Internet\", l_Inet)ll_ret = l_Inet.HyperlinkToURL(as_file)IF ll_ret = 1 THENRETURN trueEND IFRETURN falseEND IF// Search for the classname associated with extensionRegistryGet(\"HKEY_CLASSES_ROOT\\.\" + as_extension, \"\", ls_class)IF isNull(ls_class) OR trim(ls_class) = \"\" THEN// The class is not found, try with .txt (why not ?)RegistryGet(\"HKEY_CLASSES_ROOT\\.txt\", \"\", ls_class)END IFIF isNull(ls_class) OR Trim(ls_class) = \"\" THEN// No class : errorRETURN falseEND IFlnvos_shellexecuteinfo.cbsize = 60lnvos_shellexecuteinfo.fMask = SEE_MASK_CLASSNAME // Use classname lnvos_shellexecuteinfo.hwnd = 0lnvos_shellexecuteinfo.lpVerb = \"open\"lnvos_shellexecuteinfo.lpfile = as_filelnvos_shellexecuteinfo.lpClass = ls_classlnvos_shellexecuteinfo.nShow = SW_NORMALll_ret = ShellExecuteEx(lnvos_shellexecuteinfo)IF ll_ret = 0 THEN// ErrorRETURN falseEND IFRETURN true例如,创建一个C:\\test.txt文件,使用如下的脚本:// Open c:\\test.txt with Word, or Wordpad (or with another .doc file viewer) of_execute(\"c:\\test.txt\", \"doc\")// Open c:\\test.txt with the default browserof_execute(\"c:\\test.txt\", \"htm\")这段代码在你打算以不同的扩展名保存文件(保密)时有用。