• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

c# IntPtr

互联网 diligentman 2周前 (04-09) 7次浏览

ccalldll2.cpp中:

int  retstruct(user* u,int x,int y)
{
    u->id += 10 + x;
    u->age += 10 + y;
    return 0;
}

在c#中:

[DllImport(“ccalldll2.dll”, EntryPoint = “retstruct”,CallingConvention=CallingConvention.Cdecl)]
        public static extern int retstruct(IntPtr ptrUser, int x, int y); //在引用中只引用了ccalldll2,而ccalldll2又用到了cSharpDLLforJNA,这样有问题吗
        [StructLayout(LayoutKind.Sequential)]
        struct user
        {
            public int id;
            public int age;
        };
        private void btnInptr_Click(object sender, EventArgs e)
        {
            user u = new user();
            u.id = 5;
            u.age = 7;
            //先要通过Marshal来分配内存空间,根据user的大小进行分配非托管空间大小
            int size = Marshal.SizeOf(u);//对于值类型,可以Sizeof(变量),对于引用类型则Sizeof(typeof(TYPE))
            IntPtr ptruser = Marshal.AllocHGlobal(size);//分配内存
            //将u的值copy到ptruser空间
            Marshal.StructureToPtr(u, ptruser, false);           
            int res = retstruct(ptruser, 5, 5);//调用DLL中函数 retstruct中将对ptruser指针所指的user中的id和age处理
            user u2 = (user)Marshal.PtrToStructure(ptruser, typeof(user));//将处理之后的ptruser再转换为user
            Console.WriteLine(u2.id + “:” + u2.age);
            Console.WriteLine(res+”:”+u.id+”:”+u.age);
            Marshal.FreeHGlobal(ptruser);
        }

显示结果:

20:22
0:5:7

展开阅读全文

c++

© 著作权归作者所有

举报

打赏

0


0 收藏

微信
QQ
微博

分享

作者的其它热门文章

Spring AOP拦截抽象类(父类)中方法失效问题
NPOI使用手册
ILA调试报错 The debug hub core was not detected 以及 Data read from hw_ila [hw_ila_1] is corrupted…
NDK字符串处理GetStringUTFChars


程序员灯塔
转载请注明原文链接:c# IntPtr
喜欢 (0)