【发布时间】:2016-05-18 01:35:55
【问题描述】:
有人可以帮我为 SHELLSTATE 结构编写正确的定义(在 C# 或 VB.NET 中)吗?
我自己的定义不能正常工作,有些成员不能按预期工作,例如fShowAllObjects工作正常,但fShowExtensions不行,我不能将字段设置为True,所以我认为是因为字段包装错误。
我不确定是否应该指定 StructLayoutAttribute.Pack 属性,或者我需要指定 LayoutKind.Explicit 然后为每个字段指定正确的字段偏移量,或者使用 @ 将 Boolean 字段编组为 1 字节987654331@,这些都是我尝试过但没有成功的事情,我需要帮助才能正确完成。
C#:
[StructLayout(LayoutKind.Sequential)]
public struct ShellState
{
public bool ShowAllObjects;
public bool ShowExtensions;
public bool NoConfirmRecycle;
public bool ShowSysFiles;
public bool ShowCompColor;
public bool DoubleClickInWebView;
public bool DesktopHtml;
public bool Win95Classic;
public bool DontPrettyPath;
public bool Unused1;
public bool MapNetDrvBtn;
public bool ShowInfoTip;
public bool HideIcons;
public bool WebView;
public bool Unused2;
public bool ShowSuperHidden;
public bool NoNetCrawling;
public int Unused3;
public uint Unused4;
public long ParamSort;
public int SortDirection;
public uint Unused5;
public uint Unused6;
public bool SepProcess;
public bool WinXpStartPanelOn;
public bool Unused7;
public bool AutoCheckSelect;
public bool IconsOnly;
public bool ShowTypeOverlay;
public bool ShowStatusBar;
public uint Unused8;
}
VB.NET:
<StructLayout(LayoutKind.Sequential)>
Public Structure ShellState
Public ShowAllObjects As Boolean
Public ShowExtensions As Boolean
Public NoConfirmRecycle As Boolean
Public ShowSysFiles As Boolean
Public ShowCompColor As Boolean
Public DoubleClickInWebView As Boolean
Public DesktopHtml As Boolean
Public Win95Classic As Boolean
Public DontPrettyPath As Boolean
Public Unused1 As Boolean
Public MapNetDrvBtn As Boolean
Public ShowInfoTip As Boolean
Public HideIcons As Boolean
Public WebView As Boolean
Public Unused2 As Boolean
Public ShowSuperHidden As Boolean
Public NoNetCrawling As Boolean
Public Unused3 As Integer
Public Unused4 As UInteger
Public ParamSort As Long
Public SortDirection As Integer
Public Unused5 As UInteger
Public Unused6 As UInteger
Public SepProcess As Boolean
Public WinXpStartPanelOn As Boolean
Public Unused7 As Boolean
Public AutoCheckSelect As Boolean
Public IconsOnly As Boolean
Public ShowTypeOverlay As Boolean
Public ShowStatusBar As Boolean
Public Unused8 As UInteger
End Structure
我还将提供 SHGetSetSettings 函数以进一步测试生成的结构修改:
<DllImport("Shell32.dll", SetLastError:=False)>
Public Shared Sub SHGetSetSettings(<[In]> <Out> ByRef refState As ShellState,
<MarshalAs(UnmanagedType.U4)> ByVal mask As ShellStateFlags,
<MarshalAs(UnmanagedType.Bool)> ByVal applyState As Boolean)
End Sub
还有 SSF 枚举:
<Flags>
Public Enum ShellStateFlags As UInteger
ShowAllObjects = &H1
ShowFilenameExtensions = &H2
ShowCompressedColor = &H8
SortColumns = &H10
ShowSystemFiles = &H20
DoubleClickInWebView = &H80
DesktopHtml = &H200
Win95Classic = &H400
DontPrettyPath = &H800
MapNetDrvBtn = &H1000
ShowInfoTip = &H2000
HideIcons = &H4000
NoConfirmRecycle = &H8000
WebView = &H20000
ShowSuperHiddenFiles = &H40000
ExplorerSeparateProcess = &H80000
NoNetCrawling = &H100000
AutoChecboxkSelection = &H800000
ShowIconsOnly = &H1000000
ShowTypeOverlay = &H2000000
ShowStatusBar = &H4000000
End Enum
【问题讨论】:
-
我认为你的问题是那些布尔值是位域。看起来您必须实现一些包装器属性来旋转基础字段的位。见social.msdn.microsoft.com/Forums/en-US/…
-
哇!这将比我第一眼想象的要难。感谢您的评论。
-
@David Heffernan 如果我记得很好,你向我解释了很多关于字段偏移(和联合)的事情,因为其他烦人且真正更大的结构,你还向我解释了如何确定字段大小VC++(或者也许我自己做了那件事,我不记得了)但我找不到你的 cmets 的问题(我真可怜,我自己的问题......我什至不记得结构名称) ,如果您阅读了本文并且如果您记得那个问题,请提及 url!,请确保我很欣赏您所说的“首先在 C++ 中尝试比较偏移量”。
-
嗯,这很讨厌。所有这些位域。不要忘记 c++ long 是 32 位的。 C# long 是 64 位。
标签: c# .net vb.net winapi pinvoke