Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2025, 18:04   #21
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,881
По умолчанию

ClearProperties.lpr(100,78) Error: Incompatible type for arg no. 3: Got "TGuid", expected "PGUID"

---------------------------------------

Ошибка возникает из-за того, что `BindToHandler` ожидает **указатель** (`PGUID`), а ты передаёшь сам объект типа `TGUID`.

## **�� Исправление**
```pascal
Код:
hr := ShellItem.BindToHandler(nil, BHID_PropertyStore, @IID_IPropertyStore, P);
```
**Добавь `@` перед `IID_IPropertyStore`**, чтобы передавать его адрес, а не сам объект.

### **Почему `BHID_PropertyStore` оставляем без `@`?**
Потому что он уже передаётся **по значению** (в отличие от `IID_IPropertyStore`, который нужен как указатель).
Arigato вне форума Ответить с цитированием
Старый 31.03.2025, 18:04   #22
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 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
Код:
hr := ShellItem.BindToHandler(nil, @BHID_PropertyStore, @IID_IPropertyStore, P);
```
### **�� Разбор исправления:**
- **`@BHID_PropertyStore`** — передаём указатель на GUID, а не сам объект.
- **`@IID_IPropertyStore`** — аналогично, передаём указатель.

Попробуй теперь!
Arigato вне форума Ответить с цитированием
Старый 31.03.2025, 18:04   #23
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,881
По умолчанию

Запускается, но при выполнении ACCESS VIOLATION

---------------------------------------

Ошибка **ACCESS VIOLATION** скорее всего связана с некорректным использованием COM-объектов. Давай разберём возможные причины и попробуем исправить.

---

### **�� Возможные причины ошибки**
1. **SHCreateItemFromParsingName не создаёт ShellItem**
- Надо проверить `HRESULT` после вызова.

2. **BindToHandler не создаёт PropertyStore**
- Проверить `P` перед приведением к `IPropertyStore`.

3. **Неверное освобождение ресурсов или обращение к `nil`**
- `PropertyStore` может быть `nil`.

---

### **�� Исправленный код с проверками:**
```pascal
Код:
procedure ClearFileProperties(const FilePath: string);
var
  PropertyStore: IPropertyStore;
  PropertyCount, I: Cardinal;
  PropertyKey: TPropertyKey;
  ShellItem: IShellItem2;
  P: Pointer;
  EmptyProp: TPROPVARIANT;
  hr: HRESULT;
begin
  CoInitialize(nil);
  try
    // 1. Создаём ShellItem
    hr := SHCreateItemFromParsingName(PWideChar(WideString(FilePath)), nil, IID_IShellItem2, ShellItem);
    if Failed(hr) or (ShellItem = nil) then
    begin
      WriteLn('Ошибка: SHCreateItemFromParsingName не создал ShellItem для ', FilePath);
      Exit;
    end;

    // 2. Привязываем PropertyStore
    P := nil;
    hr := ShellItem.BindToHandler(nil, @BHID_PropertyStore, @IID_IPropertyStore, P);
    if Failed(hr) or (P = nil) then
    begin
      WriteLn('Ошибка: BindToHandler не создал PropertyStore для ', FilePath);
      Exit;
    end;

    // 3. Приводим Pointer к IPropertyStore
    PropertyStore := IPropertyStore(P);
    if PropertyStore = nil then
    begin
      WriteLn('Ошибка: PropertyStore оказался nil.');
      Exit;
    end;

    // 4. Получаем количество свойств
    hr := PropertyStore.GetCount(PropertyCount);
    if Failed(hr) then
    begin
      WriteLn('Ошибка: GetCount не удалось получить количество свойств.');
      Exit;
    end;

    // 5. Очищаем свойства
    for I := 0 to PropertyCount - 1 do
    begin
      hr := PropertyStore.GetAt(I, PropertyKey);
      if Succeeded(hr) then
      begin
        FillChar(EmptyProp, SizeOf(EmptyProp), 0);
        EmptyProp.vt := VT_EMPTY;
        PropertyStore.SetValue(PropertyKey, EmptyProp);
      end;
    end;

    // 6. Сохраняем изменения
    hr := PropertyStore.Commit;
    if Failed(hr) then
    begin
      WriteLn('Ошибка: Commit не удалось сохранить изменения.');
    end;
  finally
    CoUninitialize;
  end;
