找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 246|回复: 2

运用了forms2.0,但是返回有异常

[复制链接]
发表于 2025-10-18 13:41:07 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
Private Type OPENFILENAMEW
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As Long ' 筛选条件(Unicode字符串地址)
    lpstrCustomFilter As Long
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As Long ' 存储选中文件的缓冲区地址(核心)
    nMaxFile As Long ' 缓冲区最大长度(需足够大,适配多选)
    lpstrFileTitle As Long
    nMaxFileTitle As Long
    lpstrInitialDir As Long ' 初始打开目录(可选)
    lpstrTitle As Long ' 对话框标题(Unicode字符串地址)
    Flags As Long ' 功能标志(多选、Unicode等)
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As Long ' 默认文件扩展名(可选)
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As Long
End Type

' 2. 声明核心API函数(W后缀=Unicode版本,关键)
Private Declare Function GetOpenFileNameW Lib "comdlg32.dll" (pofn As OPENFILENAMEW) As Long
Private Declare Function lstrlenW Lib "kernel32.dll" (ByVal lpString As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)



' 3. 核心执行过程(按钮点击事件示例)
Private Sub Command1_Click()
    Dim ofn As OPENFILENAMEW
    Dim strFilter As String * 256 ' 筛选条件(Unicode类型)
    Dim strTitle As String * 64 ' 对话框标题(Unicode类型)
    Dim strFileBuf As String * 4096 ' 存储文件的缓冲区(4096足够存多个文件路径)
    Dim strFiles() As String, i As Long, lPos As Long, lLen As Long
    Dim Xstr As String
    ' 初始化筛选条件(格式:"筛选名\0文件后缀\0",最后以两个\0结尾)
     strFilter = "所有文件|*.*|"
    ' 初始化对话框标题
    strTitle = "API选择多个多语言文件"
   
    ' 配置OPENFILENAMEW结构体(关键参数)
    With ofn
        .lStructSize = Len(ofn) ' 必须赋值,否则API调用失败
        .hwndOwner = Me.hwnd ' 对话框的父窗口(当前窗体)
        .lpstrFilter = StrPtr(Replace(strFilter, "|", ChrW(0))) ' 传递筛选条件的Unicode地址
        .nFilterIndex = 1 ' 默认选中第一个筛选条件
        .lpstrFile = StrPtr(strFileBuf) ' 传递文件缓冲区的Unicode地址
        .nMaxFile = Len(strFileBuf) ' 缓冲区最大长度
        .lpstrTitle = StrPtr(strTitle) ' 传递对话框标题的Unicode地址
        ' 关键标志:OFN_ALLOWMULTISELECT(允许多选) + OFN_ENABLESIZING(兼容Unicode+优化界面) + OFN_HIDEREADONLY(隐藏只读选项)
        .Flags = &H80000 ' &H200& Or &H80000 Or &H4&
    End With
   
    ' 调用API打开对话框,返回非0表示用户选中文件
    If GetOpenFileNameW(ofn) <> 0 Then
      
            lLen = lstrlenW(ofn.lpstrFile)  ' 计算当前文件路径长度(Unicode占2字节/字符)
            If lLen = 0 Then Exit Sub  '遇到两个连续\0,结束解析
            
            ' 复制当前文件路径到数组
            'MessageBoxW Me.hwnd, ofn.lpstrFile, 0, 0
            
             CopyMemory Xstr, ofn.lpstrFile, 4
              Xstr = Left(Xstr, InStr(Xstr, Chr(0)) - 1)
            
            TextBox1.Text = (Xstr)
            
            
    End If
End Sub
回复

使用道具 举报

发表于 2025-10-18 20:51:19 | 显示全部楼层
固定长度字符串很魔性的 你掌握不了
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2025-10-24 09:11:29 | 显示全部楼层
这个问题我已经解决了
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2025-11-25 12:51 , Processed in 0.030297 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表