十四、系统与环境函数

十四、系统与环境函数

1、Clipboard()

功  能:提取或替换Windows系统剪贴板的文本内容。

语  法:Clipboard ( { string } )

参  数:string:string类型,可选项,指定要复制到系统剪贴板上的文本。如果剪贴板上已有内容的话,该文本将取代剪贴板的当前内容。

返回值:String。函数执行成功时,如果剪贴板上包含文本数据,那么函数返回剪贴板的当前内容;如果剪贴板上包含非文本数据(比如位图)或不包含任何数据,那么函数返回空字符串("")。如果string参数的值为NULL,Clipboard()函数返回NULL。

用  法:无论是否指定string参数,Clipboard()都将返回剪贴板的当前内容。当指定string参数时,剪贴板的原有内容被string参数的值取代;省略string参数时,仅仅得到剪贴板的内容。

示  例:1、下面的代码将剪贴板内容放置到变量ls_CoName中。

        String ls_CoName

        ls_CoName = Clipboard()

2、下面的代码字符串”春眠不觉晓”取代剪贴板原有的内容,并把它保存到变量Heading中。

String Heading

        Heading = Clipboard(”春眠不觉晓”)

 

2、CommandParm()

功  能:得到应用程序运行时指定的命令参数。

语  法:CommandParm ( )

返回值:String。函数执行成功时返回应用程序运行时的命令行参数,函数执行错误或没有命令行参数时函数返回空字符串("")。

用  法:命令行参数是应用程序启动时跟在应用程序名称后面的任何参数,比如,在运行窗口中输入了下述命令:

MyAppl C:\EMPLOYEE\EMPLIST.TXT

那么MyAppl应用程序中使用CommandParm()函数得到的命令行参数为:

C:\EMPLOYEE\EMPLIST.TXT

当应用程序的命令行中包含几个参数时,CommandParm()函数作为一个字符串返回所有参数。利用字符串操作函数可以分离各参数。

在应用对象的Open事件中没有必要执行CommandParm()函数。此时,Open事件的argument参数中包含了命令行参数。

    示  例:string ls_cmd, ls_arg[]

integer i, li_argcnt

// Get the arguments and strip blanks

// from start and end of string

ls_cmd = Trim(CommandParm())

li_argcnt = 1

DO WHILE Len(ls_cmd) > 0

// Find the first blank

    i = Pos( ls_cmd, " ")

    // If no blanks (only one argument),

    // set i to point to the hypothetical character

    // after the end of the string

    if i = 0 then i = Len(ls_cmd) + 1

    // Assign the arg to the argument array.

    // Number of chars copied is one less than the

    // position of the space found with Pos

  ls_arg[li_argcnt] = Left(ls_cmd, i - 1)

    // Increment the argument count for the next loop

    li_argcnt = li_argcnt + 1

    // Remove the argument from the string

    // so the next argument becomes first

    ls_cmd = Replace(ls_cmd, 1, i, "")

LOOP

 

3、DoScript()

功  能:执行AppleScript程序段,该函数只在Macintosh平台上有效。

语  法:DoScript ( script, result )

参  数:script:string类型,指定要运行的程序段(script)result:string类型,由AppleScript程序段返回的结果信息或出错信息。

返回值:Integer。返回由AppleScript返回的结果代码。如果任何参数的值为NULL,DoScript()函数返回NULL。

 

4、GetApplication()

功  能:得到当前应用对象的句柄,这样你可以查询或设置应用对象的属性(通常用于编写通用代码)。

语  法:GetApplication ( )

返回值:Application。返回当前应用对象的句柄。

示  例:下面的代码得到应用对象的句柄,然后关闭工具条的跟随提示。

        Application app

        App = GetApplication()

        App.ToolbarTips = FALSE

        这段代码可以写成如下的简练形式。

        GetApplication().ToolbarTips = FALSE

 

5、GetEnvironment()

功  能:得到操作系统、处理器、屏幕显示等与系统相关的信息。

语  法:GetEnvironment ( environmentinfo )