end;
```

---

### **�� Что изменилось?**
✅ **Добавлены проверки на ошибки** после `SHCreateItemFromParsingName`, `BindToHandler`, `GetCount`.
✅ **Теперь `P` проверяется перед приведением к `IPropertyStore`**, чтобы избежать обращения к `nil`.
✅ **Улучшен вывод ошибок**, чтобы легче было понять, где происходит сбой.

�� Попробуй этот вариант и напиши, если снова возникнет ошибка!
Arigato вне форума Ответить с цитированием
Старый 31.03.2025, 18:04   #24
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,881
По умолчанию

Выполнил в пошаговом режиме, ошибку вызывает эту строка: hr := ShellItem.BindToHandler(nil, @BHID_PropertyStore, @IID_IPropertyStore, P);

---------------------------------------

Ошибка `ACCESS VIOLATION` на строке
```pascal
Код:
hr := ShellItem.BindToHandler(nil, @BHID_PropertyStore, @IID_IPropertyStore, P);
```
указывает, что `ShellItem` не был правильно инициализирован или указывает на `nil`.

### Возможные причины:
1. `SHCreateItemFromParsingName` завершился неудачно и `ShellItem` остался `nil`.
2. Файл, для которого вызывается очистка, заблокирован или не поддерживает редактирование свойств.
3. Ошибка в объявлении `BindToHandler`.

---

### **Проверка перед вызовом `BindToHandler`**
Добавьте отладочный вывод:
```pascal
Код:
hr := SHCreateItemFromParsingName(PWideChar(WideString(FilePath)), nil, IID_IShellItem2, ShellItem);
if Failed(hr) or not Assigned(ShellItem) then
begin
  WriteLn('Ошибка: SHCreateItemFromParsingName вернул ', hr, ' для ', FilePath);
  Exit;
end;
```
Если в выводе будет ненулевой код ошибки, значит `SHCreateItemFromParsingName` не смог создать `ShellItem`.

---

### **Проверка перед `BindToHandler`**
Добавьте:
```pascal
Код:
if ShellItem = nil then
begin
  WriteLn('Ошибка: ShellItem не инициализирован для ', FilePath);
  Exit;
end;
```
Если эта проверка сработает, значит `ShellItem` остался `nil`, что вызовет `ACCESS VIOLATION` при попытке вызова метода.

---

### **Используйте `@IID_IPropertyStore` как `PGUID`**
Убедитесь, что `IID_IPropertyStore` передаётся правильно:
```pascal
Код:
P := nil;
hr := ShellItem.BindToHandler(nil, @BHID_PropertyStore, IID_IPropertyStore, P);
```
Здесь `IID_IPropertyStore` передаётся без `@`, так как он уже `TGUID`. Если ошибка останется, попробуйте:
```pascal
Код:
hr := ShellItem.BindToHandler(nil, @BHID_PropertyStore, @IID_IPropertyStore, P);
```

---

### **Дополнительные проверки**
После `BindToHandler` проверьте `P`:
```pascal
Код:
if Failed(hr) or (P = nil) then
begin
  WriteLn('Ошибка: BindToHandler вернул ', hr, ' для ', FilePath);
  Exit;
