如何这个c++翻译成C#,PLAT_SUBSCRIBEINFO 这个是driver info结构体体。

C#调用C++DLL接口时,C++接口需要的参数是结构体数组指针,那我C#如何编写C#调用C++DLL接口时,C++接口需要的参数是结构体数组-知识宝库
你可能对下面的信息感兴趣> C#调用C++的dll 指向结构体指针的指针有关问题
C#调用C++的dll 指向结构体指针的指针有关问题
king8350141 & &
发布时间: & &
浏览:3 & &
回复:2 & &
悬赏:0.0希赛币
C#调用C++的dll 指向结构体指针的指针问题C++代码typedef struct _LSHSearchResultT{
} LSHSearchResultT, *PLSHSearchResultT;extern &C& DLL_EXPORT int RNN(LSHSearchResultT **lshresult);C#代码public struct LSHSearchResultT{ &
& };public static extern int RNN(out IntPtr lshresult);使用时,IntPint sum = test.RNN(out lshresult);LSHSearchResultT[] lsh = new LSHSearchResultT[2];for (int i = 0; i & 2; i++){ &
IntPtr ptr = Marshal.ReadIntPtr(lshresult, i * 4); &
lsh[i] = (LSHSearchResultT)Marshal.PtrToStructure(ptr, typeof(LSHSearchResultT));//运行到此处:提示尝试读取或写入受保护的内存,这通常指示其他内存已损坏}为什么啊?谢谢
我晕,string是C++的吗?把它换成char string[255];extern &C& DLL_EXPORT int RNN(LSHSearchResultT **lshresult);& 换成:extern &C& DLL_EXPORT int RNN(LSHSearchResultT &lshresult);& public struct LSHSearchResultT& {&
};& 改成:public struct LSHSearchResultT& {&
public char[] framefile=new string[255];&
};& public static extern int RNN(out IntPtr lshresult);& 改成:public static extern int RNN(ref LSHSearchResultT lshresult);& 下面都要相应改动,我就省略了。rock123 & &
00:42:57 & &
& & (0)(1)引用C++结构中不能包含类对象(string)。
00:42:57 & &
& & (0)(0)引用
本问题标题:
本问题地址:
温馨提示:本问答中心的任何言论仅代表发言者个人的观点,与希赛网立场无关。请对您的言论负责,遵守中华人民共和国有关法律、法规。如果您的言论违反希赛网问答中心的规则,将会被删除。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&一个客户要使用C#调用我们用C++开发的一个动态链接库,本来我没有C#的开发经验,就随便写了一个例程。以为很简单就可以搞定,没想到客户开发的过程中遇到了不少问题,最困难的就是用C#调用C++接口中的自定义数据类型的数组作为参数的情况了,解决完问题,总结如下。
DLL接口定义如下:
这里pDinCanInfo是有3个DINCAN_INFO元素数组的指针,其中ReadDinCanInfo中的pDinCanInfo需要作为out参数,WriteDinCanInfo需要作为In参数,这两种使用形式在C#中的调用方法也不太一样。
C#调用ReadDinCanInfo关键代码如下:
DINCAN_INFO DinInfo = new DINCAN_INFO();
int size = Marshal.SizeOf(typeof(DINCAN_INFO)) * 3;
byte[] bytes = new byte[size];
IntPtr pBuff = Marshal.AllocHGlobal(size);
DINCAN_INFO[] pDInfo = new DINCAN_INFO[3];
if (ReadDinCanInfo(, pBuff)) //参数一为卡内码
for (int i = 0; i & 3; ++i)
IntPtr pPonitor = new IntPtr(pBuff.ToInt64() + Marshal.SizeOf(typeof(DINCAN_INFO)) * i);
pDInfo[i] = (DINCAN_INFO)Marshal.PtrToStructure(pPonitor, typeof(DINCAN_INFO));
MessageBox.Show("订餐日期:" + pDInfo[i].iYear + "-"+ pDInfo[i].iMonth + "-"+ pDInfo[i].iDay);
MessageBox.Show("订餐餐次:" + pDInfo[i].iMeal);
MessageBox.Show("是否取餐:" + pDInfo[i].bTaked);
Marshal.FreeHGlobal(pBuff);
MessageBox.Show("读取订餐信息成功");
C#调用WriteDinCanInfo关键代码如下:
DINCAN_INFO DinInfo = new DINCAN_INFO();
DinInfo.iYear =Convert.ToUInt32( DateTime.Now.Year);
DinInfo.iMonth = Convert.ToUInt32( DateTime.Now.Month);
DinInfo.iDay = Convert.ToUInt32( DateTime.Now.Day);
DinInfo.iType = 1;
DinInfo.iMeal = 1;
DinInfo.bTaked = false;
int size = Marshal.SizeOf(typeof(DINCAN_INFO)) * 3;
byte[] bytes = new byte[size];
IntPtr pBuff = Marshal.AllocHGlobal(size);
DINCAN_INFO[] pDInfo = new DINCAN_INFO[3];
long ptr = pBuff.ToInt64();
for (int i = 0; i & 3; ++i )
IntPtr RPtr = new IntPtr(ptr);
pDInfo[i] = new DINCAN_INFO();
pDInfo[i].iYear = Convert.ToUInt32(DateTime.Now.Year);
pDInfo[i].iMonth = Convert.ToUInt32(DateTime.Now.Month);
pDInfo[i].iDay = Convert.ToUInt32(DateTime.Now.Day);
pDInfo[i].iType = Convert.ToUInt32(i);
pDInfo[i].iMeal = Convert.ToUInt32(i);
pDInfo[i].bTaked = false;
Marshal.StructureToPtr(pDInfo[i], RPtr, false);
ptr += Marshal.SizeOf(typeof(DINCAN_INFO));
if (WriteDinCanInfo(, pBuff)) // 参数一为卡内码
MessageBox.Show("写入订餐信息成功");
代码看起来比较麻烦,要参考的抄以上代码了,主要思想就是申请一块内存,在申请的这块内存中构建数组对象,然后将这个内存地址作为pDinCanInfo进行调用。两个函数的区别就是如何将内存按定义的数据结构进行解析的区别。
阅读(...) 评论()

我要回帖

更多关于 driver info结构体 的文章

 

随机推荐