C# 如何通过使用StringBuilder声明的P/Invoke传递nullptr?
考虑这样一个典型的p/Invoke声明:C# 如何通过使用StringBuilder声明的P/Invoke传递nullptr?,c#,winapi,pinvoke,C#,Winapi,Pinvoke,考虑这样一个典型的p/Invoke声明: [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool LookupAccountName( string SystemName, string accountName, IntPtr pSid, ref uint cbSid
[DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool LookupAccountName(
string SystemName,
string accountName,
IntPtr pSid,
ref uint cbSid,
[MarshalAs(UnmanagedType.LPWStr)] StringBuilder ReferencedDomainName,
ref uint ReferencedDomainNameCount,
out SID_NAME_USE SIDUse);
表示如果客户愿意,pSid
和ReferenceDomainName
可以是nullptr
。为pSid
传递nullptr
很容易;只需通过IntPtr.Zero
。但是对于StringBuilder
,应该传递什么呢
我不想传递一个空的
StringBuilder
,因为我不想让这个调用失败,因为错误\u缓冲区不足您可以传递这个参数的null
;它将被封送为空指针。@pm100:这将失败,因为IntPtr
无法转换为StringBuilder
。然后声明第二个导入,该导入将接受inptrplace@pm100我不能那样做。(其他代码目前使用此调用,我不想在任何地方都进行修复)其他答案很好。但仅供参考,您可以为同一个函数创建第二个dllimport,但名称不同,这样您就可以修改参数定义(EntryPoint=xxx)@pm100:这似乎是一次大规模的黑客攻击:)