1.c++给了个接口,要求传入DWORD类型;
2.这个DWORD,不是说简单的对应个int就可以的,c++demo里是结构体指针的第一个结构体的地址;
3.c++Demo代码如下:
    struct THFI_FacePo//定义结构体
    {
     ... ...
    }
     aa(THFI_FacePos* pfps);//申明接口aa,注意入参是指针
     bb(DWORD pdata);//申明接口bb     THFI_FacePos ptfp[1];//定义aa的入参
     aa(ptfp);//调用接口aa给ptfp赋值
     bb((DWORD)&ptfp[0] ) ;//调用接口bb
4.c#demo如下:
    struct THFI_FacePo//定义结构体
    {
     ... ...
    }
     unsafe aa(THFI_FacePos* pfps);//申明接口aa,注意入参是指针,使用unsafe
     unsafe bb1(THFI_FacePos* pfps);//bb的第一种申明方式,实际写的是bb,为了描述方便写成bb1
     unsafe bb2(THFI_FacePos pfp);//bb的第二种申明方式,实际写的是bb,为了描述方便写成bb2
     unsafe bb3(ref THFI_FacePos pfp);//bb的第三种申明方式,实际写的是bb,为了描述方便写成bb3
     unsafe bb4(IntPtr pfp);//bb的第四种申明方式,实际写的是bb,为了描述方便写成bb4     THFI_FacePos* pfps = stackalloc THFI_FacePos[1];;//定义aa的入参
     aa(pfps);//调用接口aa给ptfp赋值
     bb(pfps) ;//第一种方式调用接口bb1,结果与c++差距很大
     bb(pfps[0]) ;//第二种方式调用接口bb2,内存错误
     bb(ref pfps[0]) ;//第三种方式调用接口bb3,与第一种效果一样
     IntPtr structPtr = Marshal.AllocHGlobal(Marshal.SizeOf(pfps[0]));
     Marshal.StructureToPtr(pfps[0], structPtr, true);
     bb(structPtr);;//第四种方式调用接口bb4,与第一种效果一样
     Marshal.FreeHGlobal(structPtr);求教是否应该定义bb(int p)?如果是,如何将pfps转成int?万分感谢

解决方案 »

  1.   

    求帮助。
    另c#调用aa的时候正常,结构体应该没问题
      

  2.   

    请参考:https://blog.csdn.net/liguo9860/article/details/37043911
      

  3.   

    求各位大神不吝赐教啊,是不是要定义uint ,如果是的话 该怎么给unit赋值
      

  4.   

    c++ 提供的接口定义是指针,
    指针需要用IntPtr来对应
      

  5.   

    用IntPtr来对应指针,从技术来说是没有问题的,
    有问题是出在细节处理上
    参考这个例子:[DllImport(RTDB_DLL,EntryPoint = 'DBPT_GetTagsBaseAttribute',CharSet = CharSet.Ansi,CallingConvention= CallingConvention.StdCall]
    public static extern int GetTagsAttributeWithPtr(int nHandle,int nTagCount,[In,Out] int[] errorArray,IntPtr TagAttr[] TagAttary);int size = Marshal.SizeOf(typedef(TagAttr)) ;
    IntPtr attrInput = Mashal.AllocHGlobal(count*size);
    DBPT.GetTagsAttributeWithPtr(nHandle,count,out errors,ids, attrInput);
    for(int i = 0;i< count;i++)
    {
        IntPtr ptr = (IntPtr)((UInt32)attrInput + i* size);
        tagsArray[i] = (TagAttr)Mashal.PtrToStructure(ptr,typeof(TagAttr));
    }
    Marshal.FreeHGlobal(attrInput);