Je viens de lire this question et this question, et depuis, j'ai essayé d'appeler SHGetSetSettings
en Delphi. Ceci est une fonction de shell32.dll
, mais n'est pas définie dans ShlObj.pas
, nous devons donc écrire notre propre définition.Appeler SHGetSetSettings à partir de Delphi
Nous devons d'abord traduire la structure SHELLSTATE
. Maintenant, je n'ai qu'une expérience limitée en C, mais je suppose que ": 1" signifie que le membre de la structure est un seul bit, c'est-à-dire que huit d'entre eux peuvent être emballés ensemble dans un octet. Je suppose également que DWORD
= UINT
= entiers non signés de 32 bits et que LONG
= int
sont des entiers signés de 32 bits. Mais alors nous avons un problème: la structure entière occupera alors 228 bits, soit 28,5 octets, ce qui est plutôt impossible, du moins en Delphi, où sizeof(SomeRecord)
doit être un entier.
Néanmoins, j'ai essayé de le résoudre en ajoutant quatre bits fictifs à la fin. 232 bits = 29 octets, ce qui est bien.
D'où j'ai essayé
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;
puis je déclare (pour plus de commodité plus tard)
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;
Maintenant, je me sentais prêt à définir
interface
procedure SHGetSetSettings(var ShellState: TShellState; Mask: cardinal; DoSet: boolean); stdcall;
implementation
procedure SHGetSetSettings; external shell32 name 'SHGetSetSettings';
Mais avant d'essayer le code, J'ai remarqué quelque chose de très étrange. J'ai trouvé que les constantes que j'ai déclarées étaient déjà déclarées ici: SSF Constants. Notez que SSF_HIDEICONS = 0x00004000 = 16384 ≠ fHideIcons = 4096
. Si les constantes SSF_
sont vraiment des masques utilisés avec SHELLSTATE
, alors cela n'a aucun sens de définir SSF_HIDEICONS
comme 2^14 quand c'est le 13ème bit (et son masque devrait être 2^12) dans la structure. Il semble donc que les deux pages de référence MSDN se contredisent.
Quelqu'un pourrait-il clarifier tout cela?
Oui, bien sûr, ils n'ont pas * besoin * de cartographier les bits de la structure. Mais il semblait si raisonnable à l'époque! –
Mais qu'en est-il de l'autre problème: est-il possible pour une structure C de ne pas avoir un nombre entier d'octets comme sa taille? –
Non. En regardant la déclaration, les champs de bits sont spécifiés comme étant dans un BOOL, donc le type sous-jacent est int. Je fais la taille de cette structure 36 octets, en un coup d'oeil. Bien sûr, struct packing peut modifier la taille, mais puisque tout ici (int, UINT, long, DWORD) est de 4 octets sur un OS 32 bits, je pense que l'estimation est raisonnablement sûre. Bien sûr, certains juristes vont sauter ici et me prouver que je me trompe :-). Méfiez-vous si vous travaillez avec un compilateur 64 bits si ... cette valeur va changer. –