如何从 C# 调用 SLGetWindowsInformation

how to pinvoke SLGetWindowsInformation from c#

我知道如何调用,但是这个函数中给出的数据结构给我带来的麻烦比我自己想出来的还要多

函数名称是 SLGetWindowsInformation 存在于 slc.dll

    HRESULT WINAPI SLGetWindowsInformation(
  _In_      PCWSTR     pwszValueName,
  _Out_opt_ SLDATATYPE *peDataType,
  _Out_     UINT       *pcbValue,
  _Out_     PBYTE      *ppbValue
);

完整参考 here

提前致谢,祝你有美好的一天

像这样:

enum SLDATATYPE 
{
    SL_DATA_NONE      = REG_NONE,
    SL_DATA_SZ        = REG_SZ,
    SL_DATA_DWORD     = REG_DWORD,
    SL_DATA_BINARY    = REG_BINARY,
    SL_DATA_MULTI_SZ  = REG_MULTI_SZ,
    SL_DATA_SUM       = 100
};
// you can look up the values of the REG_XXX constants from the windows header files    

[DllImport("Slc.dll", CharSet = CharSet.Unicode)]
static extern uint SLGetWindowsInformation(
    string ValueName,
    out SLDATATYPE DataType,
    out uint cbValue,
    out IntPtr Value
);

像这样调用函数:

SLDATATYPE DataType;
uint cbValue;
IntPtr ValuePtr;
uint res = SLGetWindowsInformation(ValueName, out DataType, out cbValue, out ValuePtr);
// check that res indicates success before proceeding
byte[] Value = new byte[cbValue];
Marshal.Copy(ValuePtr, Value, 0, Value.Length);
Marshal.FreeHGlobal(ValuePtr);

请注意,它可能看起来有点混乱,但 Marshal.FreeHGlobal 实际上调用 LocalFree,因此是释放此缓冲区的正确方法。