c# - 如何从 C# 调用 SLGetWindowsInformation

标签 c# c++ types pinvoke type-conversion

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

函数名为 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,因此是释放此缓冲区的正确方法。

关于c# - 如何从 C# 调用 SLGetWindowsInformation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31180457/

相关文章:

c# - 在 CodeDOM 创建的泛型方法参数中使用泛型参数

c# - 内存屏障是否保证在 C# 中重新读取?

PostgreSQL 行到字符串

c# - 如何更改现有 TPL block 的 MaxDegreeOfParallelism?

c# - 比较 MySql 中的 EntityFrameworkCore 字符串列无法生成正确的 SQL

c++ - 如果 RAM 大小小于要求,则分配内存

c++ - 将 const char* 添加到 string_view

c++ - 如何在 C++ 中散列

c# - .net 中是否有所有基本引用类型的枚举?

javascript - 如何获取 dat.gui Controller 类型?