像这样:
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,因此释放此缓冲区的正确方法是。