我有以下功能:
public static extern uint FILES_GetMemoryMapping(
[MarshalAs(UnmanagedType.LPStr)] string pPathFile,
out ushort Size,
[MarshalAs(UnmanagedType.LPStr)] string MapName,
out ushort PacketSize,
ref Mapping oMapping,
out byte PagesPerSector);
Run Code Online (Sandbox Code Playgroud)
我想这样称呼:
FILES_GetMemoryMapping(MapFile, out size, MapName,
out PacketSize, null, out PagePerSector);
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法传递null一个需要类型的字段ref Mapping而且没有投射我已经尝试修复此问题.
有什么建议?
我想在一个带有参数IntPtr.Zero的函数中使用默认参数值IntPtr.这是不可能的,因为IntPtr.Zero它不是编译时常量.
有什么方法可以做我想做的事吗?
我有几个p /被调用的函数(但我现在正在重写我的代码所以我正在整理)我想知道如何使用/传递一个可空类型作为参数之一.使用int类型不是问题,但给出以下内容:
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, int? enumerator, IntPtr hwndParent, uint Flags);
Run Code Online (Sandbox Code Playgroud)
我希望能够将Guid参数作为可空类型传递.就目前而言,我可以将其称为:
SetupDiGetClassDevs(ref tGuid, null, IntPtr.Zero, (uint)SetupDiFlags.DIGCF_PRESENT );
Run Code Online (Sandbox Code Playgroud)
但我需要第一个参数也可以通过null.
我正在查看RegisterHotKey函数:
http://msdn.microsoft.com/en-us/library/ms646309(VS.85).aspx
BOOL RegisterHotKey(
__in HWND hWnd,
__in int id,
__in UINT fsModifiers,
__in UINT vk
);
Run Code Online (Sandbox Code Playgroud)
我一直在使用IntPtr传递第一个参数,在大多数情况下都能正常工作.但是现在我需要故意传递一个空指针作为第一个参数,IntPtr(故意)不会这样做.我是.Net的新手,这让我感到困惑.我怎样才能做到这一点?
诸如CreateProcess之类的函数具有指向结构的指针.在CI中,它只是NULL作为可选参数的指针传递,而不是在堆栈上创建虚拟结构对象并将指针传递给虚拟对象.
在C#中,我已将其声明为(p/invoke)
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool CreateProcess(
string lpApplicationName,
string lpCommandLine,
ref SECURITY_ATTRIBUTES lpProcessAttributes,
ref SECURITY_ATTRIBUTES lpThreadAttributes,
bool bInheritHandles,
CreateProcessFlags dwProcessCreationFlags,
IntPtr lpEnvironment,
string lpCurrentDirectory,
ref STARTUPINFO lpStartupInfo,
ref PROCESS_INFORMATION lpProcessInformation);
Run Code Online (Sandbox Code Playgroud)
但是,如果我试图通过null对lpProcessAttributes论点或lpThreadAttributes论据,我得到一个编译错误:
错误2参数3:无法从"<null>"转换为"ref Debugging.Wrappers.SECURITY_ATTRIBUTES"
如何修改上面的函数签名,以便我可以传递nullSECURITY_ATTRIBUTES参数,而不会出现此编译器错误?(如果我愿意,还能传递一个真正的结构?)
我想打电话给LsaOpenPolicy,它需要一个LSA_OBJECT_ATTRIBUTES结构。我正在使用来自pinvoke.net的结构定义。该结构具有领域public LSA_UNICODE_STRING ObjectName;。
该LSA_OBJECT_ATTRIBUTESMSDN文章说:
当您调用时
LsaOpenPolicy,将此函数的成员初始化为NULL或零,因为该函数不使用该信息。
特别是:
对象名
应该为NULL。
虽然我可以将LSA_OBJECT_ATTRIBUTESstruct 的其他字段分配给IntPtr.Zero(或仅将其分配给0值类型),但看不到的方法ObjectName。特别,
无法将类型'System.IntPtr'隐式转换为'LSA_UNICODE_STRING'
在这种情况下我该怎么办?我应该初始化LSA_UNICODE_STRING长度为零(长度0,最大长度0,空/空缓冲区)的a吗?我应该更改LSA_OBJECT_ATTRIBUTES定义以便该字段为IntPtr吗?我应该使它为可空值并分配null给该字段吗?
我对内存管理的经验很少,因此对于可能导致内存泄漏的任何事情我都非常警惕。