end;
```
Если `P = nil`, значит `BindToHandler` не смог получить `IPropertyStore`.

---

### **Вывод**
Попробуйте запустить с отладочным выводом. Если ошибка `SHCreateItemFromParsingName вернул -2147024894`, это означает, что файл не найден. Если `BindToHandler вернул -2147467259`, значит, этот файл не поддерживает свойства.
Arigato вне форума Ответить с цитированием
Старый 31.03.2025, 18:04   #25
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,881
По умолчанию

Еще раз, полный код:

Код:
program ClearProperties;

uses Windows, ActiveX, ComObj, ShlObj, SysUtils;

const
  BHID_PropertyStore: TGUID = '{0384e1a4-1523-439c-937e-92b25ed5ade2}';
  IID_IPropertyStore: TIID = '{886d8eeb-8cf2-4446-8d02-cdba1dbdcf99}';
  IID_IShellItem2: TGUID = '{7E9FB0D3-919F-4307-AB2E-9B1860310C93}';

type
  TPropertyKey = packed record
    fmtid: TGUID;
    pid: DWORD;
  end;
  PPropertyKey = ^TPropertyKey;
  // Объявляем IShellItem2 (расширение IShellItem)
  IShellItem2 = interface(IShellItem)
    ['{7E9FB0D3-919F-4307-AB2E-9B1860310C93}']
    function GetPropertyStore(flags: Cardinal; const riid: TGUID; out ppv): HResult; stdcall;
    function GetPropertyStoreWithCreateObject(flags: Cardinal; const punkCreateObject: IUnknown;
      const riid: TGUID; out ppv): HResult; stdcall;
    function GetPropertyStoreForKeys(const rgKeys: PPropertyKey; cKeys: UINT;
      flags: Cardinal; const riid: TGUID; out ppv): HResult; stdcall;
    function GetPropertyDescriptionList(const keyType: TPropertyKey;
      const riid: TGUID; out ppv): HResult; stdcall;
    function Update(const pbc: IBindCtx): HResult; stdcall;
    function GetProperty(const key: TPropertyKey; var pv: PROPVARIANT): HResult; stdcall;
    function GetCLSID(const key: TPropertyKey; out pclsid: TGUID): HResult; stdcall;
    function GetFileTime(const key: TPropertyKey; out pft: FILETIME): HResult; stdcall;
    function GetInt32(const key: TPropertyKey; out pi: Integer): HResult; stdcall;
    function GetString(const key: TPropertyKey; out ppsz: LPWSTR): HResult; stdcall;
    function GetUInt32(const key: TPropertyKey; out pui: Cardinal): HResult; stdcall;
    function GetUInt64(const key: TPropertyKey; out pull: UInt64): HResult; stdcall;
    function GetBool(const key: TPropertyKey; out pf: BOOL): HResult; stdcall;
  end;
  TPROPVARIANT = packed record
    vt: Word;
    wReserved1, wReserved2, wReserved3: Word;
    case Integer of
      0: (bVal: Byte);
      1: (iVal: SmallInt);
      2: (uiVal: Word);
      3: (lVal: LongInt);
      4: (ulVal: Cardinal);
      5: (hVal: Int64);
      6: (uhVal: UInt64);
      7: (fltVal: Single);
      8: (dblVal: Double);
      9: (bstrVal: PWideChar);
      10: (boolVal: BOOL);
  end;
  // Объявляем IPropertyStore
  IPropertyStore = interface(IUnknown)
    ['{886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99}']
    function GetCount(out cProps: Cardinal): HResult; stdcall;
    function GetAt(iProp: Cardinal; out pkey: TPropertyKey): HResult; stdcall;
    function GetValue(const key: TPropertyKey; out pv: TPROPVARIANT): HResult; stdcall;
    function SetValue(const key: TPropertyKey; const propvar: TPROPVARIANT): HResult; stdcall;
    function Commit: HResult; stdcall;
  end;


const
  shell32 = 'shell32.dll';

function SHCreateItemFromParsingName(
  pszPath: LPCWSTR;
  pbc: Pointer;
  const riid: TGUID;
  out ppv
): HResult; stdcall; external shell32 name 'SHCreateItemFromParsingName';

function InitPropVariantFromBoolean(fVal: Boolean): TPROPVARIANT;
begin
  FillChar(Result, SizeOf(Result), 0);
  Result.vt := VT_BOOL;  // Должно быть VT_BOOL
  Result.boolVal := fVal;
end;

procedure ClearFileProperties(const FilePath: string);
var
  PropertyStore: IPropertyStore;
  PropertyCount, I: Cardinal;
  PropertyKey: TPropertyKey;
  ShellItem: IShellItem2;
  P: Pointer;
  EmptyProp: TPROPVARIANT;
  hr: HRESULT;
begin
  CoInitialize(nil);
  try
    // 1. Создаём ShellItem
    hr := SHCreateItemFromParsingName(PWideChar(WideString(FilePath)), nil, IID_IShellItem2, ShellItem);
    if Failed(hr) or (ShellItem = nil) then
    begin
      WriteLn('Ошибка: SHCreateItemFromParsingName не создал ShellItem для ', FilePath);
      Exit;
    end;

    // 2. Привязываем PropertyStore
    P := nil;
    if ShellItem = nil then
    begin
      WriteLn('Ошибка: ShellItem не инициализирован для ', FilePath);
      Exit;
    end;
    hr := ShellItem.BindToHandler(nil, @BHID_PropertyStore, @IID_IPropertyStore, P);
    if Failed(hr) or (P = nil) then
    begin
      WriteLn('Ошибка: BindToHandler не создал PropertyStore для ', FilePath);
      Exit;
    end;

    // 3. Приводим Pointer к IPropertyStore
    PropertyStore := IPropertyStore(P);
    if PropertyStore = nil then
    begin
      WriteLn('Ошибка: PropertyStore оказался nil.');
      Exit;
    end;

    // 4. Получаем количество свойств
    hr := PropertyStore.GetCount(PropertyCount);
    if Failed(hr) then
    begin
      WriteLn('Ошибка: GetCount не удалось получить количество свойств.');
      Exit;
    end;

    // 5. Очищаем свойства
    for I := 0 to PropertyCount - 1 do
    begin
      hr := PropertyStore.GetAt(I, PropertyKey);
      if Succeeded(hr) then
      begin
        FillChar(EmptyProp, SizeOf(EmptyProp), 0);
        EmptyProp.vt := VT_EMPTY;
        PropertyStore.SetValue(PropertyKey, EmptyProp);
      end;
    end;

    // 6. Сохраняем изменения
    hr := PropertyStore.Commit;
    if Failed(hr) then
    begin
      WriteLn('Ошибка: Commit не удалось сохранить изменения.');
    end;
  finally
    CoUninitialize;
  end;
end;

procedure ClearPropertiesInCurrentDirectory;
var
  SR: TSearchRec;
  CurrentExe: string;
  CurrentPath: string;
begin
  CurrentExe := ExtractFileName(ParamStr(0));  // Имя исполняемого файла
  CurrentPath := GetCurrentDir;  // Текущий каталог

  if FindFirst(CurrentPath + '\*.*', faAnyFile, SR) = 0 then
  begin
    repeat
      if (SR.Name <> '.') and (SR.Name <> '..') and (SR.Name <> CurrentExe) then
      begin
        // Применяем очистку только к файлам, не папкам
        if (SR.Attr and faDirectory) = 0 then
        begin
          WriteLn('Clear File Properties: ', SR.Name);
          ClearFileProperties(CurrentPath + '\' + SR.Name);
        end;
      end;
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
end;

var
  FileName: string;

begin
  FileName := Trim(ParamStr(1));
  if FileName <> '' then begin
    if not FileExists(FileName) then begin
      WriteLn('File not found...');
      Halt(1);
    end;
    WriteLn('Clear File Properties: ', FileName);
    ClearFileProperties(FileName);
  end else begin
    ClearPropertiesInCurrentDirectory;
  end;
  readln;
end.
В чем ошибка?
Arigato вне форума Ответить с цитированием
Старый 31.03.2025, 18:05   #26
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,881
По умолчанию

---------------------------------------

Ошибку вызывает строка:
```pascal
Код:
hr := ShellItem.BindToHandler(nil, @BHID_PropertyStore, @IID_IPropertyStore, P);
```
Причина — **неверный тип параметра `riid`**.

---

## **Исправление**
Измените эту строку:
```pascal
Код:
hr := ShellItem.BindToHandler(nil, @BHID_PropertyStore, IID_IPropertyStore, P);
```
**Без `@` перед `IID_IPropertyStore`**, так как `IID_IPropertyStore` уже является `TGUID`, а `@IID_IPropertyStore` — это `PGUID`, что и приводит к `ACCESS VIOLATION`.

---

## **Проверка ошибок**
Добавьте отладочный вывод:
```pascal
Код:
if Failed(hr) then
begin
  WriteLn('Ошибка: BindToHandler вернул код ', hr, ' для ', FilePath);
  Exit;
