看看这个 [StructLayout(LayoutKind.Explicit)] public struct Rect { [FieldOffset(0)] public int left; [FieldOffset(4)] public int top; [FieldOffset(8)] public int right; [FieldOffset(12)] public int bottom; } [DllImport("User32.dll")] public static extern void ClipCursor(ref Rect rect); 结构中如果包含c语言的数组,也有办法,不过我忘了,找到了再告诉你
System.ValueType
System.IntPtr[Visual Basic]
<Serializable>
Public Structure IntPtr
Implements ISerializable[C#]
[Serializable]
public struct IntPtr : ISerializable[C++]
[Serializable]
public __value struct IntPtr : public ISerializable[JScript] 在 JScript 中,可以使用 .NET Framework 中的结构,但不能定义自己的结构。线程安全
此类型对多线程操作是安全的。备注
IntPtr 类型被设计成整数,其大小适用于特定平台。即是说,此类型的实例在 32 位硬件和操作系统中将是 32 位,在 64 位硬件和操作系统上将是 64 位。IntPtr 类型可以由支持指针的语言使用,并可作为在支持与不支持指针的语言间引用数据的一种通用方式。IntPtr 对象也可用于保持句柄。例如,IntPtr 的实例广泛地用在 System.IO.FileStream 类中来保持文件句柄。IntPtr 类型符合 CLS,而 UIntPtr 类型却不符合。只有 IntPtr 类型可用在公共语言运行库中。UIntPtr 类型大多数是提供来维护与 IntPtr 类型之间的体系结构上的对称性。
如果只是字符串的指针可以直接用ref,out就可以了!
主要是你调用的dll文件的函数决定的!
我如何得到返回的type结构的值。
FieldOffsetAttribute
StructLayoutAttribute
ArrayWithOffset
等东西
别人原来告诉过我
可是我....忘了
[StructLayout(LayoutKind.Explicit)]
public struct Rect
{
[FieldOffset(0)] public int left;
[FieldOffset(4)] public int top;
[FieldOffset(8)] public int right;
[FieldOffset(12)] public int bottom;
}
[DllImport("User32.dll")]
public static extern void ClipCursor(ref Rect rect);
结构中如果包含c语言的数组,也有办法,不过我忘了,找到了再告诉你
结构体中有数组的字段也一样,只是字符数组的处理方式不太一样,要加这个属性:
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] // 大小自定
string somename,
...
[DllImport("TcpUdpPort.dll",EntryPoint="GetPortInfo")]
public extern static void GetPortInfo(IntPtr outBuf, out int portNumber);函数原型:
void GetPortInfo(PortStruct *Portbuf,int *PortNumber)调用:void GetAllPortInfo(ref ArrayList portList)
{
IntPtr portInfor = (IntPtr)Marshal.AllocHGlobal(Marshal.SizeOf(typeof(PortStruct)) * 512);
int PortCount = 0;
GetPortInfo(portInfor, out PortCount);
if(PortCount>0)
{
PortStruct[] Ports = new PortStruct[PortCount];
IntPtr current = portInfor;
for (int i=0; i<PortCount; i++)
{
Ports[i] = (PortStruct)Marshal.PtrToStructure(current,typeof(PortStruct));
current=(IntPtr)((int)current+Marshal.SizeOf(typeof(PortStruct)));
portList.Add(Ports[i]);
}
}
Marshal.FreeHGlobal(portInfor);
}