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?万分感谢
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?万分感谢
另c#调用aa的时候正常,结构体应该没问题
指针需要用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);