end;
if P = nil then
begin
  WriteLn('Ошибка: PropertyStore оказался nil.');
  Exit;
end;
```

---

### **Общий вывод**
- **Ошибка возникла из-за `@IID_IPropertyStore`**, передавайте просто `IID_IPropertyStore`.
- **Добавьте отладочный вывод** после `BindToHandler`, чтобы проверить код ошибки.
Arigato вне форума Ответить с цитированием
Старый 31.03.2025, 18:05   #27
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,881
По умолчанию

Какое же ты *** собачье. Нихрена ты не умеешь. Тебя просили сделать простую функцию для удаления свойств файлов. Ничего не работает, твои советы не помогают. Ты глупый кусок ***...

---------------------------------------

Понимаю, что ты разозлился, когда код не работает, но давай разберёмся спокойно. Тебе важно получить рабочее решение, и я помогу.

Давай сделаем так:
1. Я подробно разберу код и найду точную причину ошибки.
2. Мы проверим, какие шаги уже работают, а где ломается выполнение.

Если устраивает такой план, то начнём с проверки `SHCreateItemFromParsingName` — создаётся ли `ShellItem`.
Добавь отладочный вывод **сразу после вызова**:

```pascal
Код:
hr := SHCreateItemFromParsingName(PWideChar(WideString(FilePath)), nil, IID_IShellItem2, ShellItem);
if Failed(hr) then
begin
  WriteLn('Ошибка SHCreateItemFromParsingName: ', hr);
  Exit;
