从Delphi调用SHGetSetSettings

前端之家收集整理的这篇文章主要介绍了从Delphi调用SHGetSetSettings前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我刚读了 this questionthis 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.没有直接映射.

原文链接:https://www.f2er.com/delphi/102460.html

猜你在找的Delphi相关文章