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

есть функция:
Код: 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
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
    #40132857
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hlopotun,

назначение наверное всётаки понятно, - очистить память по указателю. А вот как заменить её на CoTaskMemAlloc и CoTaskMemFree тут?
...
Рейтинг: 0 / 0
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
    #40132859
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
    #40132861
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
    #40132865
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
    #40132870
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotunИ компилится и утечек не оставляет.

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

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

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

спасибо, буду знать. А как в таких случаях проверить на утечки?
...
Рейтинг: 0 / 0
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
    #40132894
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 + вызов методов полученного менеджера памяти. Разницы при этом не будет никакой.
...
Рейтинг: 0 / 0
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
    #40132896
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
    #40132897
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
    #40132899
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
SHGetFolderPath тоже устарелая (deprecated) и надо пользоваться SHGetKnownFolderPath.
вот же ж п#дарасы!
...
Рейтинг: 0 / 0
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
    #40132950
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
s62
SHGetFolderPath тоже устарелая (deprecated) и надо пользоваться SHGetKnownFolderPath.
вот же ж п#дарасы!
+1. Задолбали депрекатить!
...
Рейтинг: 0 / 0
Shell32.dll и deprecated SHGetSpecialFolderLocation и SHGetMalloc
    #40132975
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bk0010,

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

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


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


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

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


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