我刚读了
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定义为2 ^ 14是没有意义的当它是结构中的第13位(并且其掩模应该是2 ^ 12)时.因此,似乎两个MSDN参考页面相互矛盾.
有人可以为这一切带来一些清晰度吗?
解决方法
我在这里阅读的帮助是在检索数据时为掩码指定了SSF_常量.他们没有理由必须映射到ShellState结构中的位.
如果他们确实fShowSysFiles会映射到8(0x04),我们从帮助中知道SSF_SHOWSYSFILES是0x20.没有直接映射.