pb+api实际应用

pb+api实际应用

1、利用Api函数计算Windows从启动后所运行的总时间
Function long GetTickCount() Library “kernel32.dll” //获取windows从启动开始的总微秒数
窗口w_example的open事件:
timer(0.05)//触发timer事件
窗口的timer事件:
long hour , minute ,second
hour = GetTickCount() \ 1000 \ 60 \ 60//获取小时数
st_1.text = String(hour) + “小时”
minute = (GetTickCount() - hour * 60 * 60 * 1000) \ 1000 \ 60//获取分钟数
st_2.text = Str(minute) + “分钟”
second = (GetTickCount() - long(st_1.text) * 60 * 60 * 1000 - long(st_2.text) * 60 * 1000) \ 1000//获取总秒数
st_3.text = String(second) + “秒钟”

2、GetSystemMetrics函数
Function long GetSystemMetrics (long nIndex ) Lib “user32.dll”
  其中nIndex的不同取值可以使该函数实现不同的功能。例如返回Win桌面中各种显示单元的宽度和高度、是否安装鼠标、是否调换了鼠标左右键的定义等。
  当nIndex = 67(SM_CLEANBOOT)时,该函数的返回值表示Windows9x的当前运行模式。
  在以下的示例中我们可以看到GetSystemMetrics函数的用法和作用。
首先在窗口w_example中定义实例变量:
  Public Constant long SM_CLEANBOOT = 67 定义外部函数引用声明:
Function long GetSystemMetrics (long nIndex ) Lib “user32.dll”
  在窗口w_example中添加static text控件st_1和commandbutton控件 Cb_1,设置如下代码:
   cb_1.clicked:
   choose case GetSystemMetrics(SM_CLEANBOOT)
   Case 0
st_1.text=“系统运行于正常模式”
   Case 1
st_1.text=“系统运行于安全模式”
   Case 2
st_1.text=“系统运行于网络环境下的安全模式”
   end choose

3、获取磁盘分区大小(支持大的分区)
type large_integer from structure
unsignedlong lowpart
unsignedlong highpart
end type//定义能够保存64位整形的结构
定义外部函数引用声明
Function long GetDiskFreeSpaceExA(ref string lpRootPathName, ref large_integer lpFreeBytesAvailableToCaller,ref large_integer lpTotalNumberOfBytes, ref large_integer lpTotalNumberOfFreeBytes) Library “kernel32.dll”
api函数解析:
lpRootPathName String ,不包括卷名的磁盘根路径名
lpFreeBytesAvailableToCaller LARGE_INTEGER,指定一个变量,用于容纳调用者可用的字节数量
lpTotalNumberOfBytes LARGE_INTEGER ,指定一个变量,用于容纳磁盘上的总字节数
lpTotalNumberOfFreeBytes LARGE_INTEGER,指定一个变量,用于容纳磁盘上可用的字节数
实现代码解析:
public function double of_get_drive_totalspace (string as_drive);/*函数作用:获取指定的驱动器的空间大小
参数:as_drive string 驱动器名
返回值:real */
Double ld_capacity
any ia_pass
if right(as_drive,1)<>":" then
as_drive=as_drive+":"
end if//判断传递的驱动器参数的最后一个字符是否为":"
LARGE_INTEGER lngFreeCaller,lngTotal,lngTotalFree//定义结构的三个变量
GetDiskFreeSpaceExA(as_drive, lngFreeCaller, lngTotal, lngTotalFree)//调用api函数获取对应的分区信息
IF lngTotal.Highpart > 0 THEN
ld_capacity = ( lngTotal.Highpart * 1.0 * 4294967295 ) +lngTotal.LowPart
ELSE
ld_capacity = lngTotal.LowPart
END IF//进行对应的结构变量转化为double类型并返回
return ld_capacity

4、用API函数控制光驱的开关
使用API函数CDdoor 来控制光驱门的开和关程序十分简单,由于 CDdoor 函数自身包含了对异常错误的处理机制,因此这个程序的通用性很高,你可以把这段代码移植到你的程序中,实现某些多媒体播放器所常用的开关光驱的功能。
以下是源代码:
//  -------------------------------------------
//   利用API函数控制光驱的开和关
//  -------------------------------------------
//  程序说明:
//   本例使用API函数 CDdoor 来控制光驱门的开和关
//  程序十分简单,由于 CDdoor 函数自身包含了对异常
//  错误的处理机制,因此这个程序的通用性很高,你可
//  以把这段代码移植到你的程序中,实现某些多媒体播
//  放器所常用的开关光驱的功能。
//  -------------------------------------------

说明:CDdoor函数是安装WINDOWS时所自带的winmm.dll文件中包含的函数
定义外部函数引用声明:
Declare Function long CDdoor( string lpstrCommand , string lpstrReturnString, long uReturnLength , long hwndCallback ) Libraray “winmm.dll” Alias for “mciSendStringA”  
定义实例变量:

