Marshal的问题
直接上代码
public struct Point
{
public Int32 x, y;
}
class Program
{
static void Main(string[] args)
{
Point point = new Point();
point.x = 2;
point.y = 3;
Console.WriteLine("Point.x=" + point.x);
Console.WriteLine("Point.y=" + point.y);
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(point));
Marshal.StructureToPtr(point, ptr, true);
Console.WriteLine("IntPtr:" + ptr.ToString());
IntPtr ptr2 = new IntPtr(ptr.ToInt32());
Point point2 = new Point();
point2 = (Point)Marshal.PtrToStructure(ptr2, typeof(Point));
Console.WriteLine("Point.x=" + point2.x);
Console.WriteLine("Point.y=" + point2.y);
Console.ReadKey();
}
}
在同一个程序里面是可以直接通过 IntPtr的值直接读取出Point的值的
怎么样其它的程序里面读取出Point的值
我新建了一个解决方案,来读取Point的值有时候报错,有时候读出来的数据是错误的
读取的代码
--------------------编程问答-------------------- 在线等 急!!! --------------------编程问答-------------------- 两个进程的地址空间是隔离的,第二个程序根本看不到第一个程序的内存数据,你把第一个程序的句柄填到第二程序中有什么用? --------------------编程问答-------------------- 楼主,看了你的代码,只有一个感觉:没事找事!
IntPtr ptr2 = new IntPtr("这里是ptr的Int值");
Point point2 = new Point();
point2 = (Point)Marshal.PtrToStructure(ptr2, typeof(Point));
你知道Marshal类用来做什么的吗?
仔细看看MSDN说明:
提供了一个方法集,这些方法用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法。
Marshal 类中定义的 static 方法对于处理非托管代码至关重要。此类中定义的大多数方法通常由需要在托管和非托管编程模型之间提供桥梁的开发人员使用。
归根到底:Marshal类是用来与非托管代码打交道的!比如VB、VC、Delphi写的dll。
你写的代码纯粹是托管代码,干嘛用StructureToPtr、PtrToStructure倒来倒去,干什么啊!
是不是在做练习?如果是,那你的方向错误,要拿个非托管的dll来练手! --------------------编程问答--------------------
我这里是做的测试 内存里面的数据是Delphi写的DLL写进去的
我得到的只是一个INT值 然后根据这个INT值把内存里面的数据读出来 --------------------编程问答-------------------- Delphi写的DLL写到内存里面的
怎么样通过C#读取里面的数据呢? --------------------编程问答-------------------- 用pinvoke直接调用dll中的函数 --------------------编程问答--------------------
你把Delphi的dll中要使用的结构体和函数贴出来。。。。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
+++
补充:.NET技术 , C#