Я только что прочитал этот вопрос и этот вопрос , и с тех пор я пытаюсь вызвать SHGetSetSettings
в Delphi.Это функция shell32.dll
, но она не определена в ShlObj.pas
, поэтому нам нужно написать собственное определение.
Сначала нам нужно перевести структуру SHELLSTATE
.Сейчас у меня ограниченный опыт работы с Си, но я предполагаю, что «: 1» означает, что элемент структуры является одним битом, то есть восемь из них могут быть упакованы вместе в байт.Я также предполагаю, что DWORD
= UINT
= 32-разрядные целые числа без знака и что LONG
= int
являются 32-разрядными целыми числами со знаком.Но тогда возникает проблема: вся структура будет тогда занимать 228 бит, или 28,5 байта, что ... довольно невозможно, по крайней мере, в Delphi, где sizeof(SomeRecord)
должно быть целым числом.
Тем не менееЯ попытался решить это, добавив четыре фиктивных бита в конце.232 бита = 29 байт, что приятно.
Поэтому я попытался
PShellState = ^TShellState;
TShellState = packed record
Data1: cardinal;
Data2: cardinal;
Data3: cardinal;
Data4: cardinal;
Data5: cardinal;
Data6: cardinal;
Data7: cardinal;
Data8: byte; // Actually a nibble would be sufficient
end;
, а затем объявил (для удобства позже)
const
fShowAllObjects = 1;
fShowExtensions = 2;
fNoConfirmRecycle = 4;
fShowSysFiles = 8;
fShowCompColor = 16;
fDoubleClickInWebView = 32;
fDesktopHTML = 64;
fWin95Classic = 128;
fDontPrettyPath = 256;
fShowAttribCol = 512;
fMapNetDrvButton = 1024;
fShowInfoTip = 2048;
fHideIcons = 4096;
fWebView = 8192;
fFilter = 16384;
fShowSuperHidden = 32768;
fNoNetCrawling = 65536;
Теперь я чувствовал себя готовопределить
interface
procedure SHGetSetSettings(var ShellState: TShellState; Mask: cardinal; DoSet: boolean); stdcall;
implementation
procedure SHGetSetSettings; external shell32 name 'SHGetSetSettings';
Но прежде чем я попробовал код, я заметил кое-что очень странное.Я обнаружил, что объявленные мной константы уже были объявлены здесь: Константы SSF .Обратите внимание, что SSF_HIDEICONS = 0x00004000 = 16384 ≠ fHideIcons = 4096
.Если константы SSF_
действительно являются масками, используемыми вместе с SHELLSTATE
, то нет смысла определять SSF_HIDEICONS
как 2 ^ 14, когда это 13-й бит (и его маска должна быть 2 ^ 12) в структуре.Следовательно, кажется, что две справочные страницы MSDN противоречат друг другу.
Может ли кто-нибудь внести некоторую ясность во все это?