参  数:environmentinfo:Environment对象名,用于保存系统环境信息。

返回值:Integer。函数执行成功时返回1,发生错误时返回-1。如果参数environmentinfo的值为NULL,GetEnvironment()函数返回NULL。

用  法:当开发交叉平台项目时,利用GetEnvironment()函数,应用程序能够得到当前运行的操作系统、使用的CPU类型、操作系统的版本、屏幕的大小以及颜色数等信息,这些信息的具体表示请参阅本书环境对象(Environment Object)的介绍。

示  例:下面的代码要启动另一个应用程序,由于在不同的操作系统中文件位置及表示方法不同、因此使用GetEnvironment()函数得到当前运行的操作类型系统,然后对不同操作系统使用不同的文件名表示方法。

string path

environment env

integer rtn

rtn = GetEnvironment(env)

IF rtn <> 1 THEN RETURN

CHOOSE CASE env.OSType

CASE aix!

    path = "/export/home/pb_apps/analyze.exe"

CASE Windows!, WindowsNT!

    path = "C:\PB_apps\analyze.exe"

CASE ELSE

RETURN

END CHOOSE

Run(path)

 

6、GetFocus()

功  能:确定当前焦点位于哪个控件上。

语  法:GetFocus ( )

返回值:GraphicObject。函数执行成功时返回当前得到焦点控件的引用,发生错误时返回无效引用。

用  法:应用程序利用IsValid()函数可以检测GetFocus()是否返回有效的控件引用。同时,使用TypeOf()函数可以确定控件的类型。

示  例:下面的代码将当前得到焦点控件的引用赋值给变量which_cont,然后把该控件的Text属性的值赋给一个变量(注意代码中使用了两个对象变量sle_which和和cb_which,目的在于引用相应对象的属性)。

GraphicObject which_control

SingleLineEdit sle_which

CommandButton cb_which

string text_value

which_control = GetFocus()

CHOOSE CASE TypeOf(which_control)

CASE CommandButton!

    cb_which = which_control

    text_value = cb_which.Text

CASE SingleLineEdit!

    sle_which = which_control

    text_value = sle_which.Text

CASE ELSE

    text_value = ""

END CHOOSE

 

7、Handle()

功  能:得到PB窗口型对象的句柄。使用该函数可以得到应用对象、窗口或控件的句柄,但不能得到绘图对象的句柄。

语  法:Handle ( objectname {,previous})

参  数:objectname:要得到句柄的PB对象的名称,该参数可以是除绘图对象外的任何PB对象的名称;

previous:Boolean类型,可选参数。它指明是否想要得到前一个应用对象实例的句柄。其有效值为:False – 返回当前实例的句柄;True --返回前一个应用对象实例的句柄。

返回值:Long。返回指定对象的句柄。如果objectname是一个应用对象,并且previous参数的值为True,那么如果不存在应用对象的前一个实例,该函数返回0。

用  法:如果你的应用程序需要在调用Windows SDK函数或需要在PB Send()函数的参数中使用对象句柄时,那么可以使用Handle()函数得到所需对象的句柄。

示  例:下面的代码得到窗口w_child的句柄,并赋给变量ll_whandle。

        Long ll_whandle

        ll_whandle = Handle(w_child)

 

8、Post()

功  能:将指定消息加入到某个窗口的消息队列中,这个窗口既可以是PowerBuilder应用的窗口,也可以是其它应用的窗口。

语  法:Post( handle, messageno, word, long )

参  数:handle:long类型,指定窗口的系统句柄,将向该窗口邮寄消息;

messageno:UnsignedInteger类型,指定要邮寄的消息号 ;

word:long类型,指定与消息一起邮寄的word类参数值。如果messageno参数指定的消息不使用该参数,那么将这个参数的值设置为0;

long:long类型或string,指定与消息一起邮寄的long型参数值或字符串。

返回值:Boolean。如果任何参数的值为NULL,Post()函数返回NULL。

