论文部分内容阅读
摘要:利用高级语言开发软件项目时,经常需要解决的问题是文件操作问题,旨在以PowerScript语言为例解析如何利用API函数解决文件操作问题,并类推到其它语言。
关键词:API;DLL;外部函数
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)03-10883-02
1 引言
利用高级语言开发软件项目时,经常需要解决的问题是文件操作问题,比如,建立一个目录,打开一个文件,保存一个文件等,不管利用那种高级语言,这部分的解决有一个统一的方案---利用API函数解决,本文以PowerBuilder中的PowerScript语言为例说明如何利用API函数解决文件操作问题,读者可以类推到其他的高级语言中。
2 Windows API 技术
2.1 定义
Windows API 技术是由一系列的底层函数(这些底层函数放在系统动态链接库中)提供给用户的编程途径。API函数有16位平台和32位平台。
2.2 API函数与动态库
Windows 操作系统下的API函数大都放在动态链接库中,动态链接库的后缀一般为dll或exe,所以在使用API函数之前要先声明。
对于PowerBuilder而言,通常认为,PowerBuilder提供的函数为内部函数,通过API调用的函数为外部函数。使用API主要包括:外部函数定义和调用、数据类型转换、参数传递。
根据外部函数的作用范围,外部函数可以分为两种类型:全局外部函数和局部外部函数。全局外部函数可在应用、窗口、菜单、用户对象等位置定义,并能在应用程序的任何脚本中调用。局部外部函数可在窗口、菜单、用户对象中定义,并成为对象的一部分,只能在对象内部调用,其封装性好。
根据有、无返回值,PowerBuilder又将外部函数分为两种类型:FUNCTION(函数)和SUBROUTINE(子程序),其区别是函数有返回值,子程序无返回值。
FUNCTION的定义格式如下:
{access} FUNCTION returndatatype name ( {{REF} datatypel argl,…,{REF} datatypen argn} ) LIBRARY "libname" ALLAS FOR "extname“access为局部函数访问级别,分以下三级:
(1)Public:(缺省)在应用程序的任何脚本中使用;
(2)Private:只在该函数所在对象事件脚本中使用;
(3)Protected:只在该函数所在对象及其后代事件脚本中使用。
Returndatatype:为函数返回类型,此类型应与PowerScript类型匹配。
Name: 为外部函数在DLL中的函数名。
REF: 为变量通过引用方式传递。
Datatype: 为外部函数中参数类型。
Argl, …,Argn: 为外部函数中的参数名。
Libname: 为包含外部函数的DLL或EXE文件名
Extname: 为函数别名。
参数传递有二种方式:引用传递;值传递。
例如:FUNCTION Boolean increase (REF int valuel, int value2) Library“MyDLL.DLL”
其中,valuel为引用传递,value2为值传递。
注意:
(1)当一个动态链接库被装入到内存中以后,只会有一个实例,而不会因为多个程序使用同一个动态链接库而在内存中产生多个拷贝;
(2)搜索动态连接库的顺序:当前目录,Windows目录,Windows System 目录。
2.3 API函数举例
文件拷贝是Windows应用常见的操作,但在PowerBuilder中并没有文件拷贝函数,只能通过调用 Windows API实现。
定义局部外部函数:
FUNCTION Boolean CopyFileA(string sfname,string tfname,Boolean bfail) Library “kernel 32.dll”
“拷贝”按钮的Cliked事件脚本:
string sfilename, tfilename
Boolean bfail, ret
Sfilename=sle_1.text
Tfilename=sle_2.text
Bfail=true
Ret=CopyFileA(sfilename, tfilename, bfail)
If ret then
Messagebox(“提示”,“文件拷贝完成!”)
Else
Messagebox(“提示”, “文件拷贝失败!”)
End if
如复制之前需要打开源文件并且创建一个目录,并且该窗口提供删除文件功能,如下图:
全局外部函数的声明
FUNCTION boolean CopyFileA(ref string cfrom,ref string cto,boolean flag)&
library "kernel32.dll"
Function boolean CreateDirectoryA(ref string pathname,int sa)&
library "kernel32.dll"
Function boolean DeleteFileA(ref string filename) LIBRARY "Kernel32.dll"
创建目录:
string as_pathName,ls_SecurityAttributes
boolean rtn
if sle_5.text<>"" then
rtn=CreateDirectoryA(sle_5.text,0)
if rtn=true then
messagebox("成功","创建文件夹成功")
else
messagebox("","不成功")
end if
end if
打开源文件:
string pname,fname
integer rtn
rtn=GetFileOpenName("请选择要复制的文件",pname,fname)
if rtn=1 then
sle_3.text=pname
end if
复制文件:
boolean rtn
if sle_3.text="" then
messagebox("","未指定源文件")
elseif sle_4.text="" then
messagebox("","未指定要復制的目标文件")
else
rtn=CopyFileA(sle_3.text,sle_4.text,false)
if rtn=true then
messagebox("","success")
else
messagebox("","fail")
end if
end if
删除文件:
boolean rtn
if sle_1.text="" then
messagebox("","未指定要删除的文件名称,请先选择要删除的文件")
else
rtn=DeleteFileA(sle_1.text)
if rtn=true then
messagebox("","删除文件成功")
else
messagebox("","删除文件失败")
end if
end if
注意:声明API函数时注意区分函数名的大小写
vb使用API函数在思路上是一样的,先声明后引用,vb声明API函数CopyFile如下:
Declare Function CopyFile Lib “kernel32” Alias “CopyFileA”(ByVal ipExistingFileName As String,ByVal lpNewFileName As String,ByVal bFailIfExists As Long) As Long
C#要实现上述功能要用到两个重要的类:System.IO.File类和System.IO.FileInfo类,System.IO.File类和System.IO.FileInfo类主要提供有关文件的各种操作,在使用时需要引用System.IO命名空间。
3 总结
上述只是API函数冰山一角,做项目开发时,如果利用高级语言自身特点完成某些功能有困难时可以考虑利用操作系统自带的API函数。
参考文献:
[1]方小伟.PowerBuilder软件开发项目实践[M].清华大学出版社,2004.
[2]李廷文.Visual Basic开发[M].人民邮电出版社,2005.
[3]冉林仓.Windows API编程[M].清华大学出版社,2005.
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词:API;DLL;外部函数
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)03-10883-02
1 引言
利用高级语言开发软件项目时,经常需要解决的问题是文件操作问题,比如,建立一个目录,打开一个文件,保存一个文件等,不管利用那种高级语言,这部分的解决有一个统一的方案---利用API函数解决,本文以PowerBuilder中的PowerScript语言为例说明如何利用API函数解决文件操作问题,读者可以类推到其他的高级语言中。
2 Windows API 技术
2.1 定义
Windows API 技术是由一系列的底层函数(这些底层函数放在系统动态链接库中)提供给用户的编程途径。API函数有16位平台和32位平台。
2.2 API函数与动态库
Windows 操作系统下的API函数大都放在动态链接库中,动态链接库的后缀一般为dll或exe,所以在使用API函数之前要先声明。
对于PowerBuilder而言,通常认为,PowerBuilder提供的函数为内部函数,通过API调用的函数为外部函数。使用API主要包括:外部函数定义和调用、数据类型转换、参数传递。
根据外部函数的作用范围,外部函数可以分为两种类型:全局外部函数和局部外部函数。全局外部函数可在应用、窗口、菜单、用户对象等位置定义,并能在应用程序的任何脚本中调用。局部外部函数可在窗口、菜单、用户对象中定义,并成为对象的一部分,只能在对象内部调用,其封装性好。
根据有、无返回值,PowerBuilder又将外部函数分为两种类型:FUNCTION(函数)和SUBROUTINE(子程序),其区别是函数有返回值,子程序无返回值。
FUNCTION的定义格式如下:
{access} FUNCTION returndatatype name ( {{REF} datatypel argl,…,{REF} datatypen argn} ) LIBRARY "libname" ALLAS FOR "extname“access为局部函数访问级别,分以下三级:
(1)Public:(缺省)在应用程序的任何脚本中使用;
(2)Private:只在该函数所在对象事件脚本中使用;
(3)Protected:只在该函数所在对象及其后代事件脚本中使用。
Returndatatype:为函数返回类型,此类型应与PowerScript类型匹配。
Name: 为外部函数在DLL中的函数名。
REF: 为变量通过引用方式传递。
Datatype: 为外部函数中参数类型。
Argl, …,Argn: 为外部函数中的参数名。
Libname: 为包含外部函数的DLL或EXE文件名
Extname: 为函数别名。
参数传递有二种方式:引用传递;值传递。
例如:FUNCTION Boolean increase (REF int valuel, int value2) Library“MyDLL.DLL”
其中,valuel为引用传递,value2为值传递。
注意:
(1)当一个动态链接库被装入到内存中以后,只会有一个实例,而不会因为多个程序使用同一个动态链接库而在内存中产生多个拷贝;
(2)搜索动态连接库的顺序:当前目录,Windows目录,Windows System 目录。
2.3 API函数举例
文件拷贝是Windows应用常见的操作,但在PowerBuilder中并没有文件拷贝函数,只能通过调用 Windows API实现。
定义局部外部函数:
FUNCTION Boolean CopyFileA(string sfname,string tfname,Boolean bfail) Library “kernel 32.dll”
“拷贝”按钮的Cliked事件脚本:
string sfilename, tfilename
Boolean bfail, ret
Sfilename=sle_1.text
Tfilename=sle_2.text
Bfail=true
Ret=CopyFileA(sfilename, tfilename, bfail)
If ret then
Messagebox(“提示”,“文件拷贝完成!”)
Else
Messagebox(“提示”, “文件拷贝失败!”)
End if
如复制之前需要打开源文件并且创建一个目录,并且该窗口提供删除文件功能,如下图:
全局外部函数的声明
FUNCTION boolean CopyFileA(ref string cfrom,ref string cto,boolean flag)&
library "kernel32.dll"
Function boolean CreateDirectoryA(ref string pathname,int sa)&
library "kernel32.dll"
Function boolean DeleteFileA(ref string filename) LIBRARY "Kernel32.dll"
创建目录:
string as_pathName,ls_SecurityAttributes
boolean rtn
if sle_5.text<>"" then
rtn=CreateDirectoryA(sle_5.text,0)
if rtn=true then
messagebox("成功","创建文件夹成功")
else
messagebox("","不成功")
end if
end if
打开源文件:
string pname,fname
integer rtn
rtn=GetFileOpenName("请选择要复制的文件",pname,fname)
if rtn=1 then
sle_3.text=pname
end if
复制文件:
boolean rtn
if sle_3.text="" then
messagebox("","未指定源文件")
elseif sle_4.text="" then
messagebox("","未指定要復制的目标文件")
else
rtn=CopyFileA(sle_3.text,sle_4.text,false)
if rtn=true then
messagebox("","success")
else
messagebox("","fail")
end if
end if
删除文件:
boolean rtn
if sle_1.text="" then
messagebox("","未指定要删除的文件名称,请先选择要删除的文件")
else
rtn=DeleteFileA(sle_1.text)
if rtn=true then
messagebox("","删除文件成功")
else
messagebox("","删除文件失败")
end if
end if
注意:声明API函数时注意区分函数名的大小写
vb使用API函数在思路上是一样的,先声明后引用,vb声明API函数CopyFile如下:
Declare Function CopyFile Lib “kernel32” Alias “CopyFileA”(ByVal ipExistingFileName As String,ByVal lpNewFileName As String,ByVal bFailIfExists As Long) As Long
C#要实现上述功能要用到两个重要的类:System.IO.File类和System.IO.FileInfo类,System.IO.File类和System.IO.FileInfo类主要提供有关文件的各种操作,在使用时需要引用System.IO命名空间。
3 总结
上述只是API函数冰山一角,做项目开发时,如果利用高级语言自身特点完成某些功能有困难时可以考虑利用操作系统自带的API函数。
参考文献:
[1]方小伟.PowerBuilder软件开发项目实践[M].清华大学出版社,2004.
[2]李廷文.Visual Basic开发[M].人民邮电出版社,2005.
[3]冉林仓.Windows API编程[M].清华大学出版社,2005.
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。