boolean CDOpen // CDOpen用来标示光驱开与关的状态
w_example的cb_1的clicked事件:
//如果关闭则打开,并且按钮做相应变化
If CDOpen = False Then
CDdoor(“set CDAudio door open”, “0”, 0, 0)
CDOpen = True
Cb_1.text = “点击关闭光驱”
Else
  //否则关闭
CDdoor(“set CDAudio door closed”, “0”, 0, 0)
CDOpen = False
Cb_1.text = “点击打开光驱”
End If
w_example的open事件:
CDOpen = False
CDdoor(“set CDAudio door closed”, “0”, 0, 0)
相关api函数解析:

CDdoor函数是安装WINDOWS时所自带的winmm.dll文件中包含的函数,我们只须先加入如下的声明后就能引用这个API函数:
  Function long CDdoor( string lpstrCommand , //String,这是控制命令参数
   string lpstrReturnString , //   String,这是返回值
   long uReturnLength, //Long,返回值长度参数
   long hwndCallback ) Librara y “winmm.dll” Alias for “mciSendStringA”
  引用的语法是CDdoor(“set CDAudio door closed”, “0”, 0, 0)//用以关闭光驱门
        CDdoor(“set CDAudio door open”, “0”, 0, 0)//用以打开光驱门
程序解析:

程序中使用了一个布尔型变量来标示当前光驱门开与关的状态。
  如果配合检测光驱是否存在的函数一起使用,此程序的通用性会更高。而关于检测驱动器信息的函数请参看 GetDriveType,GetLogicalDrives这两个api函数的用法。

5、使用文件的默认的打开方式
许多应用程序都需要通过默认的打开方式来打开一些文档。在某些情况下,你的应用程序可能需要显示像HTML或者RTF这样的文件。但是我们如何知道哪个应用程序与这些文件建立了关联关系呢?幸好,Windows API提供给我们使文档显示在其默认的程序里的方法。

我们可以通过Windows shell.方法使用ShellExecute API函数来加载文档。这个函数将自动的来判断文件的默认打开方式,并用默认的打开方式来开启文档。
以下就是ShellExecute函数的声明:
Function long ShellExecuteA (long hWnd As Long, string lpOperation , string lpFile , string lpParameters, string lpDirectory , long nShowCmd ) Library “shell32.dll”
Constant long SW_SHOWNORMAL = 1
Constant long SW_HIDE = 0
我们将结合下面的例子来解释该API函数的主要参数的意义。
string ls_temp
setnull(ls_temp)
ShellExecute(handle(this), “Open”, “c:\mypage.html”, ls_temp, ls_temp, SW_SHOWNORMAL)
“handle(this)”:表示那个你将要作为父窗体的窗体句柄。
“Operatio”:该参数付值为“Open”,表示使用“打开”方法来操作该文档。
“File”:该参数表示要操作哪个文件,必须用该文件的完全路径表示。
“Parameters”:该参数表示打开文件时的命令行参数。
“Directory”:该参数用于指定该应用程序的默认目录。
“ShowCmd”:该参数将被设置为“SW_SHOWNORMAL”以打开文档。

6、使用SendMessage来实现剪切、复制和粘贴
调用SendMessage API就能够向任何带有handle属性的窗口或者控件发送Windows消息。很多控件内置有对特定消息的响应机制。使用这一机制,你在自己的powerbuilder应用程序里很容易就能够实现剪切、复制和粘贴的功能。
要使用这一技巧,你就需要声明用于剪切、复制和粘贴的常数:
Constant long WM_COPY = 769
Constant long WM_CUT = 768
Constant long WM_PASTE =770
然后,声明对SendMessage API的调用:
Function long SendMessage (long hWnd, long wMsg , long wParam , long lParam ) Library “user32.dll”
HWnd自变量能够接受消息发送的目的控件的句柄,而wMsg自变量会接受一个表明要被发送的是哪个对象的常数。WParam和lParam自变量被用来把其他信息同消息一起传递,但是不对WM_CUT、WM_COPY或者WM_PASTE使用。
下面是从菜单点击事件调用SendMessage API的代码:
m_Copy.Clicked:
SendMessage(Me.ActiveControl.hwnd, WM_COPY, 0, 0)
m_Cut.Clicked
SendMessage(Me.ActiveControl.hwnd, WM_CUT, 0, 0)

m_Paste.Clicked
SendMessage(Me.ActiveControl.hwnd, WM_PASTE, 0, 0)

这个技巧能够用于任何实现handle方法,并能够响应WM_CUT、WM_COPY和WM_PASTE消息的控件。还应该实现错误处理,以处理不带handle方法的控件。