用  法:Post()函数用于向窗口发送非PowerBuilder预定义事件的消息,这个窗口可以是PowerBuilder应用的窗口,也可以是其它应用的窗口。Post()函数把发送的消息放置在指定窗口消息队列的尾部,然后返回到应用程序中,它并不等待相应事件事件处理程序的执行。这一点与Send()函数不同,Send()函数直接触发指定窗口相应的事件,执行事件处理程序后返回到调用应用中。因此,我们说Post()函数采用的是异步方式,Send()函数采用的是同步方式。

Post()函数的参数handle指定接收消息的窗口句柄,对PowerBuilder窗口来说,使用Handle()函数可以得到该句柄。对其它应用程序的窗口来说,可以调用系统API函数查找窗口并得到相应窗口的句柄。

如果应用程序要邮寄PowerBuilder定义事件(包括预定义事件和用户定义事件),那么使用PostEvent()函数既简单有方便。当应用程序在long参数位置指定一个字符串时,Post()函数复制一个该字符串的副本,然后将副本的地址传送给指定窗口。

示  例:下面的代码向窗口w_date邮寄一个向下滚动一页的消息(消息号为277)。

        Post(Handle(w_date) , 277 , 3 , 0)

 

9、ProfileInt()

功  能:从初始化文件(.ini)中读取整型设置值。

语  法:ProfileInt ( filename, section, key, default )

参  数:filename:string类型,指定初始化文件的名称,可以包括路径,省略路径时,该函数按操作系统的标准路径搜索指定文件;

section:string类型,指定要得到的值所在的节(Section);

key:string类型,指定要得到的值的名称,不用区分大小写;

default:integer类型,当指定的文件、节名、项目名不存在或不能转换为整数时,函数返回该参数指定的值。

返回值:Integer。函数执行成功时,在指定的文件、节名、项目名不存在任何错误的情况下,函数返回相应项的值;如果指定的文件、节名、项目名不存在或不能转换为整数时,函数返回default参数指定的缺省值。如果发生错误,函数返回-1。如果任何参数的值为NULL,ProfileInt()函数返回NULL。

用  法:使用ProfileInt()函数可以得到初始化文件中指定项整数设置的值。初始化文件的格式采用PB.INI文件的格式,由节和项组成,下面是PB.INI文件的一部分。

        [PB]

        CompilerWarnings = 1

        DasherInIdentifiers = 1

        DatabaseWarnings = 1

        [HELP]

        HelpOnStartup = 0

        OnLineRegistrationPath = d:\pb9\pb9\olreg

        HelpPath2 = d:\pb9\pb9

        [DataBase]

        DBMS = ODBC

        DataBase = Dgqb

        UserID = dba

        在初始化文件中,节名使用方括号括起来,项目采用下述格式:

          项目名 = 值

        在ProfileInt()函数中,指定节名和项目名时,不要带芳括号。

        如果应用程序想设置指定项目的值,那么请使用SetProfileString()函数,另外,利用ProfileInt()函数还可以得到Windows操作系统注册表指定项的值。

   示  例:假定应用程序使用C:\PB.INI初始化文件,其内容如上,那么得到PB节DatabaseWarnings项的值的语句可以写为(默认值为1):

        rc = ProfileInt(“C:\PB.INI”,”PB”,”DatabaseWarnings”,1)

 

9、ProfileString()

功  能:从初始化文件(.ini)中读取字符串型设置值。

语  法:ProfileString ( filename, section, key, default )

参  数:filename:string类型,指定初始化文件的名称,可以包括路径,省略路径时,该函数按操作系统的标准路径搜索指定文件;

section:string类型,指定要得到的值所在的节(Section);

key:string类型,指定要得到的值的名称,不用区分大小写;

default:string类型,当指定的文件、节名、项目名不存在时,函数返回该参数指定的值。

返回值:String。函数执行成功时,在指定的文件、节名、项目名不存在任何错误的情况下,函数返回相应项的值;如果指定的文件、节名、项目名不存在,函数返回default参数指定的缺省值。如果发生错误,函数返回空字符串。如果任何参数的值为NULL,ProfileString()函数返回NULL。

