VBA 64bit / SHGetSpecialFolderLocation

  • Sonstige

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von mumpel.

    VBA 64bit / SHGetSpecialFolderLocation

    Hallo Leute,

    ich habe mein MS Office 2019 Prof. auf 64bit umgestellt.

    Nun habe ich aber ein Problem, mit dem Aufruf einer DLL-Funktion.

    VB.NET-Quellcode

    1. ' Ordner-Auflistung
    2. Public Enum SpecialFolderIDs
    3. sfidDESKTOP = &H0 ' Desktop
    4. sfidINTERNET = &H1 ' Internet Explorer (icon on desktop)
    5. sfidPROGRAMS = &H2 ' Start Menu\Programs
    6. sfidCONTROLS = &H3 ' My Computer\Control Panel
    7. sfidPRINTERS = &H4 ' My Computer\Printers
    8. sfidPERSONAL = &H5 ' My Documents
    9. sfidFAVORITES = &H6 ' \Favorites
    10. sfidSTARTUP = &H7 ' StartMenu\Programs\Startup
    11. sfidRECENT = &H8 ' \Recent
    12. sfidSENDTO = &H9 ' \SendTo
    13. sfidBITBUCKET = &HA ' \Recycle Bin
    14. sfidSTARTMENU = &HB ' \StartMenu
    15. sfidDESKTOPDIRECTORY = &H10 ' name>\Desktop
    16. sfidDRIVERS = &H11 ' My Computer
    17. sfidNETWORK = &H12 ' Network Neighborhood
    18. sfidNETHOOD = &H13 ' \nethood
    19. sfidFONTS = &H14 ' windows\fonts
    20. sfidTEMPLATES = &H15 ' Vorlagen
    21. sfidCOMMON_STARTMENU = &H16 ' All Users\StartMenu
    22. sfidCOMMON_PROGRAMS = &H17 ' AllUsers\Programs
    23. sfidCOMMON_STARTUP = &H18 ' AllUsers\Startup
    24. sfidCOMMON_DESKTOPDIRECTORY = &H19 ' AllUsers\Desktop
    25. sfidAPPDATA = &H1A ' name>\Application Data
    26. sfidPRINTHOOD = &H1B ' name>\PrintHood
    27. sfidLOCAL_APPDATA = &H1C ' name>\Local Settings\Applicaiton Data (non roaming)
    28. sfidALTSTARTUP = &H1D ' non localizedstartup
    29. sfidCOMMON_ALTSTARTUP = &H1E ' non localizedCommon startup
    30. sfidCOMMON_FAVORITES = &H1F
    31. sfidINTERNET_CACHE = &H20
    32. sfidCOOKIES = &H21
    33. sfidHISTORY = &H22
    34. sfidCOMMON_APPDATA = &H23 ' AllUsers\Application Data
    35. sfidWINDOWS = &H24 ' GetWindowsDirectory()
    36. sfidSYSTEM = &H25 ' GetSystemDirectory()
    37. sfidPROGRAM_FILES = &H26 ' C:\Program Files
    38. sfidMYPICTURES = &H27 ' C:\Program Files\My Pictures
    39. sfidMYDOCUMENTS = &H5 ' My Documents => s. a. sfidPERSONAL
    40. sfidPROFILE = &H28 ' USERPROFILE
    41. sfidSYSTEMX86 = &H29 ' x86 system directory on RISC
    42. sfidPROGRAM_FILESX86 = &H2A ' x86 C:\Program Files on RISC
    43. sfidPROGRAM_FILES_COMMON = &H2B ' C:\Program Files\Common
    44. sfidPROGRAM_FILES_COMMONX86 = &H2C ' x86 Program Files\Common on RISC
    45. sfidCOMMON_TEMPLATES = &H2D ' All Users\Templates
    46. sfidCOMMON_DOCUMENTS = &H2E ' All Users\Documents
    47. sfidCOMMON_ADMINTOOLS = &H2F ' All Users\Start Menu\Programs\Administrative Tools
    48. sfidADMINTOOLS = &H30 ' \Start Menu\Programs\Administrative Tools
    49. sfidProgramFiles = &H10000
    50. sfidCommonFiles = &H10001
    51. End Enum
    52. Private Type SHITEMID
    53. cb As Long
    54. abID As Byte
    55. End Type
    56. Private Type ITEMIDLIST
    57. mkid As SHITEMID
    58. End Type
    59. Private Declare PtrSafe Function GetUserName Lib "advapi32.dll" _
    60. Alias "GetUserNameA" (ByVal lpBuffer As String, _
    61. nSize As Long) As Long
    62. Private Declare PtrSafe Function GetTempPath Lib "kernel32.dll" Alias "GetTempPathA" _
    63. (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
    64. Private Declare PtrSafe Function SHGetSpecialFolderLocation Lib _
    65. "shell32.dll" (ByVal hwndOwner As Long, _
    66. ByVal nFolder As Long, pidl As ITEMIDLIST) As Long
    67. Private Declare PtrSafe Function SHGetPathFromIDList Lib _
    68. "shell32.dll" Alias "SHGetPathFromIDListA" _
    69. (ByVal pidl As Long, ByVal pszPath As String) As Long
    70. ' Standard Systemordner ermitteln
    71. Public Function GetSpecialFolder(CSIDL As SpecialFolderIDs) As String
    72. ''Aufrufbeispiel:
    73. ''sPathDesktop = GetSpecialFolder(sfidDESKTOP)
    74. Dim lResult As Long
    75. Dim IDL As ITEMIDLIST
    76. Dim sPath As String
    77. 10 On Error GoTo GetSpecialFolder_Error
    78. 20 lResult = SHGetSpecialFolderLocation(100, CSIDL, IDL)
    79. 30 If lResult = 0 Then
    80. 40 sPath = Space$(512)
    81. 50 lResult = SHGetPathFromIDList(ByVal IDL.mkid.cb, ByVal sPath)
    82. 60 GetSpecialFolder = Left$(sPath, InStr(sPath, Chr$(0)) - 1)
    83. 70 End If
    84. 80 On Error GoTo 0
    85. 90 Exit Function
    86. GetSpecialFolder_Error:
    87. 100 MsgBox "Fehlernr.: " & Err.Number & " (" & Err.Description & ") in Prozedur GetSpecialFolder von Modul GetSystemOrdner", , "Fehler in Zeile: " & Erl
    88. End Function


    Und zwar stürzt mein Programm bei folgender Zeile ab in der Funktion GetSpecialFolder
    => 50 lResult = SHGetPathFromIDList(ByVal IDL.mkid.cb, ByVal sPath)

    Hat einer eine Idee was hier noch zusätzlich geändert werden muss.
    Ich vermute es liegt an der Deklaration von

    VB.NET-Quellcode

    1. Private Type SHITEMID
    2. cb As Long
    3. abID As Byte
    4. End Type
    5. Private Type ITEMIDLIST
    6. mkid As SHITEMID
    7. End Type


    Ich hoffe jemand kann mir hier helfen.
    Vielen Dank im Voraus.

    Gruß Achilleus



    Hallo Leute,

    einfach die Suchanfrage in Google umgestellt und schon habe ich die Lösung:
    VBA - Office 365 x64 Bit - Vollständiger Absturz - Stack Overflow

    VB.NET-Quellcode

    1. Option Explicit
    2. ' Ordner-Auflistung
    3. Public Enum SpecialFolderIDs
    4. sfidDESKTOP = &H0 ' Desktop
    5. sfidINTERNET = &H1 ' Internet Explorer (icon on desktop)
    6. sfidPROGRAMS = &H2 ' Start Menu\Programs
    7. sfidCONTROLS = &H3 ' My Computer\Control Panel
    8. sfidPRINTERS = &H4 ' My Computer\Printers
    9. sfidPERSONAL = &H5 ' My Documents
    10. sfidFAVORITES = &H6 ' \Favorites
    11. sfidSTARTUP = &H7 ' StartMenu\Programs\Startup
    12. sfidRECENT = &H8 ' \Recent
    13. sfidSENDTO = &H9 ' \SendTo
    14. sfidBITBUCKET = &HA ' \Recycle Bin
    15. sfidSTARTMENU = &HB ' \StartMenu
    16. sfidDESKTOPDIRECTORY = &H10 ' name>\Desktop
    17. sfidDRIVERS = &H11 ' My Computer
    18. sfidNETWORK = &H12 ' Network Neighborhood
    19. sfidNETHOOD = &H13 ' \nethood
    20. sfidFONTS = &H14 ' windows\fonts
    21. sfidTEMPLATES = &H15 ' Vorlagen
    22. sfidCOMMON_STARTMENU = &H16 ' All Users\StartMenu
    23. sfidCOMMON_PROGRAMS = &H17 ' AllUsers\Programs
    24. sfidCOMMON_STARTUP = &H18 ' AllUsers\Startup
    25. sfidCOMMON_DESKTOPDIRECTORY = &H19 ' AllUsers\Desktop
    26. sfidAPPDATA = &H1A ' name>\Application Data
    27. sfidPRINTHOOD = &H1B ' name>\PrintHood
    28. sfidLOCAL_APPDATA = &H1C ' name>\Local Settings\Applicaiton Data (non roaming)
    29. sfidALTSTARTUP = &H1D ' non localizedstartup
    30. sfidCOMMON_ALTSTARTUP = &H1E ' non localizedCommon startup
    31. sfidCOMMON_FAVORITES = &H1F
    32. sfidINTERNET_CACHE = &H20
    33. sfidCOOKIES = &H21
    34. sfidHISTORY = &H22
    35. sfidCOMMON_APPDATA = &H23 ' AllUsers\Application Data
    36. sfidWINDOWS = &H24 ' GetWindowsDirectory()
    37. sfidSYSTEM = &H25 ' GetSystemDirectory()
    38. sfidPROGRAM_FILES = &H26 ' C:\Program Files
    39. sfidMYPICTURES = &H27 ' C:\Program Files\My Pictures
    40. sfidPROFILE = &H28 ' USERPROFILE
    41. sfidSYSTEMX86 = &H29 ' x86 system directory on RISC
    42. sfidPROGRAM_FILESX86 = &H2A ' x86 C:\Program Files on RISC
    43. sfidPROGRAM_FILES_COMMON = &H2B ' C:\Program Files\Common
    44. sfidPROGRAM_FILES_COMMONX86 = &H2C ' x86 Program Files\Common on RISC
    45. sfidCOMMON_TEMPLATES = &H2D ' All Users\Templates
    46. sfidCOMMON_DOCUMENTS = &H2E ' All Users\Documents
    47. sfidCOMMON_ADMINTOOLS = &H2F ' All Users\Start Menu\Programs\Administrative Tools
    48. sfidADMINTOOLS = &H30 ' \Start Menu\Programs\Administrative Tools
    49. sfidProgramFiles = &H10000
    50. sfidCommonFiles = &H10001
    51. End Enum
    52. Private Declare PtrSafe Function GetUserName Lib "advapi32.dll" _
    53. Alias "GetUserNameA" (ByVal lpBuffer As String, _
    54. nSize As Long) As Long
    55. Private Declare PtrSafe Function GetTempPath Lib "kernel32.dll" Alias "GetTempPathA" _
    56. (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
    57. Private Declare PtrSafe Function SHGetSpecialFolderLocation Lib "shell32.dll" _
    58. (ByVal hwndOwner As Long, ByVal nFolder As Long, pidl As LongPtr) As Long
    59. Private Declare PtrSafe Function SHGetPathFromIDList Lib "shell32.dll" _
    60. Alias "SHGetPathFromIDListA" (ByVal pidl As LongPtr, ByVal pszPath As String) As Boolean
    61. Private Declare PtrSafe Sub CoTaskMemFree Lib "ole32.dll" (ByVal pv As LongPtr)
    62. Private Const S_OK As Long = 0
    63. Private Const MAX_LENGTH = 260
    64. Public Function GetSpecialFolder(ByVal CSIDL As Integer) As String
    65. Dim result As Long
    66. Dim path As String
    67. Dim idl_ptr As LongPtr
    68. 'Fill the IDL structure with the specified folder item.
    69. result = SHGetSpecialFolderLocation(0, CSIDL, idl_ptr)
    70. If result = S_OK Then
    71. 'Get the path from the IDL list, and return the folder adding final "\".
    72. path = Space$(MAX_LENGTH)
    73. If SHGetPathFromIDList(idl_ptr, path) Then
    74. GetSpecialFolder = Left$(path, InStr(path, vbNullChar) - 1) & "\"
    75. End If
    76. CoTaskMemFree idl_ptr
    77. End If
    78. End Function


    Gruß Achilleus

    Beiträge zusammengefügt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Nur der Vollständigkeit halber: learn.microsoft.com/de-de/wind…hgetspecialfolderlocation -> [SHGetSpecialFolderLocation wird nicht unterstützt und kann in Zukunft geändert oder nicht mehr verfügbar sein. Verwenden Sie stattdessen SHGetFolderLocation.]
    Mfg -Franky-
    @Achilleus Wenn Du dem Link von mir folgst, dann kommst Du zu SHGetFolderLocation -> learn.microsoft.com/de-de/wind…_core-shgetfolderlocation. Dort gibt es auf der Seite einen Hinweis: Ab Windows Vista ist diese Funktion lediglich ein Wrapper für SHGetKnownFolderIDList. Der CSIDL-Wert wird in den zugeordneten KNOWNFOLDERID-Wert übersetzt, und SHGetKnownFolderIDList wird aufgerufen. Neue Anwendungen sollten das bekannte Ordnersystem anstelle des älteren CSIDL-Systems verwenden, das nur aus Gründen der Abwärtskompatibilität unterstützt wird. Das führt dann hier her: learn.microsoft.com/de-de/wind…re-shgetknownfolderidlist -> SHGetKnownFolderIDList. Also Du kannst beide APIs verwenden wobei SHGetFolderLocation eben SHGetKnownFolderIDList auruft. Also falls Du nicht mehr für < WinVista entwickelst, solltest Du SHGetKnownFolderIDList verwenden.

    Auf die schnelle kann ich Dir nur VB6 Code anbieten. Sollte ja kein Problem sein PtrSafe und LongPtr für VBA entsprechend einzusetzen.
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Const S_OK As Long = &H0
    3. Private Const FOLDERID_Desktop As String = "{b4bfcc3a-db2c-424c-b029-7fe99a87c641}"
    4. Private Enum CSIDLS
    5. CSIDL_DESKTOP = &H0
    6. CSIDL_INTERNET = &H1
    7. CSIDL_PROGRAMS = &H2
    8. CSIDL_CONTROLS = &H3
    9. CSIDL_PRINTERS = &H4
    10. CSIDL_PERSONAL = &H5
    11. CSIDL_FAVORITES = &H6
    12. CSIDL_STARTUP = &H7
    13. CSIDL_RECENT = &H8
    14. CSIDL_SENDTO = &H9
    15. CSIDL_BITBUCKET = &HA
    16. CSIDL_STARTMENU = &HB
    17. CSIDL_MYDOCUMENTS = &H5
    18. CSIDL_MYMUSIC = &HD
    19. CSIDL_MYVIDEO = &HE
    20. CSIDL_DESKTOPDIRECTORY = &H10
    21. CSIDL_DRIVES = &H11
    22. CSIDL_NETWORK = &H12
    23. CSIDL_NETHOOD = &H13
    24. CSIDL_FONTS = &H14
    25. CSIDL_TEMPLATES = &H15
    26. CSIDL_COMMON_STARTMENU = &H16
    27. CSIDL_COMMON_PROGRAMS = &H17
    28. CSIDL_COMMON_STARTUP = &H18
    29. CSIDL_COMMON_DESKTOPDIRECTORY = &H19
    30. CSIDL_APPDATA = &H1A
    31. CSIDL_PRINTHOOD = &H1B
    32. CSIDL_LOCAL_APPDATA = &H1C
    33. CSIDL_ALTSTARTUP = &H1D
    34. CSIDL_COMMON_ALTSTARTUP = &H1E
    35. CSIDL_COMMON_FAVORITES = &H1F
    36. CSIDL_INTERNET_CACHE = &H20
    37. CSIDL_COOKIES = &H21
    38. CSIDL_HISTORY = &H22
    39. CSIDL_COMMON_APPDATA = &H23
    40. CSIDL_WINDOWS = &H24
    41. CSIDL_SYSTEM = &H25
    42. CSIDL_PROGRAM_FILES = &H26
    43. CSIDL_MYPICTURES = &H27
    44. CSIDL_PROFILE = &H28
    45. CSIDL_SYSTEMX86 = &H29
    46. CSIDL_PROGRAM_FILESX86 = &H2A
    47. CSIDL_PROGRAM_FILES_COMMON = &H2B
    48. CSIDL_PROGRAM_FILES_COMMONX86 = &H2C
    49. CSIDL_COMMON_TEMPLATES = &H2D
    50. CSIDL_COMMON_DOCUMENTS = &H2E
    51. CSIDL_COMMON_ADMINTOOLS = &H2F
    52. CSIDL_ADMINTOOLS = &H30
    53. CSIDL_CONNECTIONS = &H31
    54. CSIDL_COMMON_MUSIC = &H35
    55. CSIDL_COMMON_PICTURES = &H36
    56. CSIDL_COMMON_VIDEO = &H37
    57. CSIDL_RESOURCES = &H38
    58. CSIDL_RESOURCES_LOCALIZED = &H39
    59. CSIDL_COMMON_OEM_LINKS = &H3A
    60. CSIDL_CDBURN_AREA = &H3B
    61. CSIDL_COMPUTERSNEARME = &H3D
    62. End Enum
    63. Private Enum KNOWN_FOLDER_FLAG
    64. KF_FLAG_DEFAULT = &H0
    65. KF_FLAG_FORCE_APP_DATA_REDIRECTION = &H80000
    66. KF_FLAG_RETURN_FILTER_REDIRECTION_TARGET = &H40000
    67. KF_FLAG_FORCE_PACKAGE_REDIRECTION = &H20000
    68. KF_FLAG_NO_PACKAGE_REDIRECTION = &H10000
    69. KF_FLAG_FORCE_APPCONTAINER_REDIRECTION = &H20000
    70. KF_FLAG_NO_APPCONTAINER_REDIRECTION = &H10000
    71. KF_FLAG_CREATE = &H8000
    72. KF_FLAG_DONT_VERIFY = &H4000
    73. KF_FLAG_DONT_UNEXPAND = &H2000
    74. KF_FLAG_NO_ALIAS = &H1000
    75. KF_FLAG_INIT = &H800
    76. KF_FLAG_DEFAULT_PATH = &H400
    77. KF_FLAG_NOT_PARENT_RELATIVE = &H200
    78. KF_FLAG_SIMPLE_IDLIST = &H100
    79. KF_FLAG_ALIAS_ONLY = &H80000000
    80. End Enum
    81. Private Type GUID
    82. data1 As Long
    83. data2 As Long
    84. data3 As Long
    85. data4 As Long
    86. End Type
    87. Private Declare Sub ILFree Lib "Shell32.dll" (ByVal pidl As Long)
    88. Private Declare Function CLSIDFromString Lib "ole32.dll" ( _
    89. ByVal pstring As Long, _
    90. ByRef pCLSID As GUID) As Long
    91. ' bis WinVista
    92. Private Declare Function SHGetFolderLocation Lib "Shell32.dll" ( _
    93. ByVal hwnd As Long, _
    94. ByVal csidl As CSIDLS, _
    95. ByVal hToken As Long, _
    96. ByVal dwFlags As Long, _
    97. ByRef ppidl As Long) As Long
    98. ' ab WinVista ist SHGetFolderLocation ein Wrapper für SHGetKnownFolderIDList
    99. Private Declare Function SHGetKnownFolderIDList Lib "Shell32.dll" ( _
    100. ByRef rfid As GUID, _
    101. ByVal dwFlags As KNOWN_FOLDER_FLAG, _
    102. ByVal hToken As Long, _
    103. ByRef ppidl As Long) As Long
    104. ' SHGetKnownFolderIDList -> rfid As Guid -> KNOWNFOLDERID see: https://learn.microsoft.com/de-de/windows/win32/shell/knownfolderid
    105. ' or: https://www.magnumdb.com/search?q=FOLDERID_*
    106. Private Sub Command1_Click()
    107. Dim pidl As Long
    108. ' bis WinVista
    109. ' hToken -> see: https://learn.microsoft.com/de-de/windows/win32/api/shlobj_core/nf-shlobj_core-shgetfolderlocation
    110. If SHGetFolderLocation(0&, CSIDLS.CSIDL_DESKTOP, -1&, 0&, pidl) = S_OK Then
    111. Debug.Print pidl
    112. Call ILFree(pidl)
    113. End If
    114. ' ab WinVista
    115. ' hToken -> see: https://learn.microsoft.com/de-de/windows/win32/api/shlobj_core/nf-shlobj_core-shgetknownfolderidlist
    116. If SHGetKnownFolderIDList(Str2Guid(FOLDERID_Desktop), KF_FLAG_DEFAULT_PATH, -1&, pidl) = S_OK Then
    117. Debug.Print pidl
    118. Call ILFree(pidl)
    119. End If
    120. End Sub
    121. Private Function Str2Guid(ByVal strGUID As String) As GUID
    122. If Len(strGUID) = 38 Then
    123. Call CLSIDFromString(StrPtr(strGUID), Str2Guid)
    124. End If
    125. End Function

    Mfg -Franky-

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „-Franky-“ ()

    Hallo Franky,

    also ich bin einfach zu blöde für deinen Programmcode.
    Selbst wenn ich alles richtig auf 64bit umstelle, komme ich nicht an meine SpecialFolders.

    Ich muss auch gestehen, ich verstehe die Funktion auch nicht im Ansatz. Ich kann auch im INet nirgendwo ein Beispiel für den "richtigen" Ansatz finden. Alle Beispiele entsprechen immer meinem Ansatz, der ja auch einwandfrei funktioniert.

    Ich werde also solange es geht, meine Version nutzen.

    Vielen Dank für Deine Hilfe.

    Gruß Achilleus
    SHGetFolderLocation und SHGetSpecialFolderLocation sind von den Parametern her fast identisch. hwnd war schon immer reserved und wurde nie genutzt. SHGetFolderLocation hat halt 2 Parameter mehr. Genaueres zu den zusätzlichen Parametern steht ja in der MS-Doku. SHGetKnownFolderIDList benötigt halt, weil nie genutzt, keinen hwnd Parameter mehr. Dafür halt GUIDs für die abzufragenden Ordner anstelle der veralteten CSIDL-Werte.

    In Deinem Code verwendest ja bereits SHGetPathFromIDList und passend dazu (-> IDList) wäre SHGetKnownFolderIDList genau die richtige API.

    SHGetSpecialFolderLocation wird mit Sicherheit nicht so schnell aus der Shell.dll geworfen. Allein schon wegen der Abwärtskompatibilität nicht. Eventuell ist SHGetSpecialFolderLocation inzwischen auch nur noch ein Wrapper für SHGetFolderLocation der wiederum ein Wrapper für SHGetPathFromIDList ist. Verlassen darauf das das so bleibt, würde ich mich nicht. Im einfachsten Fall gibt SHGetSpecialFolderLocation dann irgendwann nur noch <> S_OK zurück und pidl bleibt 0.
    Mfg -Franky-
    Hallo Franky,

    genau das hatte ich ja mit deiner Funktion SHGetKnownFolderID versucht.
    Selbst dein Beispiel liefert mir ja noch nicht einmal den Pfad zum Desktop oder habe ich das ganze irgendwie falsch versanden?
    Aber du schreibst ja selbst, dass wohl so schnell meine Vorgehensweise aufgehoben wird. Von daher warte ich einfach ab. :D

    Gruß Achilleus
    Die Frage wäre jetzt, was gibt denn die API SHGetKnownFolderIDList als pidl/Ordner zurück? Du könntest auch anstelle von SHGetKnownFolderIDList -> pidl -> SHGetPathFromIDList -> Pfad/Ordner auch gleich die API SHGetKnownFolderPath verwenden.
    Mfg -Franky-
    Natürlich kann ich das auch mit VBS machen, aber ich dachte mir immer ein direkter API-Zugriff ist einfacher, da ja VBS doch auch nur ein Wrapper ist.

    Hier einmal eine Funktion zum Auflisten aller Folder:

    VB.NET-Quellcode

    1. Set objShell = CreateObject("Shell.Application")
    2. For i=0 to 255
    3.   Set objFolder = objShell.Namespace(i)
    4.   On Error Resume next
    5.   Set objFolderItem = objFolder.Self
    6.   On Error Resume Next
    7.   WScript.Echo i & " " &  objFolder.Title & " " & objFolderItem.Path
    8.   Set objFolder=Nothing 
    9. Next


    Und hier mit Konstanten zum Abruf eines speziellen Ordners:
    (leider kennt VBS keine Enumerationen)

    VB.NET-Quellcode

    1. Const sfidDESKTOP = &H0                  ' Desktop
    2. Const sfidINTERNET = &H1                  ' Internet Explorer (icon on desktop)
    3. Const sfidPROGRAMS = &H2                 ' Start Menu\Programs
    4. Const sfidCONTROLS = &H3                 ' My Computer\Control Panel
    5. Const sfidPRINTERS = &H4                 ' My Computer\Printers
    6. Const sfidPERSONAL = &H5                 ' My Documents
    7. Const sfidFAVORITES = &H6                ' \Favorites
    8. Const sfidSTARTUP = &H7                  ' StartMenu\Programs\Startup
    9. Const sfidRECENT = &H8                   ' \Recent
    10. Const sfidSENDTO = &H9                   ' \SendTo
    11. Const sfidBITBUCKET = &HA                ' \Recycle Bin
    12. Const sfidSTARTMENU = &HB                ' \StartMenu
    13. Const sfidDESKTOPDIRECTORY = &H10        ' name>\Desktop
    14. Const sfidDRIVERS = &H11                 ' My Computer
    15. Const sfidNETWORK = &H12                 ' Network Neighborhood
    16. Const sfidNETHOOD = &H13                 ' \nethood
    17. Const sfidFONTS = &H14                   ' windows\fonts
    18. Const sfidTEMPLATES = &H15               ' Vorlagen
    19. Const sfidCOMMON_STARTMENU = &H16        ' All Users\StartMenu
    20. Const sfidCOMMON_PROGRAMS = &H17         ' AllUsers\Programs
    21. Const sfidCOMMON_STARTUP = &H18          ' AllUsers\Startup
    22. Const sfidCOMMON_DESKTOPDIRECTORY = &H19 ' AllUsers\Desktop
    23. Const sfidAPPDATA = &H1A                 ' name>\Application Data
    24. Const sfidPRINTHOOD = &H1B               ' name>\PrintHood
    25. Const sfidLOCAL_APPDATA = &H1C           ' name>\Local Settings\Applicaiton Data (non roaming)
    26. Const sfidALTSTARTUP = &H1D              ' non localizedstartup
    27. Const sfidCOMMON_ALTSTARTUP = &H1E       ' non localizedCommon startup
    28. Const sfidCOMMON_FAVORITES = &H1F
    29. Const sfidINTERNET_CACHE = &H20
    30. Const sfidCOOKIES = &H21
    31. Const sfidHISTORY = &H22
    32. Const sfidCOMMON_APPDATA = &H23          ' AllUsers\Application Data
    33. Const sfidWINDOWS = &H24                 ' GetWindowsDirectory()
    34. Const sfidSYSTEM = &H25                  ' GetSystemDirectory()
    35. Const sfidPROGRAM_FILES = &H26           ' C:\Program Files
    36. Const sfidMYPICTURES = &H27              ' C:\Program Files\My Pictures
    37. Const sfidMYDOCUMENTS = &H5              ' My Documents => s. a. sfidPERSONAL
    38. Const sfidPROFILE = &H28                 ' USERPROFILE
    39. Const sfidSYSTEMX86 = &H29               ' x86 system directory on RISC
    40. Const sfidPROGRAM_FILESX86 = &H2A        ' x86 C:\Program Files on RISC
    41. Const sfidPROGRAM_FILES_COMMON = &H2B    ' C:\Program Files\Common
    42. Const sfidPROGRAM_FILES_COMMONX86 = &H2C ' x86 Program Files\Common on RISC
    43. Const sfidCOMMON_TEMPLATES = &H2D        ' All Users\Templates
    44. Const sfidCOMMON_DOCUMENTS = &H2E        ' All Users\Documents
    45. Const sfidCOMMON_ADMINTOOLS = &H2F       ' All Users\Start Menu\Programs\Administrative Tools
    46. Const sfidADMINTOOLS = &H30              ' \Start Menu\Programs\Administrative Tools
    47. Const sfidProgramFiles = &H10000
    48. Const sfidCommonFiles = &H10001
    49. Set objShell = CreateObject("Shell.Application")
    50. Set objFolder = objShell.Namespace(sfidMYDOCUMENTS)
    51. Set objFolderItem = objFolder.Self
    52. Wscript.Echo objFolderItem.Path


    Aber das soll es gewesen sein.
    Solange meine Funktion funktioniert, ist ja alles gut.

    Bei der Lösung von Franky kommt immer nur ein Leerstring bzw. eine 0 raus. Den Ansatz werde ich nicht mehr weiterverfolgen. Es mir einfach zu hoch.

    Gruß Achilleus
    Leider schreibt Achilleus nicht, was bei dem Versuch mit SHGetFolderLocation und/oder SHGetKnownFolderIDList für ein Ordner zurück gegeben wird. Ich könnte mir vorstellen das er die Doku in Bezug auf dwFlags und hToken nicht gelesen hat.
    Mfg -Franky-
    Hallo Franky,

    ich habe geschrieben, dass ich diese Funktionen nicht verstehe. Bei den API-Funktionen recycle ich das nur. Hier interessiert mich nur das Endergebnis. :P

    Ich habe Deine Funktion so übernommen, wie du Sie mir vorgegeben hast und ich habe diese einfach (?) auf x64 angepasst, aber der Aufruf gibt mir einfach gar nichts zurück. Kann schon sein, dass ich da noch mehr Parameter angeben muss, aber damit bin ich einfach überfordert.
    Sorry, mehr kann ich dazu nicht sagen.

    Sollte meine Programmroutine irgendwann einmal nicht mehr funktionieren, dann werde ich zu diesem Zeitpunkt eine andere Lösung finden müssen, und sei es über VBS-Code.

    Achilleus schrieb:

    ich habe geschrieben, dass ich diese Funktionen nicht verstehe.
    Ahh, dann kennst Du Dich mit APIs so gar nicht aus. Du kopierst Code aus dem Internet und freust Dich einfach das es das macht was es soll. Kann man machen. ;)

    Achilleus schrieb:

    ich habe diese einfach (?) auf x64 angepasst, aber der Aufruf gibt mir einfach gar nichts zurück.
    Evtl. ist bei der Anpassung für 64bit VBA etwas schief gelaufen und irgendwas gibt die API mit Sicherheit zurück. Und wenn es nur ein entsprechender Fehlercode, der <> S_OK, ist.

    Achilleus schrieb:

    Sollte meine Programmroutine irgendwann einmal nicht mehr funktionieren, dann werde ich zu diesem Zeitpunkt eine andere Lösung finden müssen, und sei es über VBS-Code.
    So schnell wird das nicht passieren das MS die alte Möglichkeit abschaltet. 3 Möglichkeiten hab ich Dir ja genannt wobei ich davon nur noch 2 Möglichkeiten nutzen würde.
    Mfg -Franky-

    Achilleus schrieb:

    da ja VBS doch auch nur ein Wrapper ist.

    Wie kommst Du auf VBS?

    -Franky- schrieb:

    Evtl.
    ist bei der Anpassung für 64bit VBA etwas schief gelaufen

    Ich kann mir vorstellen, dass in den Prozeduren nicht sauber angepasst wurde. Es genügt nicht, nur die Deklarationen anzupassen. Man muss auch die Variablen in den Prozeduren entsprechend anpassen.