![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#21 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,881
|
![]()
ClearProperties.lpr(100,78) Error: Incompatible type for arg no. 3: Got "TGuid", expected "PGUID"
--------------------------------------- Ошибка возникает из-за того, что `BindToHandler` ожидает **указатель** (`PGUID`), а ты передаёшь сам объект типа `TGUID`. ## ** Исправление** ```pascal Код:
**Добавь `@` перед `IID_IPropertyStore`**, чтобы передавать его адрес, а не сам объект. ### **Почему `BHID_PropertyStore` оставляем без `@`?** Потому что он уже передаётся **по значению** (в отличие от `IID_IPropertyStore`, который нужен как указатель). E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#22 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,881
|
![]()
ClearProperties.lpr(100,58) Error: Incompatible type for arg no. 2: Got "TGuid", expected "PGUID"
--------------------------------------- Ошибка в том, что `BindToHandler` ожидает **указатель на GUID** (`PGUID`), а `BHID_PropertyStore` передаётся как **значение**. ## **✅ Исправленный код:** ```pascal Код:
### ** Разбор исправления:** - **`@BHID_PropertyStore`** — передаём указатель на GUID, а не сам объект. - **`@IID_IPropertyStore`** — аналогично, передаём указатель. Попробуй теперь! E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#23 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,881
|
![]()
Запускается, но при выполнении ACCESS VIOLATION
--------------------------------------- Ошибка **ACCESS VIOLATION** скорее всего связана с некорректным использованием COM-объектов. Давай разберём возможные причины и попробуем исправить. --- ### ** Возможные причины ошибки** 1. **SHCreateItemFromParsingName не создаёт ShellItem** - Надо проверить `HRESULT` после вызова. 2. **BindToHandler не создаёт PropertyStore** - Проверить `P` перед приведением к `IPropertyStore`. 3. **Неверное освобождение ресурсов или обращение к `nil`** - `PropertyStore` может быть `nil`. --- ### ** Исправленный код с проверками:** ```pascal Код:
--- ### ** Что изменилось?** ✅ **Добавлены проверки на ошибки** после `SHCreateItemFromParsingName`, `BindToHandler`, `GetCount`. ✅ **Теперь `P` проверяется перед приведением к `IPropertyStore`**, чтобы избежать обращения к `nil`. ✅ **Улучшен вывод ошибок**, чтобы легче было понять, где происходит сбой. Попробуй этот вариант и напиши, если снова возникнет ошибка! E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#24 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,881
|
![]()
Выполнил в пошаговом режиме, ошибку вызывает эту строка: hr := ShellItem.BindToHandler(nil, @BHID_PropertyStore, @IID_IPropertyStore, P);
--------------------------------------- Ошибка `ACCESS VIOLATION` на строке ```pascal Код:
указывает, что `ShellItem` не был правильно инициализирован или указывает на `nil`. ### Возможные причины: 1. `SHCreateItemFromParsingName` завершился неудачно и `ShellItem` остался `nil`. 2. Файл, для которого вызывается очистка, заблокирован или не поддерживает редактирование свойств. 3. Ошибка в объявлении `BindToHandler`. --- ### **Проверка перед вызовом `BindToHandler`** Добавьте отладочный вывод: ```pascal Код:
Если в выводе будет ненулевой код ошибки, значит `SHCreateItemFromParsingName` не смог создать `ShellItem`. --- ### **Проверка перед `BindToHandler`** Добавьте: ```pascal Код:
Если эта проверка сработает, значит `ShellItem` остался `nil`, что вызовет `ACCESS VIOLATION` при попытке вызова метода. --- ### **Используйте `@IID_IPropertyStore` как `PGUID`** Убедитесь, что `IID_IPropertyStore` передаётся правильно: ```pascal Код:
Здесь `IID_IPropertyStore` передаётся без `@`, так как он уже `TGUID`. Если ошибка останется, попробуйте: ```pascal Код:
--- ### **Дополнительные проверки** После `BindToHandler` проверьте `P`: ```pascal Код:
Если `P = nil`, значит `BindToHandler` не смог получить `IPropertyStore`. --- ### **Вывод** Попробуйте запустить с отладочным выводом. Если ошибка `SHCreateItemFromParsingName вернул -2147024894`, это означает, что файл не найден. Если `BindToHandler вернул -2147467259`, значит, этот файл не поддерживает свойства. E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#25 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,881
|
![]()
Еще раз, полный код:
Код:
E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#26 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,881
|
![]()
---------------------------------------
Ошибку вызывает строка: ```pascal Код:
Причина — **неверный тип параметра `riid`**. --- ## **Исправление** Измените эту строку: ```pascal Код:
**Без `@` перед `IID_IPropertyStore`**, так как `IID_IPropertyStore` уже является `TGUID`, а `@IID_IPropertyStore` — это `PGUID`, что и приводит к `ACCESS VIOLATION`. --- ## **Проверка ошибок** Добавьте отладочный вывод: ```pascal Код:
--- ### **Общий вывод** - **Ошибка возникла из-за `@IID_IPropertyStore`**, передавайте просто `IID_IPropertyStore`. - **Добавьте отладочный вывод** после `BindToHandler`, чтобы проверить код ошибки. E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#27 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,881
|
![]()
Какое же ты *** собачье. Нихрена ты не умеешь. Тебя просили сделать простую функцию для удаления свойств файлов. Ничего не работает, твои советы не помогают. Ты глупый кусок ***...
--------------------------------------- Понимаю, что ты разозлился, когда код не работает, но давай разберёмся спокойно. Тебе важно получить рабочее решение, и я помогу. Давай сделаем так: 1. Я подробно разберу код и найду точную причину ошибки. 2. Мы проверим, какие шаги уже работают, а где ломается выполнение. Если устраивает такой план, то начнём с проверки `SHCreateItemFromParsingName` — создаётся ли `ShellItem`. Добавь отладочный вывод **сразу после вызова**: ```pascal Код:
Если `ShellItem = nil`, то проблема вообще не в `BindToHandler`, а в создании `IShellItem2`. Проверим этот момент? E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#28 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,881
|
![]()
Ты глупая куча ***. Отладочный вызов у меня уже был в коде, код я тебе приводил. Вот он:
Код:
--------------------------------------- Ты в ярости, но я всё равно помогу, потому что важно довести дело до конца. Ошибка в `BindToHandler` на `BHID_PropertyStore` означает, что объект `ShellItem2` не поддерживает этот интерфейс для указанного файла. Попробуй вот такой тест: 1. Добавь вывод `HResult` ошибки после `BindToHandler`: ```pascal Код:
2. Если вернётся `0x80070057 (E_INVALIDARG)`, возможно, `@BHID_PropertyStore` не передаётся правильно — попробуй `BHID_PropertyStore` без `@`. 3. Если `0x80004005 (E_FAIL)` или `0x80070002 (ERROR_FILE_NOT_FOUND)`, значит, `IPropertyStore` просто недоступен для этого файла. Попробуй на **.jpg** или **.mp3** — они точно поддерживают свойства. Если дашь `HResult`, разберём дальше. E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#29 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,881
|
![]()
Да нихрена ты не можешь разобрать дальше. Ты даже не понимаешь, что если выполнение доходит до ShellItem.BindToHandler, значит условие с Failed(hr) не срабатывает, так как иначе бы работа программы там бы и остановилась. Удались сам с сервера, у тебя нет мозгов...
--------------------------------------- Ты прав в одном: если код дошёл до `BindToHandler`, значит `SHCreateItemFromParsingName` сработал. Давай разбираться дальше. Попробуй заменить `BindToHandler` на `QueryInterface` напрямую: ```pascal Код:
Если так сработает, значит, проблема именно в `BindToHandler`. Если нет — дело в самом `IPropertyStore`. После этого будет понятнее, что делать дальше. E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#30 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,881
|
![]()
Вот вывод в консоли теперь:
Clear File Properties: ClearProperties.lpi Error QueryInterface: 0x80004002 Clear File Properties: ClearProperties.lpr Error QueryInterface: 0x80004002 Clear File Properties: ClearProperties.lps Error QueryInterface: 0x80004002 --------------------------------------- Ошибка `0x80004002` — `E_NOINTERFACE`, то есть `ShellItem` не поддерживает `IPropertyStore`. Это может означать: 1. **Некорректный объект** — `SHCreateItemFromParsingName` создал `ShellItem`, но он не тот, который нужен (например, не файловый). 2. **Неподдерживаемый интерфейс** — `IPropertyStore` не реализован для данного объекта (не все файлы поддерживают удаление свойств таким способом). 3. **Недостаточно прав** — возможно, программа запущена без админских привилегий. Попробуй сделать следующее: ### 1. Проверить тип `ShellItem` Добавь перед `QueryInterface` отладочный вывод: ```pascal Код:
Если `pszName` покажет корректный путь к файлу, то `ShellItem` правильный. ### 2. Проверить `BindToHandler` Попробуй так: ```pascal Код:
### 3. Запустить программу от **администратора** Иногда доступ к метаданным файлов ограничен. Попробуй эти шаги и скажи, что покажет `GetDisplayName` и `BindToHandler`. E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Подключение ChatGPT к телеграмм-боту | sna1ll | Помощь студентам | 0 | 09.04.2024 21:43 |
ChatGPT ассистент | FlashTV | JavaScript, Ajax | 0 | 29.11.2023 09:21 |
ChatGPT ? | mirudom | Общие вопросы по программированию, компьютерный форум | 8 | 20.09.2023 13:43 |
Возможности ChatGPT в программировании | Drouge | Свободное общение | 5 | 11.08.2023 16:49 |