用  法:ProfileString()函数的用法与ProfileInt()函数相似,请参看ProfileInt()函数的介绍。需要注意的是,ProfileInt()函数返回的字符串的最大长度为4096字节。

示  例:1、These examples use a file called PROFILE.INI, which contains the following lines. Quotes around string values in the INI file are optional:

[Employee]

Name=Smith

[Dept]

Name=Marketing

2、This statement returns the string contained in keyword Name in section Employee in file C:\PROFILE.INI and returns None if there is an error. In the example, the return value is Smith:

ProfileString("C:\PROFILE.INI", "Employee", "Name", "None")

3、The following statements open w_marketing if the string in the keyword Name in section Department of file C:\PROFILE.INI is Marketing:

IF ProfileString("C:\PROFILE.INI", "Department", &

   "Name", "None") = "Marketing" THEN

   Open(w_marketing)

END IF

 

10、Restart()

功  能:停止所有程序段的执行、关闭所有窗口、提交事务、断开与数据库的连接,然后重新启动应用程序。

语  法:Restart()

返回值:Integer。函数执行成功时返回1,发生错误时返回-1。

 

11、Run()

功  能:运行指定的应用程序。

语  法:Run ( string {, windowstate } )

参  数:string:string类型,指定要运行的应用程序的名称,其中可以包括路径以及相应的参数,就像在命令行中键入的那样;

windowstate:WindowState枚举类型,可选项,指定程序运行时的窗口状态。有效取值为:Maximized! - 最大化窗口;Minimized! - 最小化窗口;Normal! - 缺省值,正常窗口。

返回值:Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,Run()函数返回NULL。

用  法:使用Run()函数,应用程序能够启动操作系统中的任何程序。当在Run()参数中指定了要启动应用程序的参数时,参数的意义、格式、个数等由具体的应用程序确定。如果在Run()函数的string参数中指定了文件名但没有给出扩展名时,PowerBuilder认为该文件的扩展名为.EXE。要运行扩展名不是.EXE的应用程序(比如.BAT, .COM, 或.PIF),必须在Run()函数的参数中指定文件的扩展名。

示  例:运行记事本程序。Run(“Notepad”)

 

12、Send()

功  能:向窗口发送指定的消息并立即执行相应的事件处理程序。

语  法:Send( handle, messageno, word, long )

参  数:handle:long类型,指定窗口的系统句柄,将向该窗口发送消息;

messageno:UnsignedInteger类型,指定要发送的消息号;

word:long类型,指定与消息一起发送的word类参数值。如果messageno参数指定的消息不使用该参数,那么将这个参数的值设置为0;

long:long类型或string,指定与消息一起发送的long型参数值或字符串。

返回值:Long。函数执行成功时返回Windows系统调用SendMessage()的返回值,发生错误时返回-1。如果任何参数的值为NULL,Send()函数返回NULL。

用  法:Send()函数用于向窗口发送非PowerBuilder预定义事件的消息,这个窗口可以是PowerBuilder应用的窗口,也可以是其它应用的窗口。Send()函数直接触发指定窗口相应的事件,执行事件处理程序后返回到调用应用中,这一点与Post()函数不同,Post()函数把发送的消息放置在指定窗口消息队列的尾部,然后返回到应用程序中,它并不等待相应事件事件处理程序的执行。因此,我们说Post()函数采用的是异步方式,Send()函数采用的是同步方式。

Send()函数的参数handle指定接收消息的窗口句柄,对PowerBuilder窗口来说,使用Handle()函数可以得到该句柄。对其它应用程序的窗口来说,可以调用系统API函数查找窗口并得到相应窗口的句柄。实际上,Send()函数把它的各个参数直接传送给Windows的系统调用SendMessage()。在各种C++开发工具的WINDOWS.H文件中可以查到各消息编号。

如果应用程序要发送PowerBuilder定义事件(包括预定义事件和用户定义事件),那么使用TriggerEvent()函数既简单有方便。

