imperialeast 发表于 2025-10-18 13:41:07

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

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

tlwh163 发表于 2025-10-18 20:51:19

固定长度字符串很魔性的 你掌握不了

imperialeast 发表于 2025-10-24 09:11:29

这个问题我已经解决了
页: [1]
查看完整版本: 运用了forms2.0,但是返回有异常