RegSetValueEx
has the following P/Invoke signature:
[DllImport("advapi32.dll", SetLastError = true)]
static extern uint RegSetValueEx(
UIntPtr hKey,
[MarshalAs(UnmanagedType.LPStr)]
string lpValueName,
int Reserved,
RegistryValueKind dwType,
IntPtr lpData,
int cbData);
The IntPtr
lpData parameter can be a pain to work with. To pass a string value, I need to call one of the Marshall.StringToHGlobal
functions and then release it when I'm done. My code can be simpler if I change the type of the lpData
parameter to [MarshalAs(UnmanagedType.LPStr)]String lpData
. This seems to work and I can imagine that behind the scenes the marshalling code is doing exactly what I would do to get an IntPtr
. I haven't been able to find any definitive statements if this is legal or not. Can anyone provide one?
[Yes, I know there is managed code to interface with the registry. In my particular case I can't use it, and even if I could I would still be interested in the answer in general]