当应用程序在long参数位置指定一个字符串时,Send()函数复制一个该字符串的副本,然后将副本的地址传送给指定窗口。

示  例:1、下面的代码向窗口w_date发送一个向下滚动一页的消息(消息号为277)。

        Send(Handle(w_date) , 277 , 3 , 0)

2、下面的代码触发命令按钮cb_OK的clicked事件。

Send(Handle(parent) , 273 , 0 , Handle(cb_OK))

        Cb_OK.TriggerEvent(Clicked!)

 

13、SetProfileString()

功  能:设置初始化文件中指定项的值。

语  法:SetProfileString ( filename, section, key, value )

参  数:filename:string类型,指定初始化文件的名称,可以包括路径,省略路径时,该函数按操作系统的标准路径搜索指定文件;

section:string类型,指定要设置的值所在的节(Section);

key:string类型,指定要设置的值的名称,不用区分大小写;

default:string类型,指定要设置项的值。

返回值:Integer。函数执行成功时返回1,指定的文件未找到或指定的文件不能访问时函数返回-1。如果任何参数的值为NULL,SetProfileString()函数返回NULL。

用  法:使用SetProfileString()函数可以设置初始化文件中指定项整数设置的值。初始化文件的格式采用PB.INI文件的格式,由节和项组成,下面是PB.INI文件的一部分。

        [PB]

        CompilerWarnings = 1

        DasherInIdentifiers = 1

        DatabaseWarnings = 1

        [HELP]

        HelpOnStartup = 0

        OnLineRegistrationPath = d:\pb9\pb9\olreg

        HelpPath2 = d:\pb9\pb9

        [DataBase]

        DBMS = ODBC

        DataBase = Dgqb

        UserID = dba

        在初始化文件中,节名使用方括号括起来,项目采用下述格式:

          项目名 = 值

        在ProfileInt()函数中,指定节名和项目名时,不要带芳括号。

        如果应用程序想得到指定项目的值,那么请使用ProfileString()函数或ProfileInt()函数。

        示  例:假定应用程序使用C:\PB.INI初始化文件,其内容如上,那么把[DataBase]节UserID项的值设置为dba的语句可以写为:

        SetProfileString(“C:\PB.INI”,”DataBase”,”UserID”,”dba”)

 

14、ShowHelp()

功  能:显示应用程序帮助,该帮助使用Microsoft Windows帮助系统进行操作。

语  法:ShowHelp ( helpfile, helpcommand {, typeid } )

参  数:helpfile:string类型,指定帮助文件的名称;

helpcommand:HelpCommand枚举类型,指定显示帮助的格式。有效取值为:Index! - 显示目录主题,使用该值时不要指定;

typeid;Keyword! - 转移到由指定关键字确定的主题;Topic! - 显示指定主题的帮助typeid:可选项,指定帮助主题。

返回值:Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,ShowHelp()函数返回NULL。

示  例:1、This statement displays the Help index in the INQ.HLP file:

ShowHelp("C:\PB\INQ.HLP", Index!)

2、This statement displays Help topic 143 in the file EMP.HLP file:

ShowHelp("EMP.HLP", Topic!, 143)

3、This statement displays the Help topic associated with the keyword Part# in the file EMP.HLP:

ShowHelp("EMP.HLP", Keyword!, "Part#")

4、This statement displays the Help search window. The word in the box above the keyword list is the first keyword that begins with M:

ShowHelp("EMP.HLP", Keyword!, "M")

 

15、SignalError()

功  能:触发应用对象的SystemError事件,通常用于代码调试。

语  法:SignalError ( { number }, { text } )

参  数:number:integer类型,可选项,其值将保存到Error对象的number属性中;

text:string类型,可选项,其值将保存到Error对象的text属性中。

返回值:Integer。函数执行成功时返回1,发生错误时返回-1。

示  例:These statements set values in the Error object and then trigger a SystemError event so the error processing for these values can be tested:

int error_number

string error_text

Error.Number = 1010

Error.Text = "Salary must be a positive number."

