Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc / 17 сообщений из 17, страница 1 из 1
09.02.2022, 16:23
    #40132854
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
Всем доброго дня,

есть функция:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  function GetDefaultDirAlt: string;
  var
    Allocator: IMalloc;
    PDirList: PItemIdList;
    MyDir: array [0..MAX_PATH] of Char;

  begin
    Result := 'C:\';
    if SHGetMalloc (Allocator) = NOERROR then begin
      SHGetSpecialFolderLocation (0, CSIDL_PERSONAL, PDirList);
      SHGetPathFromIDList (PDirList, @MyDir [0]);
      Allocator.Free (PDirList);
      Result := string (MyDir);
      end;
  end;


содержащая устаревшие и уже исключённые из shell32.dll функции SHGetSpecialFolderLocation и SHGetMalloc.
SHGetSpecialFolderLocation заменил так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  function GetDefaultDirNew: string;
  var
    Allocator: IMalloc;
    PDirList: PItemIdList;
    MyDir: array [0..MAX_PATH] of Char;

  begin
    Result := 'C:\';
    if SHGetMalloc (Allocator) = NOERROR then begin
      SHGetFolderLocation (0, CSIDL_PERSONAL, 0, 0, PDirList);
      SHGetPathFromIDList (PDirList, @MyDir [0]);
      Allocator.Free (PDirList);
      Result := string (MyDir);
      end;
  end;



несовсем пойму смысл SHGetMalloc в этой функции.
Для чего она тут?
Заменить её можно через CoTaskMemAlloc и CoTaskMemFree.
Но хотелось бы разобраться зачем она тут вообще.

Спасибо
...
Рейтинг: 0 / 0
09.02.2022, 16:36
    #40132857
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
hlopotun,

назначение наверное всётаки понятно, - очистить память по указателю. А вот как заменить её на CoTaskMemAlloc и CoTaskMemFree тут?
...
Рейтинг: 0 / 0
09.02.2022, 16:38
    #40132859
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
hlopotun,

возможно так?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  function GetDefaultDirNew: string;
  var
    PDirList: PItemIdList;
    MyDir: array [0..MAX_PATH] of Char;

  begin
    Result := 'C:\';
    SHGetFolderLocation (0, CSIDL_PERSONAL, 0, 0, PDirList);
    SHGetPathFromIDList (PDirList, @MyDir [0]);

    CoTaskMemFree (PDirList);

    Result := string (MyDir);
  end;


...
Рейтинг: 0 / 0
09.02.2022, 16:44
    #40132861
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
hlopotunНо хотелось бы разобраться зачем она тут вообще.

Обычно для "разбирания читают документацию.

https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetspecialfolderlocation A PIDL specifying the folder's location relative to the root of the namespace
(the desktop). It is the responsibility of the calling application to free the
returned IDList by using CoTaskMemFree.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.02.2022, 16:53
    #40132865
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
Dimitry Sibiryakov,

да, спасибо. Тут я был но эту строчку просмотрел:
A PIDL specifying the folder's location relative to the root of the namespace (the desktop). It is the responsibility of the calling application to free the returned IDList by using CoTaskMemFree.

Но заменил походу правилько. И компилится и утечек не оставляет.
...
Рейтинг: 0 / 0
09.02.2022, 17:13
    #40132870
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
hlopotunИ компилится и утечек не оставляет.

Чисто держу в курсе: FastMM и ему подобные не в состоянии отследить утечку
памяти, выделенной не с их помощью.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.02.2022, 17:44
    #40132881
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
Dimitry Sibiryakov

hlopotunИ компилится и утечек не оставляет.

Чисто держу в курсе: FastMM и ему подобные не в состоянии отследить утечку
памяти, выделенной не с их помощью.

спасибо, буду знать. А как в таких случаях проверить на утечки?
...
Рейтинг: 0 / 0
09.02.2022, 18:26
    #40132894
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
hlopotun
несовсем пойму смысл SHGetMalloc в этой функции.
Для чего она тут?
Заменить её можно через CoTaskMemAlloc и CoTaskMemFree.
Но хотелось бы разобраться зачем она тут вообще.

Да всё просто: ты раскопал говно мамонта времён Windows 95.

В Windows 95 была функция SHGetMalloc, которая возвращала менеджер памяти по умолчанию. Именно так и работает код: получает менеджер памяти, а потом вызывает уже его функции.

В Windows 2000 решили, что это дело можно упростить, и ввели функции-обёртки CoTaskMemAlloc и CoTaskMemFree, которые просто вызывают соответствующую функцию у менеджера памяти по умолчанию. Ну т.е. на псевдокоде:
Код: pascal
1.
2.
3.
4.
5.
procedure CoTaskMemFree(APtr: Pointer);
begin
  SHGetMalloc(Allocator);
  Allocator.Free(APtr);
end;



Таким образом, начиная с Windows 2000 можно вызывать CoTaskMemAlloc и/или CoTaskMemFree и это будет эквивалентно SHGetMalloc + вызов методов полученного менеджера памяти. Разницы при этом не будет никакой.
...
Рейтинг: 0 / 0
09.02.2022, 18:31
    #40132896
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
hlopotun,
есть более простой способ получить путь к какой-нибудь стандартной папке. Правда написано , что SHGetFolderPath тоже устарелая (deprecated) и надо пользоваться SHGetKnownFolderPath. Но последняя примерно так же вызывается.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
uses Winapi.SHFolder;
...
function GetSpecialFolderPath(aCSIDL: integer): string;
var Buf: array [0..MAX_PATH] of Char;
begin
  ShGetFolderPath(0, aCSIDL, 0, 0, Buf);
  Result := Buf;
