C++写的动态库中的结构在C#中怎么声明(2)

问题描述

C++:有这样一个结构:typedefstruct_Event{BYTECode;//eventcodeBYTEDotID;//controllercomponentIDWORDreserved;//reservedSYSTEMTIMETime;//eventtime_Event*pNext;//pointernextevent;}TEvent,*PEvent;函数:intNT_GetEvent(unsignedlongLineID,BYTECtrlID,BYTE*Bagid,BYTE*EventCount,TEvent*lpEvent);

我现在想在C#中调用这样的结构,我该怎么写啊,麻烦大家指教指教#¥,下面是我自己写的,但有问题,只能读到且只能读一条记录(如设备有1个事件,可以正常使用,但如果有2个或2个以上事件就读不出来)[StructLayout(LayoutKind.Sequential)]//[SerializableAttribute]//[ComVisibleAttribute(true)]unsafepublicstructPEvent{publicbyteCode;publicbyteDotID;publicushortreserved;publicTimeTime;publicIntPtrpNext;}函数:[DllImport("TC3XY.dll")]publicstaticexternintNT_GetEvent(ushortLineID,shortCtrlID,refshortBagid,refshortEventCount,refPEventlpEvent);//获取设备事件

解决方案

解决方案二:
呵呵,遇到过对于动态库无语了找下我找下忘记了,再发上来
解决方案三:
最后一个不是指针么用Marshal.PtrToStructure(IntPtr,Type)将内存拷贝到一个结构体里面,就可以了.
解决方案四:
找不到了!不好意思!网上去找哈!
解决方案五:
引用2楼akirya的回复:

最后一个不是指针么用Marshal.PtrToStructure(IntPtr,Type)将内存拷贝到一个结构体里面,就可以了.

我也想到这个方法了,但没用成功,我把我的代码贴出来,麻烦您帮我看看:我的结构:[StructLayout(LayoutKind.Sequential)]publicstructPEvent{publicbyteCode;publicbyteDotID;publicTCardNumberCardNumber;publicushortreserved;publicTimeTime;publicIntPtrpNext;}publicvoidGetEvent(){byteBagid=this.SEventBagId;byteEventCount=this.SEventCount;intrs=0;stringStr="";inti=0;EkcoTog.PEventEvent=newEkcoTog.PEvent();EkcoTog.PEventlpNext=newEkcoTog.PEvent();try{Bagid=SEventBagId;EventCount=SEventCount;//MessageBox.Show("success");rs=EkcoTog.DPU3001_Dll.NT_GetEvent(LineID,CtrlID,refBagid,refEventCount,refEvent);this.listBox1.Items.Add(rs.ToString());if(rs==0){SEventBagId=Bagid;//SaveeventpackagenumberfornexttimeSEventCount=EventCount;//SaveeventcountfornexttimeEkcoTog.PEvent[]Sevent=newPEvent[EventCount];stringstr="BagID:"+Bagid.ToString()+"EventCount:"+EventCount.ToString();this.listBox1.Items.Add(str);lpNext=Event;for(i=0;i<EventCount;i++){intm=i+1;Str+=m.ToString()+"DateTime:"+lpNext.Time.wMonth.ToString()+"-"+lpNext.Time.wDayOfWeek.ToString()+"-"+lpNext.Time.wHour.ToString();Str+=""+lpNext.Time.wMinute.ToString()+":"+lpNext.Time.wSecond.ToString()+":"+lpNext.Time.wMilliseconds.ToString();Str+="EventCode:"+lpNext.Code.ToString();Str+="ComponentAddress:"+lpNext.DotID.ToString();Str+="CardOffset:"+lpNext.CardNumber.dwCardNo.ToString()+"THISISEND!"+lpNext.pNext.ToString();this.listBox1.Items.Add(Str);//lpNext.pNext=Event.pNext;//lpNext=ptr;//lpNext=lpNext.pNext.ToPointer();//IntPtrp=lpNext.pNext;//lpNext.pNext=IntPtr.Zero;IntPtrptr=Marshal.ReadIntPtr(Event,i);Sevent[i]=(PEvent)Marshal.PtrToStructure(Event.pNext,typeof(PEvent));return;}}if(rs==133){this.listBox1.Items.Add("所有事件都已经上载,没有新事件!");}else{this.listBox1.Items.Add("获取事件失败!"+rs.ToString());}}catch{//this.listBox1.Items.Add("WW!");}}

解决方案六:
引用3楼tigerleq的回复:

找不到了!不好意思!网上去找哈!

谢谢关注!
解决方案七:
我也想到这个方法了,但没用成功,我把我的代码贴出来,麻烦您帮我看看:
解决方案八:
Marshal.PtrToStructure(Event.pNext,Event);

解决方案九:
能不能具体点啊Marshal.PtrToStructure(Event.pNext,Event);

时间: 2024-11-17 07:39:12

C++写的动态库中的结构在C#中怎么声明(2)的相关文章

c语言-冒泡排序可以这样写吗,我只对结构体数组中某一个元素进行排序,然后交换

问题描述 冒泡排序可以这样写吗,我只对结构体数组中某一个元素进行排序,然后交换 struct troop { char name[1]; int a[3]; }tro[4]; void bubblesort(int a, int b, int c) { struct troop temp; int i, j; for (i=a; i { for (j=a+1; j { if (tro[j].a[c] > tro[i].a[c]) { temp = tro[j]; tro[j] = tro[i];

c# 调用vc++写的动态库 时含有指针参数时的问题

问题描述 c#调用vc++写的动态库时含有指针参数时的问题[DllImport("yhybReckoning.dll",EntryPoint="_DataDown_sp@12",CharSet=CharSet.Unicode,CallingConvention=CallingConvention.Cdecl)]publicstaticunsafeexternstringDataDown_sp(stringDownLoadStr,stringDownloadLSH,r

C++写的动态库中的结构在C#中怎么声明

问题描述 小弟现在有一个相同的问题想请教大家c++结构:typedefstruct_Model{charModel[10];//modelcharVersion[6];//version}TModel,*PModel;C++调用:intNT_GetModel(unsignedlongLineID,BYTECtrlID,TModel*rModel); 我现在想在C#中调用,不知道该怎么解决啊,能不能指教小弟一二,呵呵--我这里的问题是:能够正常执行,但返回不了正确的值:我定义的C#结构:[Stru

C++写的动态库中的结构在C#中怎么使用

问题描述 C++:有这样一个结构:typedefstruct_Event{BYTECode;//eventcodeBYTEDotID;//controllercomponentIDWORDreserved;//reservedSYSTEMTIMETime;//eventtime_Event*pNext;//pointernextevent;}TEvent,*PEvent;函数:intNT_GetEvent(unsignedlongLineID,BYTECtrlID,BYTE*Bagid,BYTE

6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作

 一  QT的内存管理 1  QT中的内存管理是QObject来管理的 2  QT中的内存管理没有cocos2dx中的引用计数 3  组件可以指定父对象 QTimer *timer = QTimer(this);   //这里的this实际上强制转换成为了QObject了. 4  每一个对象都有一个deleteLater()方法, QLineEdit* edit = new QLineEdit(this);   delete edit;   //这里的delete马上调用析构函数对内存进行释

C#调用非托管动态库中的函数

C#如何调用一个非托管动态库中的函数呢,比如用VC6写的动态库,总之C#调用动态库的过程是比Java调用DLL动态库方便快捷多了,下面举例说明这个过程. 1.创建一个非托管动态库 代码如下: //这一句是声明动态库输出一个可供外不调用的函数原型. extern "C" __declspec(dllexport) int add( int , int ); int add( int a, int b) { //实现这个函数returna+b; } 注意上面代码,一定要加上 extern&

C++Builder中动态库的链接问题

动态库链接到应用程序中主要有两种方式:隐式链接和显式链接.隐式链接是常用方式. 如果应用程序和动态库是分别在不同开发平台上编制的,动态库的导入库(lib文件)可能会与应用程序的开发平台所要求的导入库格式不相容,从而在应用程序与动态库隐式链接时,出现程序链接错误:contains invalid OMF record.例如在C++Builder开发平台上链接Visual C++制作的动态库时,就会出现上述的错误.解决这一问题,可以采用两种方法:显式连接法和使用C++Builder中提供的导入库生成

分析Windows和Linux动态库_unix linux

    摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理.但不同操作系统的动态库由于格式 不同,在需要不同操作系统调用时需要进行动态库程序移植.本文分析和比较了两种操作系统动态库技术,并给出了将Visual C++编制的动态库移植到Linux上的方法和经验. 1.引言 动态库(Dynamic Link Library abbr,DLL)技术是程序设计中经常采用

[c/c++]关于linux下动态库/静态库的基础问题

问题描述 [c/c++]关于linux下动态库/静态库的基础问题 本人小白,自学没多久,有几个问题一直没搞太明白,望高手解答! 假如我写了一个动态库libmylib.so(我有函数声明mylib.h),里面用到了A同学写的动态库liba.so(我有声明a.h),现在我要在一个新的程序test.cpp里调用我写的mylib.so 问题: 1.test.cpp的头文件需要两个.h都包含还是只要mylib.h? 2.用g++链接时 -lmylib -la都需要吗? 3.假如有一天liba.so文件丢失