Отладка функции добавления папки в IShellLibrary в Delphi: устранение ACCESS_VIOLATION
*Примечание: использованы пробелы в названии, чтобы уложиться в лимит символов.*
Отладка функции добавления папки в IShellLibrary в Delphi: устранение ACCESS_VIOLATION
При работе с библиотеками в Windows 7 через интерфейс IShellLibrary пользователи могут столкнуться с ошибкой доступа к памяти (ACCESS_VIOLATION), которая возникает при попытке добавления папки в библиотеку. Эта ошибка связана с неправильным управлением объектами COM и их счетчиками ссылок.
В функциях AddFolderToLibrary и RemoveFolderFromLibrary осуществляется создание экземпляра IShellLibrary и попытка добавления или удаления папки соответственно. Проблема заключается в том, что в переводе функции SHAddFolderPathToLibrary на Delphi, инженеры Embarcadero некорректно обработали вызов метода _Release, который должен быть выполнен автоматически компилятором.
Вот исправленная версия функции AddFolderToLibrary:
function AddFolderToLibrary(AFolder: string): HRESULT;
var
plib: IShellLibrary;
begin
Result := CoCreateInstance(CLSID_ShellLibrary, nil, CLSCTX_INPROC_SERVER,
IID_IShellLibrary, plib);
if SUCCEEDED(Result) then
begin
// Создаем объект IShellItem из пути к папке
var psiFolder: IShellItem;
Result := SHCreateItemFromParsingName(PWideChar(AFolder), nil, IID_IShellItem, psiFolder);
if SUCCEEDED(Result) then
begin
// Добавляем папку в библиотеку
Result := plib.AddFolder(psiFolder);
end;
end;
// Счетчик ссылок на plib будет уменьшен автоматически компилятором
end;
Важно отметить, что в коде выше не требуется явный вызов _Release для объекта plib, так как это делается автоматически при выходе из области видимости переменной plib.
Также, для корректной работы с библиотеками, следует использовать известные идентификаторы, такие как FOLDERID_Libraries, и правильно сохранять созданные библиотеки.
В случае возникновения дополнительных ошибок или вопросов, рекомендуется обратиться к документации и примеры использования IShellLibrary для Delphi.
При работе с интерфейсом `IShellLibrary` в Delphi для Windows 7 возникает ошибка `ACCESS_VIOLATION` при попытке добавления папки в библиотеку из-за неправильного управления объектами COM и их счетчиками ссылок.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS