C#调用dll参数设置的问题,求大神指点迷津!!!

问题描述

在做一个设备开发,现在遇到一些问题,对方提供的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();这个就是初始化啊,不对么?

时间: 2024-08-31 17:16:55

C#调用dll参数设置的问题,求大神指点迷津!!!的相关文章

bug-String转换成可变参数的BUG,求大神帮忙解决一下,实在不知道如何解决。

问题描述 String转换成可变参数的BUG,求大神帮忙解决一下,实在不知道如何解决. java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[] at android.util.ArrayMap.allocArrays(ArrayMap.java:171) at android.util.ArrayMap.put(ArrayMap.java:444) at android.os.Bund

matrix-请问调用时候参数写什么?求助大神!我是个小白!

问题描述 请问调用时候参数写什么?求助大神!我是个小白! class Matrix:public MATRIX { public: Matrix():MATRIX(){} Matrix( int c, int r ):MATRIX(c,r){} Matrix( const Matrix& m){ *this = m; } const Matrix& operator+=( const Matrix& m ); const Matrix& operator-=( const

vs2012+matlab2013-VS2012调用matlab2013出现问题。跪求大神指导啊

问题描述 VS2012调用matlab2013出现问题.跪求大神指导啊 函数代码: int main(int argc, char argv[]) { QApplication a(argc, argv); loSmoothing w; w.show(); Engine *ep; //定义matlab引擎指针 if (!(ep=engOpen(NULL))) //测试是否启动Matlab引擎成功. { cout <<"Can't start Matlab engine!"

c++-不调用任何库函数如何实现stat_word.求大神打救

问题描述 不调用任何库函数如何实现stat_word.求大神打救 请保证代码工整,关键部分请用注释对代码逻辑进行说明 不调用任何库函数实现stat_word,该函数的功能是从字符串str中统计单词个数,str完全由英文字母及空格符组成,连续出现的若干个非空格字符即为一个单词.(5分) int stat_word(const char* str); 解决方案 #include "stdafx.h" #include <iostream> #include <vector

常见问题-android 一个界面调用另一个界面方法,求大神来指点迷津

问题描述 android 一个界面调用另一个界面方法,求大神来指点迷津 我A界面有一个viewpager,里面有个方法,我在B界面也声明viewpager,并初始化A界面的viewpager,调用viewpager方法是直接报错,这个问题困扰我很久了,求大神指点迷津啊 解决方案 http://zhidao.baidu.com/link?url=f6nBkgVSgdi6Z-_29WAN6K1w_pRMgQlgFL0rF01Dljugqsj-x6qQlVQMvU2-3jLjMUdx8Mu-Q-9M7

string-关于java字符串分割,参数为数组,求大神指教

问题描述 关于java字符串分割,参数为数组,求大神指教 public String[] splitstr (String dist,String[] arr){ //分割字符串 dist 用arr里面含有的字符分割 } 这个方法该如何实现 最好能考虑到特殊字符的处理 , 解决方案 java中有spit方法,结合spit方法和正则表达式处理

通过反射找到了已经打开的窗体。怎么调用窗体中的方法,求大神指点。

问题描述 stringwindowsName="注册";IntPtrhandle=NativeMethods.FindWindow(null,windowsName);if(handle!=IntPtr.Zero){Formfrm=(Form)Form.FromHandle(handle);frm.Activate();//frm.Go(user);} 通过反射找到了已经打开的窗体.怎么调用窗体中的方法,求大神指点. 解决方案 解决方案二:我自己顶求关注解决方案三:Invoke解决方案

对象-关于datagrid参数的问题!求大神,谢谢。

问题描述 关于datagrid参数的问题!求大神,谢谢. 我从后台封装了一个map 里面的key值一个是total,rows. 现在是rows 出现了问题.这是后台的数据~~这是我封装了一个对象类!我先扎起 想获取对象类中的对象的数据!求指导前台怎么 获取值! 解决方案 前台参数获取不到~~是个控制!我单独运行这个方法能够获取后台传过来的数据! 解决方案二: datagrid默认是post请求url,你的这个url地址支持post请求没有. f12调出开发工具看下发送的ajax请求返回了什么数据

c语言-标题是--数据输出,求大神指点迷津

问题描述 标题是--数据输出,求大神指点迷津 输入整数n(n<100)和m(m<10),输出m和m的倍数,还有包含m的数字,例如(6,12,16,18...60,66,72,76...). Input 输入正整数n和m. Output 输出从小到大排列的不大于n的与m有关的数字.每组数据占一行,每个数字后面有一个空格. Sample Input 30 6 Sample Output 6 12 16 18 24 26 30 HINT 最后一个数字后面也有空格 代码如下 #include int