PB使用API GetOpenFileName 连续第二次选择 异常退出,具体是什麽原因?
PB使用API GetOpenFileName 连续第二次选择后,退出窗口,异常退出,具体是什麽原因?
代碼寫在window對象上
code:
声明函数:
//打开文件对话框函数
FUNCTION Long GetOpenFileName(REF OPENFILENAME lpOpenfilename)LIBRARY "comdlg32.dll" ALIAS FOR "GetOpenFileNameA"
//内存管理函数
FUNCTION Long StrCopy(Long Destination, REF String Source, Long Size)LIBRARY "kernel32.dll" ALIAS FOR "RtlMoveMemory"
FUNCTION Long LocalAlloc(Long Flags, Long Bytes)LIBRARY "kernel32.dll"
FUNCTION Long LocalFree(Long MemHandle)LIBRARY "kernel32.dll"
声明结构体:
type openfilename from structure
long lstructsize
long hwndowner
long hinstance
Long lpstrfilter
long lpstrcustomfilter
long nmaxcustfilter
long nfilterindex
string lpstrfile
long nmaxfile
string lpstrfiletitle
long nmaxfiletitle
string lpstrinitialdir
string lpstrtitle
long flags
long nfileoffset
integer nfileextension
long lpstrdefext
long lcustdata
long lpfnhook
long lptemplatename
end type
代码:
Long ll_rc
Long MAX_BUFFER_LENGTH = 256
Integer li_Start, li_TabPos
String ls_Token
String Filter
long ll_len
String ls_bmp, ls_bitmapfilename
CONSTANT integer LMEM_ZEROINIT = 64
//定义OPENFILENAME类型的结构变量
OPENFILENAME OFName
//定义过滤文件的类型
Filter = "Text Files (*.txt)~t*.TXT~tBitmap files (*.bmp)~t*.BMP~tRTF files (*.rtf)~t*.RTF"
//为结构成员lpstrFilter分配内存
OFName.lpstrFilter= LocalAlloc(LMEM_ZEROINIT,Len(Filter) + 2) // 以两个NULL字符结尾
If OFName.lpstrFilter = 0 Then
MessageBox("错误","无法分配所需的内存!",StopSign!,Ok!)
End If
//将制表符~t转换为Null分隔符
li_Start = 1
li_TabPos = Pos(Filter,"~t",1)
Do While li_TabPos > 0
ls_Token = Mid(Filter,li_Start,li_TabPos - li_Start)
StrCopy(OFName.lpstrFilter + (li_Start - 1), ls_Token, Len(ls_Token))
li_Start= li_TabPos + 1
li_TabPos = Pos(Filter,"~t",li_TabPos + 1)
Loop
ls_Token= Mid(Filter,li_Start)
StrCopy(OFName.lpstrFilter + (li_Start - 1),ls_Token,Len(ls_Token))
//设置结构的大小
OFName.lStructSize = 76
//设置父窗口为对话框的属主
OFName.hwndOwner = Handle(Parent)
//设置应用实例,在PB中设置为0
OFName.hInstance = 0
OFName.lpstrFile = ""
OFName.nMaxFile = MAX_BUFFER_LENGTH - 1
OFName.lpstrFileTitle = Space(MAX_BUFFER_LENGTH)
OFName.nMaxFileTitle = MAX_BUFFER_LENGTH - 1
//设置初始化目录
OFName.lpstrInitialDir = "c:"
//设置对话框标题
OFName.lpstrTitle = "打开文件"
OFName.nFilterIndex= 1
//设置标识符
OFName.flags = 0
//显示打开对话框
ll_rc = GetOpenFileName(OFName)
//判断用户的操作
If ll_rc = 1 Then
//显示用户选择的文件名在文本框中
sle_1.Text = RightTrim(OFName.lpstrFile)
//显示文件内容在文本编辑框中
//ll_len = Len(Trim(sle_1.Text))
//ls_bmp = Mid(Trim(sle_1.Text), ll_len - 2, 3)
//
//If ls_bmp = "bmp" or ls_bmp = "BMP" Then
// //如果为位图文件,将位图插入到RichText控件
// rte_1.InsertPicture(trim(sle_1.Text))
//Else
// //将打开的文本文件或RTF文件插入到RichText控件
// rte_1.InsertDocument(sle_1.Text, TRUE)
//End If
Else
MessageBox("打开文件: ","按下取消按钮")
End If
//释放内存
LocalFree(OFName.lpstrFilter)
API?GetOpenFileName 内存 异常
[解决办法]
你要干什么,打开文件吗?
怎么不用PB自带的GetFileOpenName函数。