Error.Windowmenu = "w_emp"

Error_number = Error.Number

Error_text = Error.Text

SignalError(error_number, error_text)

 

16、Yield()

功  能:将控制权转移给其它图形对象,包括非PowerBuilder对象。该函数检测消息队列,如果有消息,就把消息取出。利用该函数可以在执行耗时较长的操作时把控制权转让给其它应用。

语  法:Yield()

返回值:Boolean。如果在消息队列中提取到了消息,那么函数返回TRUE,否则返回FALSE。

用  法:正常情况下,PowerBuilder应用程序在执行一段代码(比如函数或事件处理程序)的过程中不响应用户的操作。对耗时短暂的代码段来说,这种处理方式没有什么不妥的地方,但是,如果某个代码段的执行耗时较长,应用程序又希望为用户提供更多的控制权,那么需要在这段代码中插入Yield()函数,让用户能够进行其它操作,特别在循环执行的代码中更应该如此。

应用程序执行Yield()函数后,如果发现消息队列中存在消息,它将允许对象处理这些消息,处理之后,继续Yield()函数后面代码的执行。因此,代码中插入Yield()函数将降低应用程序的运行效率。

示  例:下面的代码执行一段耗时比较长的过程,在其中我们插入了Yield()函数,当用户单击窗口上的”取消”按钮时,终止这段代码的执行,其中使用共享变量sb_interrupt来指示是否单击了”取消”按钮。

        Integer n

        //sb_interrupt是共享变量

        sb_interrupt = FALSE

        FOR n = 1 TO 3000

            Yield()

            IF sb_interrupt THEN

               //sb_interrupt的值在”取消”按钮的Clicked事件处理程序中修改

               Messagebox(“调试!”,”用户中断!”)

               Sb_interrupt = FALSE

               EXIT

            ELSE

               …  //其他处理

            END IF

        END FOR

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在软件开发中,我们经常需要使用系统函数来完成一些操作,例如文件读写、网络通信等。但在某些情况下,我们需要在测试或调试时模拟系统函数的行为,以便更好地控制测试环境,这时就需要使用mock系统函数了。 Mock系统函数的一般步骤如下: 1. 定义一个和系统函数签名一致的mock函数,用于替换系统函数。 2. 在测试或调试时,将系统函数的调用替换为mock函数。 3. 在mock函数中模拟系统函数的行为,例如返回一个预设的值或抛出一个异常。 下面是一个C语言的例子,演示如何mock系统函数fopen(): ```c #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <stddef.h> #include <setjmp.h> #include <cmocka.h> /* 定义mock函数 */ FILE *mock_fopen(const char *filename, const char *mode) { check_expected_ptr(filename); check_expected_ptr(mode); return mock_ptr_type(FILE*); } /* 替换系统函数fopen() */ #define fopen mock_fopen /* 测试用例 */ static void test_fopen(void **state) { (void) state; /* unused */ /* 预设mock函数的返回值 */ expect_string(mock_fopen, filename, "/tmp/test.txt"); expect_string(mock_fopen, mode, "r"); will_return(mock_fopen, (FILE*)0x1234); /* 调用被测试函数 */ FILE *fp = fopen("/tmp/test.txt", "r"); /* 断言结果是否正确 */ assert_true(fp == (FILE*)0x1234); } int main(void) { const struct CMUnitTest tests[] = { cmocka_unit_test(test_fopen), }; return cmocka_run_group_tests(tests, NULL, NULL); } ``` 在上面的例子中,我们使用了cmocka测试框架来mock系统函数fopen()。首先,我们定义了一个mock函数mock_fopen(),它和系统函数fopen()的签名一致。然后,我们使用宏#define将系统函数fopen()替换为mock函数mock_fopen()。接着,我们在测试用例test_fopen()中预设mock函数的返回值和参数,并调用fopen()函数。最后,我们使用断言来判断测试结果是否正确。 需要注意的是,使用mock系统函数时需要确保替换后的函数能够正确地模拟系统函数的行为,否则可能会导致测试结果不准确。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值