end;
...
Рейтинг: 0 / 0
09.02.2022, 18:35
    #40132897
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
GunSmoker
hlopotun
несовсем пойму смысл SHGetMalloc в этой функции.
Для чего она тут?
Заменить её можно через CoTaskMemAlloc и CoTaskMemFree.
Но хотелось бы разобраться зачем она тут вообще.

Да всё просто: ты раскопал говно мамонта времён Windows 95.

В Windows 95 была функция SHGetMalloc, которая возвращала менеджер памяти по умолчанию. Именно так и работает код: получает менеджер памяти, а потом вызывает уже его функции.

В Windows 2000 решили, что это дело можно упростить, и ввели функции-обёртки CoTaskMemAlloc и CoTaskMemFree, которые просто вызывают соответствующую функцию у менеджера памяти по умолчанию. Ну т.е. на псевдокоде:
Код: pascal
1.
2.
3.
4.
5.
procedure CoTaskMemFree(APtr: Pointer);
begin
  SHGetMalloc(Allocator);
  Allocator.Free(APtr);
end;



Таким образом, начиная с Windows 2000 можно вызывать CoTaskMemAlloc и/или CoTaskMemFree и это будет эквивалентно SHGetMalloc + вызов методов полученного менеджера памяти. Разницы при этом не будет никакой.


да, это понятно. Оказалось что на машинах клиентов некоторые версии shell32.dll перестали экспортировать SHGetMalloc и лезли ошибки при попытке их вызвать, потому и озаботились их заменой на вышеуказанные. При замене хотелоь только удостовериться что не возникло утечек. Но я так понимаю проверить тут на утечки по простому не получится.
...
Рейтинг: 0 / 0
09.02.2022, 18:42
    #40132899
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
s62
SHGetFolderPath тоже устарелая (deprecated) и надо пользоваться SHGetKnownFolderPath.
вот же ж п#дарасы!
...
Рейтинг: 0 / 0
09.02.2022, 21:18
    #40132950
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
Мимопроходящий
s62
SHGetFolderPath тоже устарелая (deprecated) и надо пользоваться SHGetKnownFolderPath.
вот же ж п#дарасы!
+1. Задолбали депрекатить!
...
Рейтинг: 0 / 0
10.02.2022, 00:20
    #40132975
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
bk0010,

Deprecated - не значит, что оно не работает. Куча функций АПИ завернуто на новые рельсы.
...
Рейтинг: 0 / 0
10.02.2022, 00:24
    #40132976
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
bk0010
Мимопроходящий
пропущено...
вот же ж п#дарасы!
+1. Задолбали депрекатить!

Козлы, ага.
YouTube Video
...
Рейтинг: 0 / 0
10.02.2022, 07:25
    #40133006
Aniskin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
hlopotun
Оказалось что на машинах клиентов некоторые версии shell32.dll перестали экспортировать SHGetMalloc
Подскажи, а в каких конкретно виндах SHGetMalloc исчезла из экспорта shell32.dll? Я смотрю Windows 10 - на месте. Смотрю Windows 11 - тоже на месте. Или твои клиенты используют Windows 15?
...
Рейтинг: 0 / 0
10.02.2022, 10:32
    #40133037
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
Aniskin
hlopotun
Оказалось что на машинах клиентов некоторые версии shell32.dll перестали экспортировать SHGetMalloc
Подскажи, а в каких конкретно виндах SHGetMalloc исчезла из экспорта shell32.dll? Я смотрю Windows 10 - на месте. Смотрю Windows 11 - тоже на месте. Или твои клиенты используют Windows 15?


на клиентскох машинах открывали PE Viewer и смотрели список экспортируемых а в программах список импортируемых функций. Так и выявили что импортируются несушествующие в экспорте (по крайней мере из shell32.dll) функции. Можно конечно попробовать восстановить картинку с версиями итп но какой смысл? Надо было просто заменить deprecated и удалённые функции на новые. Сейчас посадили практиканта для проверки остальных модулей на подобные проблемы. Поскольку продукту более 25 лет с кучей модулей, функций таких должно быть немало. У меня нет сейчас под руками конкретно в какой винде и версии библиотек проблема выявлена, возможно в кокойто серверной. По сути это неважно. Проверил сейчас на своей машине, везде есть. Возможно проблема была в каком то промежуточном обновлении, потом вспохватились и поправили. х.з. но то что deprecated надо убирать это факт.
...
Рейтинг: 0 / 0
10.02.2022, 16:47
    #40133256
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
hlopotun
Aniskin
пропущено...
Подскажи, а в каких конкретно виндах SHGetMalloc исчезла из экспорта shell32.dll? Я смотрю Windows 10 - на месте. Смотрю Windows 11 - тоже на месте. Или твои клиенты используют Windows 15?


на клиентскох машинах открывали PE Viewer и смотрели список экспортируемых а в программах список импортируемых функций. Так и выявили что импортируются несушествующие в экспорте (по крайней мере из shell32.dll) функции. Можно конечно попробовать восстановить картинку с версиями итп но какой смысл? Надо было просто заменить deprecated и удалённые функции на новые. Сейчас посадили практиканта для проверки остальных модулей на подобные проблемы. Поскольку продукту более 25 лет с кучей модулей, функций таких должно быть немало. У меня нет сейчас под руками конкретно в какой винде и версии библиотек проблема выявлена, возможно в кокойто серверной. По сути это неважно. Проверил сейчас на своей машине, везде есть. Возможно проблема была в каком то промежуточном обновлении, потом вспохватились и поправили. х.з. но то что deprecated надо убирать это факт.

Вот пиздаболище-то.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]