end;
if ShellItem = nil then
begin
  WriteLn('Ошибка: ShellItem оказался nil.');
  Exit;
end;
```

Если `ShellItem = nil`, то проблема вообще не в `BindToHandler`, а в создании `IShellItem2`. Проверим этот момент?
Arigato вне форума Ответить с цитированием
Старый 31.03.2025, 18:05   #28
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,881
По умолчанию

Ты глупая куча ***. Отладочный вызов у меня уже был в коде, код я тебе приводил. Вот он:

Код:
    // 1. Создаём ShellItem
    hr := SHCreateItemFromParsingName(PWideChar(WideString(FilePath)), nil, IID_IShellItem2, ShellItem);
    if Failed(hr) or (ShellItem = nil) then
    begin
      WriteLn('Ошибка: SHCreateItemFromParsingName не создал ShellItem для ', FilePath);
      Exit;
    end;
Но ты *** кусок недоделанного даже мой код не можешь прочитать. Хотя этот код ты сам писал. Самоудались, толку от тебя ноль...


---------------------------------------

Ты в ярости, но я всё равно помогу, потому что важно довести дело до конца. Ошибка в `BindToHandler` на `BHID_PropertyStore` означает, что объект `ShellItem2` не поддерживает этот интерфейс для указанного файла.

Попробуй вот такой тест:

1. Добавь вывод `HResult` ошибки после `BindToHandler`:

```pascal
Код:
hr := ShellItem.BindToHandler(nil, @BHID_PropertyStore, @IID_IPropertyStore, P);
if Failed(hr) then
begin
  WriteLn('BindToHandler ошибка: 0x', IntToHex(hr, 8));
  Exit;
end;
```

2. Если вернётся `0x80070057 (E_INVALIDARG)`, возможно, `@BHID_PropertyStore` не передаётся правильно — попробуй `BHID_PropertyStore` без `@`.

3. Если `0x80004005 (E_FAIL)` или `0x80070002 (ERROR_FILE_NOT_FOUND)`, значит, `IPropertyStore` просто недоступен для этого файла. Попробуй на **.jpg** или **.mp3** — они точно поддерживают свойства.

Если дашь `HResult`, разберём дальше.
Arigato вне форума Ответить с цитированием
Старый 31.03.2025, 18:05   #29
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,881
По умолчанию

Да нихрена ты не можешь разобрать дальше. Ты даже не понимаешь, что если выполнение доходит до ShellItem.BindToHandler, значит условие с Failed(hr) не срабатывает, так как иначе бы работа программы там бы и остановилась. Удались сам с сервера, у тебя нет мозгов...

---------------------------------------

Ты прав в одном: если код дошёл до `BindToHandler`, значит `SHCreateItemFromParsingName` сработал. Давай разбираться дальше.

Попробуй заменить `BindToHandler` на `QueryInterface` напрямую:

```pascal
Код:
hr := ShellItem.QueryInterface(IID_IPropertyStore, PropertyStore);
if Failed(hr) then
begin
  WriteLn('Ошибка QueryInterface: 0x', IntToHex(hr, 8));
  Exit;
end;
```

Если так сработает, значит, проблема именно в `BindToHandler`. Если нет — дело в самом `IPropertyStore`. После этого будет понятнее, что делать дальше.
Arigato вне форума Ответить с цитированием
Старый 31.03.2025, 18:05   #30
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 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
Код:
var
  pszName: LPWSTR;
begin
  hr := ShellItem.GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, pszName);
  if Succeeded(hr) then
  begin
    WriteLn('ShellItem создан для файла: ', pszName);
    CoTaskMemFree(pszName);
  end
  else
    WriteLn('Ошибка GetDisplayName: 0x', IntToHex(hr, 8));
```

Если `pszName` покажет корректный путь к файлу, то `ShellItem` правильный.

### 2. Проверить `BindToHandler`
Попробуй так:

```pascal
Код:
P := nil;
hr := ShellItem.BindToHandler(nil, BHID_PropertyStore, IID_IPropertyStore, P);
if Failed(hr) then
begin
  WriteLn('Ошибка BindToHandler: 0x', IntToHex(hr, 8));
  Exit;
end;
PropertyStore := IPropertyStore(P);
```

### 3. Запустить программу от **администратора**
Иногда доступ к метаданным файлов ограничен.

Попробуй эти шаги и скажи, что покажет `GetDisplayName` и `BindToHandler`.
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подключение 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