PowerBASIC 实用函数.docx_第1页
PowerBASIC 实用函数.docx_第2页
PowerBASIC 实用函数.docx_第3页
PowerBASIC 实用函数.docx_第4页
PowerBASIC 实用函数.docx_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

下列函数用来操作文件和操作系统特性: CHDIR 改变给定驱动器的当前目录 CHDRIVE 改变当前缺省驱动器 COMMAND$ 返回用于启动程序的命令行 CURDIR$ 返回给定驱动器的当前目录 DATE$ 设置或检索系统日期 DESKTOP GET CLIENT 检索桌面上客户区域的尺寸大小,单位是像素 DESKTOP GET LOC 检索桌面上客户区域左上角的位置,单位是像素 DESKTOP GET SIZE 返回整个桌面的大小,单位是像素 DIR$ 返回匹配给定掩码的文件名 DIR$ CLOSE 强制释放操作系统的“查找下一个”操作 DISKFREE 返回某个磁盘可用空间的容量,单位是字节 DISKSIZE 返回某个磁盘的总容量,单位是字节 ENVIRON 修改当前程序的环境变量表 ENVIRON$ 从当前程序的环境变量表检索信息 FILEATTR 返回某个已打开文件的信息 FILECOPY 拷贝文件 FILENAME$ 返回某个已打开文件的文件名 FLUSH 刷新磁盘缓存已保证磁盘信息是最新的 GETATTR 返回磁盘文件或目录的文件系统属性 HOST ADDR 将主机名转换为相应的IP地址 HOST NAME 转换IP地址为相应的主机名 KILL 删除某个磁盘文件 LPRINT 输出文本和数据到打印设备 LPRINT ATTACH 立即连接到一个行打印设备 LPRINT CLOSE 断开当前的打印机 LPRINT FLUSH 刷新任何剩余打印数据到打印设备 LPRINT FORMFEED 发送走纸符号到打印机 LPRINT$ 返回LPRINT操作所使用的当前打印设备 MKDIR 建立一个目录 NAME 重命名一个文件或目录 OPEN 准备一个文件或设备以进行读写 PRINTER$ 检索打印机名称和打印机端口名 PRINTERCOUNT 返回可用打印机的数量 RGB 返回组合的RGB颜色值 RMDIR 删除一个磁盘目录 SETATTR 设置某个磁盘文件或目录的文件系统属性 SETEOF 截断/扩展一个文件为当前读写位置 SHELL 异步运行一个可执行程序 SHELL 同步运行一个可执行程序 SLEEP 将当前线程暂停指定的毫秒数ASM 标识一个汇编语言语句 BEEP 通过计算机的扬声器播放默认的 Windows 声音 REM 指示代码行中的剩余内容为注释RGB函数用途 返回一个用于Windows API 调色板和GDI函数的RGB颜色值。 语法 value& = RGB(red%, green%, blue%) 注释 red%, green% and blue% 为0 到 255 之间的数值, 各自代每种颜色的亮度。如果一个颜色值为负数,将等同于0;如果大于255,将等同于255。value& 是一个长整型的组合颜色。BGR函数用途 将RGB颜色值转换为BGR格式。 语法 bgrColor& = BGR(rgbColor&) 注释 RGB值是长整型的数值,范围在0到&H00FFFFFF的,它用来为多种PowerBASIC函数和Windows API函数指定精确的颜色值。低三位字节分别指定颜色组合中蓝-绿-红三种颜色,字节0(最低位的字节)代表红色值,字节1表示绿色,字节2表示蓝色;即“蓝-绿-红”这样的排列顺序。它们的取值范围在0到255。字节3(最高位的字节)固定为0。 一些Windows API函数,比如涉及设备无关性位图 (DIB)的函数,要求的颜色值为相反的顺序(红绿蓝而不是蓝绿红)。为最佳化性能和速度,PowerBASIC语句和函数参考了这种结构,也使用BGR格式。这些语句有 GRAPHIC GET BITS and GRAPHIC SET BITS。 BGR函数将RGB值转换为BGR格式,相当于将第一字节(最低位字节)和第三字节交换,再次调用BGR函数,将会把BGR值转换为原始的RGB格式。比如RGB值为&H0000FF,BGR函数会把它转换为&HFF0000,再次执行BGR函数,将又变成&H0000FF。下列函数用来建立和管理线程: THREADED 声明线程局部存储变量 THREAD CLOSE 关闭一个线程 THREAD CREATE 建立一个线程 THREAD RESUME 恢复执行暂停的线程 THREAD STATUS 检索线程状态 THREAD SUSPEND 挂起一个线程(暂停执行) THREADCOUNT 返回模块内活动线程的数量 THREADID 返回一个长整型的当前线程的线程标识符下列函数操作编译器的动作: %DEF 检测一个等式是否在先前已经定义 #BLOAT 人工增加编译后程序磁盘影象文件的大小 #COMPILE 决定编译器要建立什么类型的文件 #COMPILER 定义本程序所要使用的编译器 #DIM 指定变量在使用前是否必须声明 #IF 定义源代码段,这个代码段会被编译或忽略 #REGISTER 管理寄存器变量的自动分配 #STACK 设定堆栈的最大值 #TOOLS 允许或禁止编译代码中的集成开发工具代码 DECLARE 显式声明子程序或函数 DEFBYT 声明确省的变量类型为字节类型 DEFCUR 声明确省的变量类型为货币类型 DEFCUX 声明确省的变量类型为扩展货币类型 DEFDBL 声明确省的变量类型为双精度类型 DEFDWD 声明确省的变量类型为双字类型 DEFEXT 声明确省的变量类型为扩展精度类型 DEFINT 声明确省的变量类型为整型 DEFLNG 声明确省的变量类型为长整型 DEFQUD 声明确省的变量类型为四倍整型 DEFSNG 声明确省的变量类型为单精度类型 DEFSTR 声明确省的变量类型为字符串 DEFWRD 声明确省的变量类型为字类型 DIM 定义数组、变量、指针 ERASE 释放数组内存 GLOBAL 定义全局变量 LOCAL 定义子程序和函数内的局部变量 MACRO 定义一行或多行的文本代替块(宏) OPTION EXPLICIT 强制显式声明所有变量 PBMAIN 为程序定义一个初始的入口函数 PROFILE 捕获子程序和函数执行占用时间并把记录保存在指定的文件内 REDIM 声明动态数组,分配、释放、再分配内存 REGISTER 定义子程序或函数内部的局部寄存器变量 STATIC 定义子程序或函数内部的静态变量 STRPTR 返回变长字符串内数据在内存里的地址 VARPTR 返回变量或字符串句柄在内存里的地址 WINMAIN 为程序定义一个初始的入口函数LOF function LOF 函数目的:返回已打开磁盘文件的长度。 语法:y& = LOF(# filenum&) 注释:filenum&是已打开文件的文件号(句柄)。LOF返回文件的大小,单位是字节,类型为Quad-integer。其中“#”可省略,但为了代码清晰,推荐使用。 示例: OPEN RECIPES.DAT FOR BINARY AS #1 x& = LOF(1) CLOSE #1STRDELETE$ function STRDELETE$ 语句用途:从字符串表达式中删除指定数量的字符。 语法:s$ = STRDELETE$(string_expression, start&, count&) 备注:返回字符串表达式 string_expression 的一份拷贝,但是从 start& 位置开始的 count& 个字符已被删除。字符串表达式中的第一个字符的位置为1。 参见:STRINSERT$, STRREVERSE$ 示例:a$ = STRDELETE$(PowerBASIC, 4, 2) 此时,变量a$中包含的字符为 PowBASIC。TCP ACCEPT statement TCP ACCEPT 语句用途:接受从指定 TCP/IP 端口进来的通讯请求。 语法:TCP ACCEPT # fNum& AS newfNum& 备注:接受进来的连接请求到 fNum& socket,并建立一个 newfNum& socket 句柄,以使用新的连接进行通讯。 TCP ACCEPT 只有在 sockets 以 TCP OPEN SERVER 的方式打开时才有效TCP SEND statement TCP SEND 语句目的:将一个字符串写入到指定的 TCP/ IP 端口。 语法:TCP SEND # fNum&, string_expression 备注:将一个字符串写入到由 fNum& 指定的 TCP/IP 端口。 TCP SEND 语句在字符串发送出去后才返回。这意味着,TCP SEND 是一个同步或“阻塞”语句。 如果超时,ERR 将会被设置,指示“运行时错误”,错误号24(“设备超时”)。请参见 TCP OPEN 语句以了解如何指定 TCP socket 的超时值。TCP RECV statement - TCP RECV 语句用途:从指定的 TCP/IP 端口接受数据。 语法:TCP RECV # fNum&,count&,Buffer$ 备注:从 fNum& 指定的 TCP/IP 端口接受 count& 个字节的数据,并将接收到的数据放入变量 Buffer$ 里。如果数据不足 count& 字节,Buffer$ 变量将接收实际字节数的数据,并且 EOF(fNum&)函数将返回 TRUE(非零)。 通常使用一个循环来接收数据流。有下列情况之一,应当结束 TCP RECV 循环:Buffer$ 返回空字符串、EOF(fNum&)函数返回 TRUE 值、ERR 被设置。 如果出现超时,ERR 将会被设置为“运行时错误,错误号 24(“设备超时”)。请参见“TCP OPEN”语句以了解如何指定 TCP socket 的超时值。TCP PRINT statement TCP PRINT 语句目的:写一个字符串到 TCP/IP 端口。 语法:TCP PRINT # fNum&, string_expression; 注释:将字符串表达式中的数据写入到 TCP/IP 端口。如果缺省的“;”没有被指定,回车换行符($CRLF 或 CHR$(13,10)也会被发送。 TCP PRINT 语句不会返回,直到数据被发送,或错误出现。即,TCP PRINT 是一个同步语句或“阻塞”语句。 如果超时,ERR会被设置为运行时错误,错误号24(“设备超时”)。请参见“TCP OPEN”语句如何指定 TCP socket 超时值。TCP CLOSE statement - TCP CLOSE 语句用途:关闭以前打开的 TCP/IP 端口。 语法:TCP CLOSE # fNum& 备注:关闭以前打开的由 fNum& 指定的 TCP/IP 端口。 示例:TCP CLOSE #1TCP OPEN statement TCP OPEN 语句用途:允许应用程序使用 TCP/IP 协议(基于Winsock)与 TCP/IP 服务器或客户端通迅。 语法:做为客户端:TCP OPEN PORT p& | srvc$ AT host$ AS # fNum& TIMEOUT timeoutval&做为服务器:TCP OPEN SERVER ADDR ip& PORT p& | srvc$ AS # fNum& TIMEOUT timeoutval&备注: 打开一个 TCP/IP 端口或服务用来通讯,无论是作为客户或服务器。 SERVER 如果包含关键字“server”,TCP 端口是以服务器端的方式打开的;否则,是以客户端的方式打开的。 ADDR ip& 做为服务器端,如果你指定了可选的 ADDR ip&, TCP 服务器用指定的 IP 地址进行连接;否则,缺省使用计算机的主 IP 地址。 PORT p& 做为客户端,PORT 指示客户端尝试连接的服务器端口。做为服务器端,PORT 指示使用哪个端口用来监视连接请求。PORT p& 与 srvc$ 两者同时只能指定一个,不能同时使用。 srvc$ 如果端口号没有被指定,那么必须使用一个服务名来代替。一个服务名的表现形式为“http”、“smtp” 或 “ftp”,等等。 AT host$ 作为一个客户端来讲, host$表示要连接的主机,主机可以是像“”形式的域名,也可以是 IP 地址,比如“”。 fNum& 一个文件号,比如 #1,或者是个包含用 FREEFILE 函数获得值的变量。 TIMEOUT 可选,允许你指定 TCP SEND、RECV、PRINT,或 LINE 操作的超时值,单位是毫秒。如果在指定的时间内没有反应,TCP 操作会失败,并且系统变量 ERR 会被设置为运行时错误(设备超时)。缺省的 timeout 值为 60000 毫秒 (60 秒)。 示例: 客户端 TCP/IP 示例 - 接受一个 Web 页 程序首先打开“HTTP”服务并连接到指定的站点,随后发送页面请求,然后接受页面数据,完毕后关闭端口,并显示接受到的数据。#COMPILE EXE #DIM ALLFUNCTION PBMAIN () AS LONG LOCAL Buffer$, Site$ LOCAL Entire_page$, Htmlfile$, Link$ LOCAL Pos&, Length&Site$ = Htmlfile$ = /dict/index.asp?w=sex 连接. TCP OPEN http AT Site$ AS #1 TIMEOUT 60000 连接成功了么? IF ERR THEN BEEP EXIT FUNCTION END IF 发送 GET 请求. TCP PRINT #1, GET & Htmlfile$ & HTTP/1.0 TCP PRINT #1, User-Agent: TCP OPEN 示例) TCP PRINT #1, 接受页面. DO TCP RECV #1, 4096, Buffer$ Entire_page = Entire_page + Buffer$ LOOP WHILE ISTRUE LEN(Buffer$) AND ISFALSE ERR 关闭 TCP/IP 端口. TCP CLOSE #1 显示接受到的数据. MSGBOX Entire_pageEND FUNCTIONTHREADID function THREADID 函数用途:返回当前线程的线程标识,类型为长整型。 语法:ghtdID& = THREADID 备注:线程标识返回自当前正在执行的线程。线程标识可供 Windows 提供的各个(高级)线程相关 API 函数所使用。 限制:线程标识不能和由 THREAD CREATE 语句返回的线程句柄互换使用。ACODE$ function ACODE$ 函数用途:将一个 Unicode 字符串转换为 ANSI 字符串。 语法:a$ = ACODE$(UnicodeStrExpression) 备注:Unicode 字符串中一个字符占用两个字节,而 ANSI 字符串(本地 PowerBASIC 字符串格式)中一个字符占用一个字节。可见,ACODE$ 返回的字符串占用的字节数为 Unicode字符串的一半,但仍提供相同数量的字符。要将 ANSI 字符串转换为 Unicode 字符串,请使用 UCODE$ 函数。STRREVERSE$ function STRREVERSE$ 函数用途:颠倒字符串表达式中的内容。 语法:s$ = STRREVERSE$(sMain$) 示例:a$ = STRREVERSE$() 返回 nc.cisabrewopSTRINSERT$ function STRINSERT$ 函数用途:将一个字符串插入到另一个字符串中的指定位置。 语法:a$ = STRINSERT$(sMain$, sNew$, position&) 备注:返回一个包含 sMain$ 的字符串,并且 sNew$ 插入到新字符串中 position$ 指定的位置。如果 position& 大于 sMain&的长度,sNew& 将附加到 sMain$ 的尾部。字符串中第一个字符的位置为1。 示例:a$ = STRINSERT$(PowerBASIC, ful, 6) 返回 PowerfulBASICSTR$ function STR$ 函数用途:将数字转换成可以用来显示的字符串形式。 语法:s$ = STR$(数字表达式,位数) 注释:STR$ 函数返回数字变量或表达式的字符串表现形式。位数是个可选的整型表达式,用来指示出现在结果中的数字的最大位数。如果数字表达式大于等于0,STR$ 将添加空格前导符;如果数字表达式小于0,STR$ 将添加-前导符。句个例子,STR$(14)返回包含三个字符的字符串,第一个字符是空格,第二个是1,第三个是4。可以使用 LTRIM$ 去掉字符串前边的空格。位数指定结果中数字的最大位数(1-18)。 示例:如下代码可以显示变量 a& 的值,直接使用 MSGBOX a& 则在编译时会提示错误。 FUNCTION PBMAIN () AS LONG a& = 2 MSGBOX STR$(a&) END FUNCTION DESKTOP GET SIZE 语句用途:获得整个桌面的大小,单位为像素。 语法:DESKTOP GET SIZE TO ncWidth&, ncHeight& 注释:桌面大小包括任务栏,和屏幕大小一样。通过此语句,我们可获得屏幕的分辨率。 示例:FUNCTION PBMAIN () AS LONG DESKTOP GET SIZE TO ncWidth&, ncHeight& MSGBOX 当前屏幕分辨率 + STR$(ncwidth&) + + STR$(ncheight&) END FUNCTION - 相关语句简介: 1.DESKTOP GET LOC TO x&,y& 获得桌面左上角在屏幕上的位置。当任务栏在屏幕左边或上边时,此语句有效;在屏幕右边和下边时,得到的值始终为(0,0)。 2.DESKTOP GET CLIENT TO ncWidth&,ncHeight& 获得屏幕的大小,不包括任务栏。CURDIR$用途:返回指定驱动器的当前目录。 语法:s$ CURDIR$(dirve$) 备注:dirve$是个可选的字符串表达式,包含目标磁盘驱动器的磁盘标识符。如果 dirve$ 没有指定或是个空的字符串,将返回当前磁盘的当前目录路径。 示例:FUNCTION PBMAIN LOCAL FullCurrentPath$ LOCAL CurrentDrive$ FullCurrentPath$ = CURDIR$ (C) IF MID$(FullCurrentPath$,2,1) = : THEN CurrentDirve$ = LEFT$(FullCurrentPath$,2) END IF MSGBOX FullCurrentPath$,CurrentDirve$ END FUNCTIONMKDIR 创建目录用途:创建一个目录(与 DOS 命令 MKDIR 相似)。 语法:MKDIR path$ 备注:path$是一个字符串表达式,描述要创建的目录。 MKDIR 创建 path$ 指定的目录。如果要创建的目录已存在,会出现运行时错误75(“路径/文件存取错误”)。如果 path$ 包含的父目录不存在,会出现运行时错误76(“路径未找到”)。MKDIR 可以使用长文件名系统(LFNs)。 示例:MKDIR C:Program FilesCompanyApplication DataRMDIR 语句用途:删除磁盘目录,与 DOS 命令 RMDIR 类似。 语法:RMDIR path$ 备注:RMDIR 删除 path$ 指定的目录。这个语句与 DOS 命令 RMDIR 或 RM 相似,要求路径必需有效、不能是空目录;否则会出现运行时错误75(“路径或文件存取错误”)。RMDIR 可以使用长文件名系统(LFNs)。 示例:DirectoryName$ = TEMP RMDIR DirectoryName$Random Access files 随机存取文件随机存取文件由可按任意顺序存取的记录组成。 你可以使用下面的步骤来读、写、创建随机文件: 1. 首先,打开文件并指定记录的长度: OPEN filespec FOR RANDOM AS #filenum LEN = recordsize LEN 参数指定记录的长度,单位是字节。若没有指定 LEN 参数,PowerBASIC 将使用确省值 128。和顺序文件不同,你不要需要声明打开文件是要读还是写,因为在随机文件操作中你可以同时进行读写操作。 2. 使用 TYPE 语句定义一个记录结构。 TYPE StudentRecord ID AS STRING * 6 学号 Name AS STRING * 15 姓名 Contact AS STRING * 30 紧急联系人 ContactPhone AS STRING * 14 紧急联系电话 ContactRel AS STRING * 8 紧急联系人关系 END TYPE DIM Student AS StudentRecord 3. 填写记录内容,然后使用 PUT 语句将记录写到文件中。 Student.ID = 050821 Student.Name = 张三 Student.Contact = 李霞 Student.ContactPhone =Student.ContactRel = 母亲 PUT #fileNumber, recordNumber, Student 4. 使用 GET 语句从文件中读记录。 GET #fileNumber, recordNumber, Student 5. 操作结束,关闭文件。Sequential Files 顺序文件顺序文件技术提供一个简单的方法来读写文件。PowerBASIC使用顺序文件命令操作文本文件(使用回车换行符分割开的ASCII字符文件)。 输出(写)数据到顺序文本文件: 1.使用顺序写模式打开文件。在 PowerBASIC 中要建立一个文件,你必需使用 OPEN 语句。顺序文件有两个选项来为输出(写)数据准备文件: OUTPUT:如果文件不存在,将创建新的文件。如果文件已存在,它的内容将被删除,文件被处理成和新文件一样。 APPEND:如果文件不存在,将创建新的文件。如果文件已存在,PowerBASIC 将追加数据到文件的尾部。 2.输出(写)数据到文件。使用 WRITE# 或 PRINT# 写数据到顺序文件。 3.关闭文件。CLOSE 语句将在程序完成所有的读写操作后关闭文件。 读顺序文本文件: 1.首先,以顺序读模式打开文件。 2.从文件中读取数据。使用 PowerBASIC 的 INPUT# 或 LINE INPUT# 语句。 3.关闭文件。CLOSE 语句在程序完成所有的读写操作后将关闭文件。files 文件的读写要在磁盘上存储和检索信息,PowerBASIC 为我们提供了三种不同的方法:顺序文件、随机文件、二进制文件。每种方法都有它的优缺点,究竟使用那种方法好,需要看你的应用。这章我们将致力于定义和描述这三种文件的输入、输出。算术运算算术运算进行普通的数学运算。有几个操作符值得一说。斜线表示整除。整除将操作数四舍五入为整数,结果为没有余数的商。例如,52的值为2,910的值为0。当使用整数类型的变量或表达式时,整除比浮点除的速度要快得多。 整除的余数可用取模操作 MOD(取模操作对所有的数字类型都有效)得到。取模操作与整除相似,不同的是返回值为余数,而不是商。例如:5 MOD 2 返回值1,9 MOD 10 返回值9。 ISTRUE 操作只有在操作数为真(非零值)时返回真值。如果ISTRUE的值为零,保证返回 -1 ,但是运算可以返回任意非零值。 ISFALSE 操作只有在操作数为假(零)的情况下返回真值。如果ISFALSE的值为零,ISFALSE保证返回值为 -1 ,但是运算可以返回任意非零值。 在进行运算和赋值的时候,PowerBASIC不检测数字溢出或溢出错误,请参阅错误和错误捕获的相关章节以获得更多信息。 操作符操作例子 求幂104 - 求反-16 * 乘45 * 19 / 浮点除45 / 19 整除45 19 MOD 求模45 MOD 19 + 加45 + 19 - 减45 - 19 ISFALSE Boolean False ISFALSE 45 ISTRUE Boolean TrueISTRUE 19 NOT, AND, 二进制处理运算NOT 0, 45 AND 19 OR, XOR 45 OR 19, 45 XOR 19 EQV, IMP45 EQV 19, 45 IMP 19MSGBOX语句用途 显示一个消息框,包括文本串和可选的标题,可以使用一个或多个样式。 语法 MSGBOX txt$ , style&, title$ ? txt$ , style&, title$ 注释 MSGBOX 语句包括以下元素: txt$消息框里显示的文本。 style&可选参数,决定消息框的外观。某些样式可以组合,来指定显示在消息框内的按钮和图标。如果style&被忽略,PowerBASIC使用%MB_OK。下面是MSGBOX语句使用的一些比较普通的样式(可以参考MSGBOX函数以获得更详细的信息): %MB_OK显示“确定”按钮(确省) %MB_ICONERROR 显示错误图标(停止符号) %MB_ICONINFORMATION 显示信息图标(“i”) %MB_ICONWARNING 显示警告图标(惊叹号) %MB_APPLMODAL 应用程序模式。不管它的名字,在不关闭该对话框的情况下,用户可以继续与其它对话框交互。 %MB_SYSTEMMODAL 系统模式。操作与%MB_APPLMODAL相同,不同的是对话框具有%WS_EX_TOPMOST样式,所以它会保持在所有其它窗口和对话框之上。 %MB_TASKMODAL 任务模式。属于当前应用程序的所有顶层窗口都变成禁止状态(变灰,无法使用鼠标和键盘操作),直到对话框被解除(关闭)。%MB_TASKMODAL一般用来显示真实的模式对话框。 其它的样式(风格)可以在文件WIN32API.INC中带有前缀%MB的部分找到。如果你想知道用户点击了那个按钮,应该使用MSGBOX函数而不是MSGBOX语句。 title$显示在对话框标题栏中的标题。如果title$没有被指定,将自动使用“PowerBASIC”。 MSGBOX语句可用问号“?”来代替。这与PowerBASIC Console Compile (PB/CC)中的情况相似,在那里,问号为打印语句的同义词。这可以简化某些测试代码的创建,因为在两个编译器里问号提供了相似的功能。 限制 如果字符串包含多个$NUL字符,MSGBOX函数只显示第一个$NUL前的字符。 示例 MSGBOX 来,这儿,点击确定继续, 123子程序的标题 MSGBOX X% 的当前值是: & STR$(x%) MSGBOX 暂停, 点击确定继续! MSGBOX 点击确定以重新启动, %MB_TASKMODAL OR %MB_ICONERROR, 安装完成!PBLIBMAIN用途PBLIBMAIN提供与DLLMAIN/LIBMAIN相似的功能,只是PBLIBMAIN不需要参数。 语法FUNCTION PBLIBMAIN () AS LONG 注释参见LIBMAIN/DLLMAIN以获得更多信息。LIBMAIN函数用途 LIBMAIN是一个可选的用户自定义函数,当每次将DLL载入内存或从内存中卸载的时候,Windows会调用它。DLLMAIN是LIBMAIN的同义词。PBLIBMAIN 函数提供与 LIBMAIN 类似的功能,但是不需要参数。 语法 FUNCTION LIBMAIN | DLLMAIN ( BYVAL hInstance AS DWORD, BYVAL lReason AS LONG, BYVAL lReserved AS LONG ) AS LONG 在32位 Windows 中,LIBMAIN 用来在当程序(进程)每次将DLL载入内存或从内存中卸载、线程启动或停止的时候被Windows调用。你的代码永远别调用LIBMAIN。 注释 LIBMAIN/DLLMAIN 函数提供以下参数: hInstance DLL的唯一实例句柄。这个句柄用来被调用DLL的程序标识该DLL。实例句柄的值通常用来加载封装在DLL内的资源,并得到DLL实际的文件名(通过API函数GetModuleFilename)。在这些情况下,拷贝实例句柄的值到全局变量,以允许将实例句柄的值运用到DLL内的其它地方。 lReason 这个标志表明DLL入口为何被调用。它可以是以下值当中的一个(依照WIN32API.INC中的定义): %DLL_PROCESS_ATTACH 表示DLL由其它进程加载(其它DLL或EXE加载了该DLL)。DLLs可以利用这个机会初始化任一实例或全局数据,比如数组。如果DLL被使用LoadLibrary()显式加载(运行时链接),lReserved是值0;如果DLL是在进程初始化阶段被隐式加载(装入时链接),lReserved的值为非0值。 %DLL_PROCESS_DETACH 表示 DLL被卸载或被调用的程序分离。DLLs可以利用这个机会清除已知的附在DLL上的所有线程上的所有资源。这与16位DLLs的WEP函数的功能等效。如果LIBMAIN函数是通过FreeLibrary API执行的,或DLLs引用计数达到0(没有更多的实例被加载)lReserved的值为0;如果由于进程被终止期间执行LIBMAIN,lReserved的值为非0值。%DLL_PROCESS_DETACH不会为活动线程产生%DLL_THREAD_DETACH。 %DLL_THREAD_ATTCH 表示 DLL被调用的程序加载到了新的线程。DLLs可以利用这个机会初始化线程局部存储器(TLS)。这个执行发生在新建线程的上下文上。 %DLL_THREAD_DETACH 表示线程已经干净地退出。如果DLL分配了线程专用的存储器(TLS),则必须释放。即时没有调用匹配的%DLL_THREAD_ATTACH,这也有可能发生。%DLL_PROCESS_DETACH不会为活动线程产生%DLL_THREAD_DETACH。 lReserved 参数指定DLL初始化和清除的进一步说明。如果lReason的值为%DLL_PROCESS_ATTACH, lReserved为0说明DLL是被显式加载的;lReserved为非0值说明DLL被隐式加载。如果lReason值为%DLL_PROCESS_DETACH,LIBMAIN被 FreeLibarary API调用,lReaserved值为0;在进程终止期间被调用,lReaserved的值为非0值。 Reaturn value(返回值) 若LIBMAIN被%DLL_PROCESS_ATTACH调用,你的初始化进程的任何部分有错误发生,LIBMAIN函数应该返回0;如果没有错误发生,则应该返回1。如果返回0,Windows将终止该DLL并将其从内存中卸载掉。当LIBMAIN被%DLL_PROCESS_ATTACH以外的值调用,返回值将被忽略。 示例 #DIM ALL#COMPILE DLL LIBTEST.DLL #INCLUDE WIN32API.INCGLOBAL gNumOfTimes AS DWORDFUNCTION LIBMAIN(BYVAL hInstance AS DWORD, BYVAL lReason AS LONG, BYVAL lReserved AS LONG) AS LONG INCR gNumOfTimes SELECT CASE AS LONG lReason CASE %DLL_PROCESS_ATTACH 这个DLL已经按照要求映射到调用程序的内存,可能已经被初始化。这里我们返回一个非零值,表示成功。 LIBMAIN = 1 EXIT FUNCTION CASE %DLL_PROCESS_DETACH 这个DLL已被终止,将被卸载。 EXIT FUNCTION CASE %DLL_THREAD_ATTACH 一个新的线程启动 EXIT FUNCTION CASE %DLL_THREAD_DETACH 这个线程已被结束 EXIT FUNCTION END SELECT LIBMAIN = 0 表示初始化DLL的时候发生错误! END FUNCTION SUB TestIt ALIAS TestIt () EXPORT MSGBOX TestIt + $CRLF + _gNumOfTimes = + STR$(gNumOfTimes) END SUBCOMMAND$函数用途 返回启动程序的命令行参数 语法 s$ = COMMAND$ 注释 COMMAND$返回在程序名后的所有键入。一些操作系统手册将这个文字称作为跟踪者或命令尾部。 使用COMMAND$收集程序执行时的参数,比如文件名、程序选项等。 例如:一个名称为FASTSORT.EXE的程序,从一个文件中读数据,排序,然后将结果存入新的文件。当程序被调用的时候,使用COMMAND$指定输入和输出文件名: FASTSORT.EXE cust.dta cust.new 当FASTSORT开始执行,COMMAND$将包含字符串: cust.data cust.new FOSTSOFT必须包含代码将这个字符串解析为两个文件名。 在一些新版本的Windows中,当命令行参数传递到COMMAND$时,文件关联和拖拽文件操作会引起文件名被附上双引号标记。你的程序准备好处理这种可能性是明智的。 一些操作系统自动将命令行参数放在双引号内。 在集成开发环境下,为了测试,编译并执行、编译并调试两种方式都可以为COMMAND$命令行指定参数。参考 Command Line Dialog 以获得更多信息。 示例 #COMPILE EXE FUNCTION PBMAIN IF TRIM$(COMMAND$) = THEN 没有提供命令行参数,退出 EXIT FUNCTION ELSEIF INSTR(COMMAND$, /Q) THEN 处理/Q选项 ELSEIF INSTR(COMMAND$, /W) THEN 处理/W选项 END IF END FUNCTIONPBMAIN 函数用途 PBMAIN是被Windows调用的一个用户自定义函数,用来开始运行可执行程序。 语法 FUNCTION PBMAIN () AS LONG 注释 PBMAIN或WINMAIN函数是每个PowerBASIC应用程序都必须的。如果使用PBMAIN,参数将不会被传递,并且无法直接获得应用程序的实例句柄或命令行参数的指针。 无论如何,你都可以使用COMMAND$得到传递到程序的命令行,使用GetModuleHandle API 函数得到应用程序的实例句柄。 返回 PBMAIN返回值的有效范围是0-255。批文件通过IF NOT ERRORLEVEL批命令对结果有可能有影响。 限制由PowerBASIC创建的DLLs应该包含DLLMAIN、LIBMAIN或PBLIBMAIN函数,来替换PBMAIN/WINMAIN。 示例 #COMPILE EXEFUNCTION PBMAIN MSGBOX 这是我的程序! 返回一个级别为15的错误 FUNCTION = 15 也可以使用PBMAIN = 15 END FUNCTION#COMPILE元语句用途 确定编译器将创建什么类型的文件 语法 #COMPILE EXE | DLL 文件名.exe|.dll 注释 这个元语句用来指定模块被编译成EXE还是DLL文件。每个程序,#COMPILE元语句只能被使用一次,并且必须放置在任何可执行代码之前。 你可以随意地指定目标文件的名称和目录。如果这个子句被省略,编译的文件被命名为主要原代码文件的名称加.EXE或.DLL的扩展名。 下面是一些例子: #COMPILE EXE 名字与原代码文件名一样, 即 ABC.EXE #COMPILE DLL 名字与原代码文件名一样, 即 ABC.DLL #COMPILE EXE ABC 编译为 ABC.EXE #COMPILE DLL ABC 编译为 ABC.DLL #COMPILE EXE ABC.BAS 编译为 ABC.EXE 如果文件名包括路径,编译文件被放置在指定的目录;否则,它被放置在当前目录。 如果指定的目录不存在、文件名无效或被锁、EXE仍在运行或者由于其它一些原因导致文件无法被成功存储在指定的地方,一个编译时错误“Destination file write error”(目标文件写错误)出现,错误号496。 限制 如果没有指定#COMPILE,默认值为#COMPILE EXE。因为PowerBASIC for Windows早期版本的确省值不同,所以应明确使用#COMPILE元语句,以避免产生二义性。 当编译为DLL时,模块可以不包含PBMAIN或WIN

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论