qq_14987897
2017-11-08 07:55
采纳率: 50%
浏览 1.4k

C++中的带有指针数组的结构体在C#上怎么封装,并作为形参传给C++dll的函数

#pragma pack(1)
struct SqJpegScliceSize
{
unsigned int scliceSize[64];

unsigned char *jpegDst[64];
};
extern "C" _declspec(dllexport) void SqGetSliceData(SqJpegScliceSize *jss)
这是C++函数和结构体
在C#上怎么写?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

6条回答 默认 最新

  • shifenglv 2017-11-08 09:53
    已采纳
     public struct SqJpegScliceSize
     {
         public uint[] scliceSize;
         public IntPtr[] jpegDst;
    }
    [DllImport("xxxxx.dll",ExactSpelling =false,EntryPoint = "SqGetSliceData",CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] public static void SqGetSliceData(out SqJpegScliceSize jss);
    
    //初始化结构体
    SqJpegScliceSize jss=new SqJpegScliceSize();
    jss.scliceSize=new uint[64];
    jss.jpegDst=new IntPtr[64];
    
    //调用函数
    SqGetSliceData(out jss);
    
    点赞 评论
  • shifenglv 2017-11-08 10:04

    unsigned char *jpegDst[64];不知道你这个意图是什么,是仅仅用来接收64个指针,还是获取64个字符串。如果是64个字符串,则需要定义64个byte类型的数组,然后获取它们的指针放到IntPtr类型的数组中。这需要用到不安全代码。

     byte[][] strs=new byte[64][];
     for(int i=0;i<64;i++)
     { 
         strs[i]=new byte[1024];
         unsafe
         {
                fixed(byte *p=strs[i])
                {
                    jpegDst[i]=(IntPtr)p;
                }
         }
     }
    
    点赞 评论
  • shifenglv 2017-11-09 11:14

    不是不能传递64个地址,而是传递的地址都是没有分配空间的,无法进行读写操作。你这64个指针到底指向64个char类型的变量,还是指向64个char类型的数组?不管是变量,还是数组,在传递参数之前都要分配空间。如果指向64个char类型的数组,你需要知道数组的长度是多少,并为其分配相应空间,然后使用不安全代码分别获取它们的首地址,并保存到IntPtr[]类型的数组中。另外,你还需要设置一下结构体的布局,使字节对齐为1.

    点赞 评论
  • shifenglv 2017-11-09 11:19

    设置字节对齐

    using System.Runtime.InteropServices;
    
    [StructLayout(LayoutKind.Sequential,Pack =1)]
      public struct SqJpegScliceSize
     {
         public uint[] scliceSize;
         public IntPtr[] jpegDst;
    }
    

    [StructLayout(LayoutKind.Sequential,Pack =1)]

    点赞 评论
  • shifenglv 2017-11-10 10:04

    你确定可以了?我觉得我昨天给的代码有问题。。。。。

    点赞 评论
  • shifenglv 2017-11-10 10:07
     using System.Runtime.InteropServices;
    
    [StructLayout(LayoutKind.Sequential,Pack =1)]
     unsafe public struct SqJpegScliceSize
     {
         public fixed uint scliceSize[64];
         public fixed uint jpegDst[64];//指针是unit类型的
    }
    
    点赞 评论

相关推荐 更多相似问题