PickIconDlg 不允许路径长于初始路径设置

PickIconDlg won't allow path longer than initial path setting

我需要允许用户 select 一个图标,所以我从 shell32 实现了 PickIconDlg 函数。问题是,如果用户 select 的路径比我声明的初始路径长,则结果值是用户 select 编辑的路径截断为初始路径的长度。

例如,如果我将初始路径设置为 "C:\Windows\System32\shell32.dll" 并且用户 selects "C:\Users\Public\Documents\TheIcons\Library.dll",更新后的字符串值返回为 "C:\Users\Public\Documents\TheIc"(即用户输入路径的前 31 个字符select,因为初始路径的长度为 31 个字符)。

我已经尝试调整传递给 PickIconDlg 的 'nMaxFile' 值,据我所知应该设置路径变量的最大长度。这似乎没有什么不同。

Declare Unicode Function PickIconDlg Lib "Shell32" Alias "PickIconDlg" (ByVal hwndOwner As IntPtr, ByVal lpstrFile As String, ByVal nMaxFile As Integer, ByRef lpdwIconIndex As Integer) As Integer

Public Function GetIconLoc(frmform As Form) As Object()
    Dim iconfile As String = Environment.GetFolderPath(Environment.SpecialFolder.System) + "\shell32.dll"
    Dim iconindex As Integer ' Will store the index of the selected icon

    If PickIconDlg(frmform.Handle, iconfile, 50, iconindex) = 1 Then
        MessageBox.Show(iconfile)
        Return {iconfile, iconindex}
    Else
        Return Nothing
    End If
End Function

我希望字符串变量 iconfile 包含完整的用户 selected 路径,因为它的长度小于定义的最大 50 个字符。相反,仅返回路径的一部分,如上所述。

在原始文件名后附加一个 Null 字符加空 space 以创建一个足够大的字符串缓冲区来包含结果。

Dim iconfile As String = _
    Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "shell32.dll") & _
    vbNullChar & Space(256)

然后在调用函数的时候传入总长度

PickIconDlg(frmform.Handle, iconfile, Len(iconfile), iconindex)

最后从结果

中删除多余的space
iconfile = Left(iconfile, InStr(iconfile, vbNullChar) - 1)

此外,使用 Path.Combine 而不是自己连接路径。 Path.Combine 自动添加缺失或删除额外的反斜杠 (\)。