【发布时间】:2009-09-17 01:43:09
【问题描述】:
我正在尝试 PInvoke CreateDesktop 以传递标志以由子进程继承桌面的方式。声明如下:
[DllImport("user32", EntryPoint = "CreateDesktopW", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern IntPtr CreateDesktop(string lpszDesktop, IntPtr lpszDevice, IntPtr pDevmode, int dwFlags,
int dwDesiredAccess, [MarshalAs(UnmanagedType.LPStruct)] SECURITY_ATTRIBUTES lpsa);
[StructLayout(LayoutKind.Sequential)]
public struct SECURITY_ATTRIBUTES
{
public int nLength;
public IntPtr lpSecurityDescriptor;
public int bInheritHandle;
}
我使用它如下:
Win32.SECURITY_ATTRIBUTES sa = new Win32.SECURITY_ATTRIBUTES();
sa.nLength = Marshal.SizeOf(sa);
sa.bInheritHandle = 1;
testDesktopHandle = Win32.CreateDesktop(name, IntPtr.Zero, IntPtr.Zero, 0, Win32.GENERIC_ALL, sa);
不幸的是它不起作用,我收到以下错误:
System.Runtime.InteropServices.MarshalDirectiveException: Cannot marshal 'parameter #6': Invalid managed/unmanaged type combination (this value type must be paired with Struct).
任何想法我做错了什么?
【问题讨论】:
-
这类问题总是值得检查pinvoke.net。
-
除非你在这里的原因是因为你使用从 pinvoke.net 获得的声明而得到了这个例外...... (举手)
-
@IanRingrose pinvoke.net
CreateDesktop函数的声明仍然存在问题。仅当使用类声明SECURITY_ATTRIBUTES并将null作为其值传递时,它才有效。