【发布时间】:2010-08-14 19:45:15
【问题描述】:
我刚刚阅读了this question 和this question,从那时起我一直尝试在Delphi 中调用SHGetSetSettings。这是shell32.dll的一个函数,但是ShlObj.pas中没有定义,所以我们需要自己写定义。
首先我们需要翻译SHELLSTATE 结构。现在我对C的经验有限,但我认为“: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 Constants。请注意SSF_HIDEICONS = 0x00004000 = 16384 ≠ fHideIcons = 4096。如果SSF_ 常量确实是与SHELLSTATE 一起使用的掩码,那么当SSF_HIDEICONS 是结构中的第13 位(并且它的掩码应该是2^12)时,将其定义为2^14 是没有意义的。因此,这两个 MSDN 参考页面似乎相互矛盾。
有人可以澄清一下这一切吗?
【问题讨论】:
标签: c delphi winapi translation msdn