Почему SHGetKnownFolderPath завершается с ошибкой -2147024894 при использовании GUID в неанглийской Windows?Python

Программы на Python
Ответить
Anonymous
 Почему SHGetKnownFolderPath завершается с ошибкой -2147024894 при использовании GUID в неанглийской Windows?

Сообщение Anonymous »

Код: Выделить всё

import os
import ctypes
import logging
from ctypes import windll, byref, create_unicode_buffer, Structure, c_uint32, c_uint16, c_uint8
from uuid import UUID

# Logging instellen
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)

class GUID(Structure):
_fields_ = [
("Data1", ctypes.c_uint32),
("Data2", ctypes.c_uint16),
("Data3", ctypes.c_uint16),
("Data4", ctypes.c_uint8 * 8)
]

def string_to_guid(guid_string):
"""Converteer een GUID-string naar een ctypes GUID-structuur."""
guid = UUID(guid_string)
return GUID(
guid.fields[0],
guid.fields[1],
guid.fields[2],
(ctypes.c_uint8 * 8)(*guid.fields[3:])
)

def get_known_folder_path(folder_id):
"""Haal het pad op van een bekende Windows-map via GUID."""
try:
guid = string_to_guid(folder_id)
path_buf = create_unicode_buffer(260)  # Buffer voor het pad
result = windll.shell32.SHGetKnownFolderPath(byref(guid), 0, None, byref(path_buf))
if result == 0:
path = path_buf.value
logging.info("Map gevonden: %s", path)
return path
else:
logging.error("SHGetKnownFolderPath fout: %s", result)
return None
except Exception as e:
logging.error("Fout bij ophalen map: %s", e)
return None

if __name__ == "__main__":
# GUID's voor standaard Windows-mappen
known_folders = {
"Desktop": "{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}",
"Documents": "{FDD39AD0-238F-46AF-ADB4-6C85480369C7}",
"Pictures": "{33E28130-4E1E-4676-835A-98395C3BC3BB}",
"Videos": "{18989B1D-99B5-455B-841C-AB7C74E4DDFC}",
"Downloads": "{374DE290-123F-4565-9164-39C4925E467B}",
}

for folder_name, folder_guid in known_folders.items():
logging.info("Controleren of %s bestaat...", folder_name)
folder_path = get_known_folder_path(folder_guid)
if folder_path:
logging.info("Pad voor %s: %s", folder_name, folder_path)
else:
logging.error("Kon het pad voor %s niet ophalen.", folder_name)
Я работаю над сценарием Python для получения путей к стандартным папкам Windows (например, «Рабочий стол», «Документы», «Изображения»), используя их GUID. Я использую SHGetKnownFolderPath в сочетании с идентификаторами GUID, указанными в документации Microsoft. Однако функция постоянно завершается с ошибкой с кодом -2147024894 (файл не найден) при запуске установки Windows 10 на голландском языке.
Вот основная логика моего скрипта:
  • Преобразуйте строки GUID в структуры GUID ctypes.
  • Использование SHGetKnownFolderPath для получения путей к папкам.

    Код: Выделить всё

    import os
    import ctypes
    import logging
    from ctypes import windll, byref, create_unicode_buffer, Structure, c_uint32, c_uint16, c_uint8
    from uuid import UUID
    
    # Set up logging
    logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
    )
    
    class GUID(Structure):
    """Define a GUID structure compatible with ctypes."""
    _fields_ = [
    ("Data1", ctypes.c_uint32),
    ("Data2", ctypes.c_uint16),
    ("Data3", ctypes.c_uint16),
    ("Data4", ctypes.c_uint8 * 8)
    ]
    
    def string_to_guid(guid_string):
    """Convert a GUID string into a ctypes-compatible GUID structure."""
    guid = UUID(guid_string)
    guid_struct = GUID(
    guid.fields[0],
    guid.fields[1],
    guid.fields[2],
    (ctypes.c_uint8 * 8)(*guid.fields[3:])
    )
    logging.info("GUID string: %s", guid_string)
    logging.info("GUID struct: %s", guid_struct)
    return guid_struct
    
    def get_known_folder_path(folder_id):
    """
    Retrieve the path of a known Windows folder using its GUID.
    Uses the SHGetKnownFolderPath function from the Windows API.
    """
    try:
    guid = string_to_guid(folder_id)
    path_buf = create_unicode_buffer(260)  # Buffer for the path
    result = windll.shell32.SHGetKnownFolderPath(byref(guid), 0, None, byref(path_buf))
    logging.info("Result code: %s", result)
    if result == 0:
    path = path_buf.value
    logging.info("Folder found: %s", path)
    return path
    else:
    logging.error("SHGetKnownFolderPath error: %s", result)
    return None
    except Exception as e:
    logging.error("Error retrieving folder: %s", e)
    return None
    
    def debug_system_error():
    """Retrieve additional error details using GetLastError."""
    error_code = windll.kernel32.GetLastError()
    logging.error("GetLastError: %s", error_code)
    
    if __name__ == "__main__":
    # GUIDs for standard Windows folders
    known_folders = {
    "Desktop": "{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}",
    "Documents": "{FDD39AD0-238F-46AF-ADB4-6C85480369C7}",
    "Pictures": "{33E28130-4E1E-4676-835A-98395C3BC3BB}",
    "Videos": "{18989B1D-99B5-455B-841C-AB7C74E4DDFC}",
    "Downloads": "{374DE290-123F-4565-9164-39C4925E467B}",
    }
    
    # Test using SHGetKnownFolderPath
    for folder_name, folder_guid in known_folders.items():
    logging.info("Checking if %s exists...", folder_name)
    folder_path = get_known_folder_path(folder_guid)
    if folder_path:
    logging.info("Path for %s: %s", folder_name, folder_path)
    else:
    logging.error("Could not retrieve path for %s.", folder_name)
    debug_system_error()
    