7、隐藏/显示开始菜单
Function long FindWindow (string lpClassName, string lpWindowName ) Library “user32.dll” Alias for “FindWindowA”
注释:寻找窗口列表中第一个符合指定条件的顶级窗口
注释:lpClassName指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,注释:表示接收任何类
注释:lpWindowName指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;注释:或设为零,表示接收任何窗口标题
Function long FindWindowEx (long hWnd1 ,long hWnd2, string lpsz1 , string lpsz2 ) Library “user32.dll” Alias for “FindWindowExA”
注释:在窗口列表中寻找与指定条件相符的第一个子窗口
注释:hWnd1在其中查找子的父窗口
注释:hWnd2从这个窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索
Function long ShowWindow(long hwnd , long nCmdShow ) Library “user32.dll”
注释:控制窗口的可见性
注释:hwnd窗口句柄,要向这个窗口应用由nCmdShow指定的命令
注释:nCmdShow为窗口指定可视性方面的一个命令
实现代码:cb_1.clicked:
long Handle ,FindClass
string ls_temp
setnull(ls_temp)
FindClass = FindWindow(“Shell_TrayWnd”, “”)
Handle = FindWindowEx(FindClass, 0, “Button”, ls_temp)
ShowWindow(Handle, 0)//隐藏开始菜单
cb_2.clicked:
long Handle , FindClass
FindClass = FindWindow(“Shell_TrayWnd”, “”)
Handle = FindWindowEx(FindClass, 0, “Button”, ls_temp)
ShowWindow(Handle, 1)//显示开始菜单

8、起用和禁止ctrl-alt-del
Function long SystemParametersInfo (long uAction , long uParam, Ref any lpvParam, long fuWinIni ) Library “user32.dll” Alias for “SystemParametersInfoA”
注释:允许获取和设置数量众多的windows系统参数
注释:uAction指定要设置的参数
Constant long SPI_SCREENSAVERRUNNING = 97
实现代码:起用ctrl-alt-del:
integer ret As Integer
boolean pOld
ret = SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, pOld, 0)
禁止ctrl-alt-del:
integer ret
boolean pOld
ret = SystemParametersInfo(SPI_SCREENSAVERRUNNING, Fals

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
原先的程序数据缓冲区采用String类型,因此无法发送H00,现将数据缓冲区修改为BLOB类型,可以发送任意数据。 在原先程序的基础上,增加了两个对象:pfc_n_cst_numerical,uo_bit_operator Email: leio88@126.com 以下是原作者的话---------------------------------- 本程序通过调用WINDOWS API函数,实现了类似MSCOMM控件的功能。使PB可以很方便地访问串口。由于所有功能都是PB代码实现的,因此比使用OCX控件访问串口的方式更稳定。 为了方便使用已将所有功能都封装在uo_comm._control用户对象中。使用时只需在窗口中像放置普通对象(如:按钮)一样放置一个uo_comm_control对象即可对串口进行访问。 访问串口时先调用of_setcommport(string commport)和of_setcommsettings(string commsettings)来设置要访问的端口及端口初始化参数,然后调用of_open()初始化端口。或直接使用of_open(string comport,string commsettings)带参数初始化端口。端口初始化成功后即可使用of_send(string sendstring)向串口发送数据,或使用of_read()读取串口数据。当串口有数据到达时,触发ue_received事件,该事件提供给用户用来存放读取串口数据的代码(值得注意的是,当数据到达接收端时,由于发送的数据很长或通讯速率较低,会多次触发ue_receieved事件,并且在ue_received事件中使用of_read()得到的数据仅只是整个发送数据的一部分,需要将多次接收到的数据连接起来才是完整的接收数据)。若对串口所有操作结束不再需要对串口进行操作,则调用of_close()将端口关闭。 Email: blazingstar@sina.com
pb实现socket是一种通过Protocol Buffers(简称pb)协议来实现的网络通信方式。Protocol Buffers是一种轻量级、高效的数据交换格式,可以用于结构化数据的序列化和反序列化。 针对pb实现的Socket通信,首先需要定义好通信协议。这包括在pb中定义好需要交换的数据结构以及相应的字段和类型。可以使用pb的语言定义文件(如.proto文件)来描述这些信息。 接下来,需要使用pb的编译器将.proto文件编译成对应的代码文件,这些代码文件将包含pb相关的类和方法。 在编写pb实现Socket的代码时,需要在发送数据的一端将数据结构序列化为pb的二进制格式,并通过Socket发送给接收数据的一端。在接收数据的一端,通过Socket接收到数据后,需要将接收到的二进制数据反序列化为对应的数据结构。 在实际应用中,可使用各种编程语言提供的pb库来实现pb的序列化和反序列化操作。同时,也需要使用Socket编程相关的库或API来进行Socket通信操作。 pb实现Socket的优点是数据传输效率高,可跨平台使用,且可以使用不同语言来实现不同端的通信。缺点是对于较为简单的通信需求,pb的使用可能会显得繁琐,且在数据结构变动较大时,可能需要重新编译生成代码。 总结来说,pb实现Socket是一种高效、灵活的网络通信方式,可以通过定义好的pb协议和相应的代码实现数据的序列化和反序列化,在Socket通信中进行数据的传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值