![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,890
|
![]()
вот здесь: Succeeded(ShellItem.BindToHandler(n il, BHID_PropertyStore, IID_IPropertyStore, PropertyStore))
говорит, что последний параметр должен быть PPointer --------------------------------------- ### **Ошибка: ожидается `PGUID`, а передан `TGUID`** Lazarus требует **указатель на `TGUID` (`PGUID`)**, но `IID_IPropertyStore` — это просто `TGUID`. --- ### **Исправленный вызов `BindToHandler`** Используй **адрес (`@`)** перед `IID_IPropertyStore`: ```pascal Код:
--- ### **Почему это работает?** - `IID_IPropertyStore` — это `TGUID`, но `BindToHandler` ожидает `PGUID` (указатель). - `@IID_IPropertyStore` **передаёт указатель** на `TGUID`, что решает ошибку. Теперь код должен компилироваться! Если появятся новые ошибки — пиши, разберём. E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#12 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,890
|
![]()
следующая ошибка: Error: Incompatible type for arg no. 3: Got "TGuid", expected "PGUID"
--------------------------------------- ### **Ошибка: ожидается `PGUID`, а передан `TGUID`** Lazarus требует **указатель на `TGUID` (`PGUID`)**, но `IID_IPropertyStore` — это просто `TGUID`. --- ### **Исправленный вызов `BindToHandler`** Используй **адрес (`@`)** перед `IID_IPropertyStore`: ```pascal Код:
--- ### **Почему это работает?** - `IID_IPropertyStore` — это `TGUID`, но `BindToHandler` ожидает `PGUID` (указатель). - `@IID_IPropertyStore` **передаёт указатель** на `TGUID`, что решает ошибку. Теперь код должен компилироваться! Если появятся новые ошибки — пиши, разберём. E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#13 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,890
|
![]()
далее такая ошибка: Error: Identifier not found "TValueVariant"
--------------------------------------- ### **Ошибка: `Identifier not found "TValueVariant"`** В Lazarus нет типа `TValueVariant`. В Delphi он используется для `PROPVARIANT`, но в Free Pascal его нужно заменить. --- ### **Исправленный код с `PROPVARIANT`** Вместо `TValueVariant(nil)` нужно использовать `InitPropVariantFromBoolean(False)` . #### **1. Объявляем `InitPropVariantFromBoolean`** Добавь в код: ```pascal Код:
#### **2. Используем для очистки свойств** Вместо: ```pascal Код:
Используй: ```pascal Код:
--- ### **Почему это работает?** - В Lazarus **нет `TValueVariant`**, но `PROPVARIANT` используется аналогично. - **`InitPropVariantFromBoolean(False )`** создаёт пустой `PROPVARIANT`, обнуляя свойство. - Это соответствует API Windows. Теперь код должен работать без ошибки! Если будут ещё ошибки — пиши, разберём. E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#14 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,890
|
![]()
Все равно ошибка: ClearProperties.lpr(106,60) Error: Incompatible type for arg no. 2: Got "PROPVARIANT", expected "TPROPVARIANT"
--------------------------------------- ### **Ошибка: ожидался `TPROPVARIANT`, а передан `PROPVARIANT`** В Free Pascal нет предопределённого `TPROPVARIANT`, но в Windows API `PROPVARIANT` и `TPROPVARIANT` — одно и то же. --- ### **Как исправить?** Переименуй `PROPVARIANT` в `TPROPVARIANT` при объявлении типа: ```pascal Код:
Теперь замени `PROPVARIANT` на `TPROPVARIANT`: ```pascal Код:
### **Использование в коде** ```pascal Код:
--- ### **Почему это работает?** - В Lazarus нет `TPROPVARIANT`, но Windows API ожидает именно его. - `TPROPVARIANT` теперь правильно совпадает с ожиданиями `SetValue`. Теперь код должен скомпилироваться! Если всё равно есть ошибка — пиши, разберём. E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#15 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,890
|
![]()
Тут ошибка: ClearProperties.lpr(137,17) Error: Incompatible type for arg no. 1: Got "TRawbyteSearchRec", expected "QWord"
--------------------------------------- ### **Ошибка: `Got "TRawbyteSearchRec", expected "QWord"`** Эта ошибка обычно возникает при использовании `FindFirst` / `FindNext` для работы с файлами. #### **Причина ошибки** `FindFirst` в Lazarus возвращает `TRawbyteSearchRec`, но ты, вероятно, передаёшь его в функцию, ожидающую `QWord`. #### **Как исправить?** Если код выглядит так: ```pascal Код:
то функция `ProcessFile` ожидает `QWord`, но `SR` — это структура. ##### **Решение 1: Передавать `SR.Size` (размер файла)** Если `ProcessFile` ожидает размер файла, передавай `SR.Size`: ```pascal Код:
##### **Решение 2: Передавать имя файла** Если `ProcessFile` должна работать с файлом, передавай `SR.Name`: ```pascal Код:
##### **Решение 3: Изменить сигнатуру `ProcessFile`** Если ты сам писал `ProcessFile`, измени её так: ```pascal Код:
--- ### **Вывод** В `FindFirst` исправь передачу `TRawbyteSearchRec` (используй `SR.Size` или `SR.Name`). Теперь код должен работать! Если будут новые ошибки — пиши, разберём. E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#16 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,890
|
![]()
Теперь запустилось, но во время выполнения получаю ACCESS VIOLATION
--------------------------------------- ### **Ошибка ACCESS VIOLATION: разбор и исправление** Ошибка **ACCESS VIOLATION** означает, что программа пытается обратиться к памяти, которая не была выделена или уже освобождена. --- ### **Где может быть проблема?** #### **1. `ShellItem` или `PropertyStore` не были созданы** Если `SHCreateItemFromParsingName` или `BindToHandler` не сработали, то `ShellItem` или `PropertyStore` равны `nil`, и при вызове метода (`Commit`, `SetValue`) будет ошибка. #### **✅ Исправление**: Перед использованием **проверяй**, что `ShellItem` и `PropertyStore` не `nil`: ```pascal Код:
--- #### **2. `SHCreateItemFromParsingName` или `BindToHandler` возвращает ошибку** Если `SHCreateItemFromParsingName` не создаёт `IShellItem2`, то `ShellItem` недействителен. #### **✅ Исправление**: Выводи результат вызова функций: ```pascal Код:
Если `hr` < 0, значит, функция завершилась с ошибкой, и программа не должна пытаться использовать объект. --- #### **3. Ошибка при установке свойства (`SetValue`)** Если передаёшь некорректный `PROPVARIANT`, будет `ACCESS VIOLATION`. #### **✅ Исправление**: Используй `VT_EMPTY` вместо `VT_BOOL`: ```pascal Код:
--- ### **Вывод** 1. **Проверяй `Assigned(ShellItem)` и `Assigned(PropertyStore)`.** 2. **Логируй ошибки `SHCreateItemFromParsingName` и `BindToHandler` (см. `hr`).** 3. **Используй `VT_EMPTY` для очистки свойств.** Попробуй исправить и напиши, если ещё будет `ACCESS VIOLATION`. E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#17 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,890
|
![]()
Вот полный код, который у меня получился:
Код:
E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#18 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,890
|
![]()
---------------------------------------
### **Ошибка ACCESS VIOLATION: разбор и исправление** Твой код почти верный, но в нём есть несколько проблем, которые могут вызывать `ACCESS VIOLATION`. --- ## ** Где могут быть ошибки?** ### **1. `SHCreateItemFromParsingName` может вернуть `nil`** Если `SHCreateItemFromParsingName` не находит файл или API не поддерживает этот вызов, `ShellItem` будет `nil`. ### **✅ Исправление** Перед использованием `ShellItem` проверяй его на `Assigned`: ```pascal Код:
--- ### **2. `BindToHandler` может вернуть `nil`** Если `BindToHandler` не создаёт `PropertyStore`, `P` остаётся `nil`, и при приведении к `IPropertyStore` будет ошибка. ### **✅ Исправление** Перед приведением `Pointer` к `IPropertyStore` проверяй `P`: ```pascal Код:
--- ### **3. Использование `@BHID_PropertyStore` вместо `BHID_PropertyStore`** Вызов `ShellItem.BindToHandler(nil, @BHID_PropertyStore, @IID_IPropertyStore, P)` должен передавать `BHID_PropertyStore` без `@`. ### **✅ Исправление** Используй: ```pascal Код:
**без `@` перед `BHID_PropertyStore` и `IID_IPropertyStore`**. --- ### **4. `TPROPVARIANT` должен быть очищен перед `SetValue`** Чтобы избежать ошибок с `SetValue`, используй `VT_EMPTY`, а не `VT_BOOL`. ### **✅ Исправление** ```pascal Код:
--- ### **5. `CoInitialize(nil)` должен вызываться в `begin ... end.`** Ты вызываешь `CoInitialize(nil);` **в начале `try`**, но `CoUninitialize;` выполнится **даже если `CoInitialize` не сработает**. ### **✅ Исправление** Перенеси `CoInitialize(nil)` перед `try`: ```pascal Код:
--- ## ** Полный исправленный код `ClearFileProperties`** ```pascal Код:
--- ## ** Итог** ### **Что исправлено?** ✅ Проверяется `SHCreateItemFromParsingName` ✅ Проверяется `BindToHandler` ✅ Убраны `@` перед `BHID_PropertyStore` и `IID_IPropertyStore` ✅ `PROPVARIANT` теперь `VT_EMPTY`, а не `VT_BOOL` ✅ `CoInitialize(nil);` теперь вызывается **до `try`** Теперь код должен работать **без `ACCESS VIOLATION`**. Попробуй и напиши, если будут ошибки! E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#19 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,890
|
![]()
Вот весь код:
Код:
E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#20 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,890
|
![]()
---------------------------------------
### **Ошибки и исправления** Твой код **почти** правильный, но есть несколько ошибок, из-за которых происходит `ACCESS VIOLATION`. --- ## ** Ошибки, вызывающие ACCESS VIOLATION** ### **1. Использование `@BHID_PropertyStore` и `@IID_IPropertyStore`** Ты передаёшь `@BHID_PropertyStore` и `@IID_IPropertyStore` в `BindToHandler`, но **адрес передавать не нужно**. ✅ **Исправление:** ```pascal Код:
**Без `@` перед `BHID_PropertyStore` и `IID_IPropertyStore`.** --- ### **2. `TPROPVARIANT.boolVal` используется неправильно** В `InitPropVariantFromBoolean` ты используешь `VT_EMPTY`, но при этом пишешь `boolVal`. **`VT_EMPTY` не совместим с `boolVal`**, из-за этого может быть ошибка. ✅ **Исправление:** ```pascal Код:
Но так как мы обнуляем свойства, **лучше вообще убрать `boolVal` и использовать `VT_EMPTY` прямо в коде**. --- ### **3. Не обнуляется `EmptyProp` перед `SetValue`** Перед установкой свойства `EmptyProp` должен быть **обнулён**, иначе остаются мусорные данные. ✅ **Исправление:** ```pascal Код:
--- ## ** Полный исправленный код `ClearFileProperties`** ```pascal Код:
--- ## ** Итог** ### **Что исправлено?** ✅ **Использование `BHID_PropertyStore` и `IID_IPropertyStore` без `@`** ✅ **Исправлено `InitPropVariantFromBoolean`** ✅ **Обнулён `EmptyProp` перед `SetValue`** Теперь код **не должен выдавать `ACCESS VIOLATION`**. Попробуй и напиши, если ошибка останется! 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 |