问题描述
在做一个设备开发,现在遇到一些问题,对方提供的dll文件是c++编译的,我使用c#导入dll的函数,有一个函数有问题,调用时报异常,这个函数是关键函数,不知道哪里出错,求大神指点一下,不胜感激!函数原型如下:extern"C"__declspec(dllexport)CHD_RET_ECHD_WMP_Poll(INCHD_WMP_Thandle,OUTCHD_STREAM_TYPE_E*type,INCHD_U32timeout_sec,INCHD_U32timeout_msec);c#里面我这样写的:publicenumCHD_STREAM_TYPE_E{CHD_STREAM_VIDEO=0x00,CHD_STREAM_PICTURE=0x01,CHD_STREAM_AUDIO=0x02,CHD_STREAM_SERIAL=0x03,CHD_PARAM_CHANGE_VABILITY=0X04,CHD_PARAM_CHANGE_VPARAM=0X05,CHD_PARAM_CHANGE_VCTRL=0X06,CHD_PARAM_CHANGE_AUDEO=0X07,CHD_PARAM_CHANGE_SERIAL=0X08,CHD_PARAM_CHANGE_GPIO=0X09,}[DllImport("CHD_WMP.dll",EntryPoint="CHD_WMP_Poll")]publicexternstaticshortCHD_WMP_Poll(longhandle,refCHD_STREAM_TYPE_Etype,inttimeout_sec,inttimeout_msec);调用:然后运行后抛出异常:查了资料,感觉是输出数据的那个参数不对,但尝试了很多方法没有结果,请大神看看怎么修改,不胜感激!
解决方案
解决方案二:
CHD_WMP_T这个是什么类型的?确定下。
解决方案三:
引用1楼unearth的回复:
CHD_WMP_T这个是什么类型的?确定下。
是unsignedlong型的!#defineIN//inparameter#defineOUT//outparametertypedefunsignedlongCHD_WMP_T;//handletypeofchirdwirelessmultimediaplatformtypedefunsignedcharCHD_U8;typedefcharCHD_S8;typedefunsignedshortCHD_U16;typedefshortCHD_S16;typedefunsignedintCHD_U32;typedefintCHD_S32;typedefunsignedlongCHD_UL32;typedeflongCHD_SL32;typedefvoidCHD_VOID;
解决方案四:
引用1楼unearth的回复:
CHD_WMP_T这个是什么类型的?确定下。
应该不是这个参数的问题,我用别的函数,这个是没啥问题的,唯一怀疑的就是这个返回的枚举指针,不知道该怎么处理
解决方案五:
[DllImport("CHD_WMP.dll",EntryPoint="CHD_WMP_Poll")]publicexternstaticshortCHD_WMP_Poll(longhandle,[Out,MarshalAs(UnmanagedType.U4)]outCHD_STREAM_TYPE_Etype,inttimeout_sec,inttimeout_msec);
试试这样
解决方案六:
引用4楼xb_feng的回复:
[DllImport("CHD_WMP.dll",EntryPoint="CHD_WMP_Poll")]publicexternstaticshortCHD_WMP_Poll(longhandle,[Out,MarshalAs(UnmanagedType.U4)]outCHD_STREAM_TYPE_Etype,inttimeout_sec,inttimeout_msec);试试这样
还是不行啊,报异常
解决方案七:
报什么异常?把异常贴上来
解决方案八:
引用6楼xb_feng的回复:
报什么异常?把异常贴上来
解决方案九:
CHD_STREAM_TYPE_E类型对象先初始化一下,不要给个空对象进去,api调用原则大多数都是谁调用就由谁申请、释放还有Dllimport的时候,相关属性需要定义完整比较重要的是CharSet和CallingConvention[DllImport("yourdll",EntryPoint="yourfunc",CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
解决方案十:
引用8楼xian_wwq的回复:
CHD_STREAM_TYPE_E类型对象先初始化一下,不要给个空对象进去,api调用原则大多数都是谁调用就由谁申请、释放还有Dllimport的时候,相关属性需要定义完整比较重要的是CharSet和CallingConvention[DllImport("yourdll",EntryPoint="yourfunc",CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
publicCHD_STREAM_TYPE_Edatatype=newCHD_STREAM_TYPE_E();这个就是初始化啊,不对么?