2024-12-22 19:21:27 - ИНФОРМАЦИЯ - Проверка существования рабочего стола...
22.12.2024 19:21:27 - ИНФОРМАЦИЯ - строка GUID: {B4BFCC3A-DB2C-424C-B029-7FE99A87C641
22 декабря 2024 г. 19:21:27 - ИНФОРМАЦИЯ - Структура GUID:
2024-12-22 19:21:27 - ИНФОРМАЦИЯ - Код результата: -2147024894
2024-12-22 19:21:27 - ОШИБКА - Ошибка SHGetKnownFolderPath: -2147024894
22 декабря 2024 г. 19:21:27 - ОШИБКА - Не удалось получить путь для рабочего стола.
2024-12-22 19:21:27 - ОШИБКА - GetLastError: 0
2024-12-22 19:21:27 - ИНФОРМАЦИЯ - Проверка существования документов...
2024-12-22 19:21:27 - INFO - строка GUID: {FDD39AD0-238F-46AF-ADB4-6C85480369C7
22 декабря 2024 19:21:27 - INFO - структура GUID: < _main_.GUID объект в 0x000001DD9FA0F650>
22 декабря 2024 19:21:27 - ИНФОРМАЦИЯ - Код результата: -2147024894
22 декабря 2024 19:21 :27 — ОШИБКА — ошибка SHGetKnownFolderPath: -2147024894
22 декабря 2024 г. 19:21:27 — ОШИБКА — не удалось получить путь к документам.
22 декабря 2024 г. 19 :21:27 - ОШИБКА - GetLastError: 0
2024-12-22 19:21:27 - ИНФОРМАЦИЯ – Проверка существования изображений...
2024-12-22 19:21:27 – ИНФОРМАЦИЯ – строка GUID: {33E28130-4E1E-4676-835A-98395C3BC3BB >
2024-12-22 19:21:27 - ИНФОРМАЦИЯ - Структура GUID: Объект
22 декабря 2024 19:21:27 - ИНФОРМАЦИЯ - Код результата: -2147024894
2024-12-22 19:21:27 - ОШИБКА - Ошибка SHGetKnownFolderPath: -2147024894
2024-12-22 19:21:27 — ОШИБКА — не удалось получить путь для изображений.
2024-12 -22 19:21:27 - ОШИБКА - GetLastError: 0
2024-12-22 19:21:27 - ИНФОРМАЦИЯ - Проверка существования видео...
2024-12-22 19:21:27 - ИНФОРМАЦИЯ - GUID строка: {18989B1D-99B5-455B-841C-AB7C74E4DDFC
22 декабря 2024 19:21:27 - INFO - Структура GUID: объект
2024 -12-22 19:21:27 - ИНФОРМАЦИЯ - Код результата: -2147024894
2024-12-22 19:21:27 - ОШИБКА - Ошибка SHGetKnownFolderPath: -2147024894
2024-12-22 19:21:27 - ОШИБКА - Не удалось получить путь для видео.
22 декабря 2024 г. 19:21:27 - ОШИБКА - GetLastError: 0
2024-12-22 19:21:27 - ИНФОРМАЦИЯ - Проверка наличия загрузок...
22 декабря 2024 г., 19:21:27 - ИНФОРМАЦИЯ - строка GUID: {374DE290-123F-4565-9164-39C4925E467B
2024-12-22 19:21:27 - ИНФОРМАЦИЯ - Структура GUID:
2024-12-22 19:21:27 - ИНФОРМАЦИЯ - Код результата: -2147024894
2024-12-22 19:21:27 - ОШИБКА - Ошибка SHGetKnownFolderPath: -2147024894
22 декабря 2024 г. 19:21:27 - ОШИБКА - Не удалось получить путь для загрузок.
2024-12-22 19:21:27 - ОШИБКА - GetLastError: 0

Подробнее здесь: https://stackoverflow.com/questions/793 ... guids-on-a
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»