PickIconDlg не разрешит путь длиннее, чем начальный параметр пути - PullRequest
0 голосов
/ 24 июня 2019

Мне нужно разрешить пользователю выбирать значок, поэтому я реализовал функцию PickIconDlg из shell32.Проблема в том, что если пользователь выбирает путь, который длиннее, чем начальный путь, который я объявляю, результирующее значение - это выбранный пользователем путь, усеченный до длины исходного пути.

Например, если я установлюИсходный путь к «C: \ Windows \ System32 \ shell32.dll» и пользователь выбирает «C: \ Users \ Public \ Documents \ TheIcons \ Library.dll», обновленное строковое значение возвращается как «C: \ Users \ Public»\ Documents \ TheIc "(т. Е. Первые 31 символ выбранного пользователем пути, поскольку длина начального пути составляет 31 символ).

Я попытался настроить значение 'nMaxFile', которое я передаю PickIconDlg, который японять, как предполагается, установить максимальную длину переменной пути.Похоже, это не имеет значения.

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 будет содержать полный выбранный пользователем путь, так как его длина меньше, чем определенный максимум 50 символов.Вместо этого возвращается только часть пути, как описано выше.

1 Ответ

0 голосов
/ 24 июня 2019

Добавьте нулевой символ плюс пустое место после исходного имени файла, чтобы создать строковый буфер, достаточно большой, чтобы содержать результат.

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

Затем передайте общую длину при вызове функции

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

И, наконец, вырезать лишний пробел из результата

iconfile = Left(iconfile, InStr(iconfile, vbNullChar) - 1)

Кроме того, используйте Path.Combine вместо того, чтобы объединять путь самостоятельно. Path.Combine добавляет отсутствующие или удаляет лишние косые черты (\) автоматически.

...