Получение пути назад от SHGetKnownFolderPath в VB.Net - PullRequest
0 голосов
/ 23 октября 2019

Попытка использовать SHGetKnownFolderPath API для возврата пути к папке загрузок в VB.Net. Я могу вызвать функцию и получить указатель на результат, но я сбит с толку правильным способом получить это в строку VB.Net для работы. (Я понимаю, что CopyMemory - это не тот путь, но я не могу понять смысл методов Marshalling).

<< Отредактировано, чтобы показать окончательный код >>

Imports System.Runtime.InteropServices

<DllImport("shell32.dll")>
Private Function SHGetKnownFolderPath(
<MarshalAs(UnmanagedType.LPStruct)> ByVal rfid As Guid,
    ByVal dwFlags As UInt32,
    ByVal hToken As IntPtr,
    ByRef pszPath As IntPtr) As Int32
End Function

Public Function GetDownloadsFolder() As String

    Dim Result As String = ""
    Dim ppszPath As IntPtr
    Dim gGuid As Guid = New Guid("{374DE290-123F-4565-9164-39C4925E467B}")

    If SHGetKnownFolderPath(gGuid, 0, 0, ppszPath) = 0 Then
        ' ----
        ' Question was: what goes here? Answer follows:
        '
        Result = Marshal.PtrToStringUni(ppszPath)
        Marshal.FreeCoTaskMem(ppszPath)
        ' ---
    End If
    Return Result
End Function

1 Ответ

0 голосов
/ 23 октября 2019

Алекс Ф получает кредит за предоставление важной информации - вот окончательный код:

Imports System.Runtime.InteropServices

<DllImport("shell32.dll")>
Private Function SHGetKnownFolderPath(
<MarshalAs(UnmanagedType.LPStruct)> ByVal rfid As Guid,
    ByVal dwFlags As UInt32,
    ByVal hToken As IntPtr,
    ByRef pszPath As IntPtr) As Int32
End Function

Public Function GetDownloadsFolder() As String

    Dim Result As String = ""
    Dim ppszPath As IntPtr
    Dim gGuid As Guid = New Guid("{374DE290-123F-4565-9164-39C4925E467B}")

    If SHGetKnownFolderPath(gGuid, 0, 0, ppszPath) = 0 Then
        Result = Marshal.PtrToStringUni(ppszPath)
        Marshal.FreeCoTaskMem(ppszPath)
    End If
    Return Result
End Function
...