C#调用C++的DLL接口问题

问题描述

有没有精通C++和C#的大侠:我想用C#调用C++的DLL的一个接口,但实在不会C++转C#请教:C++接口如下:函数:int32_tDPSDK_CALL_METHODDPSDK_QueryAlarmInfo(INint32_tnPDLLHandle,INAlarm_Query_Info_t*pQuery,INOUTAlarm_Info_t*pInfo,INintnFirstNum,INintnQueryCount,INintnTimeout=DPSDK_CORE_DEFAULT_TIMEOUT);参数:nPDLLHandle[in]sdk实例句柄pQuery[in]查询信息,参考表1pInfo[in,out]报警信息,参考表4nFirstNum[in]从第几个开始获取nQueryCount[in]获取记录个数nTimeout[in]超时,默认DPSDK_CORE_DEFAULT_TIMEOUT对象如下:typedefstructtagAlarmQueryInfo{charszCameraID[DPSDK_CORE_CHL_ID_LEN];//通道IDuint64_tuStartTime;//开始时间uint64_tuEndTime;//结束时间dpsdk_alarm_dealwith_enDealWith;//报警处理类型,参考表2dpsdk_alarm_type_enAlarmType;//报警类型,参考表3}Alarm_Query_Info_t;typedefstructtagAlarmInfo{INuint32_tnCount;//请求录像数OUTuint32_tnRetCount;//实际返回个数OUTSingle_Alarm_Info_t*pAlarmInfo;//报警信息,参考表5}Alarm_Info_t;typedefstructtagSingleAlarmInfo{dpsdk_alarm_type_enAlarmType;//报警类型,参考表3dpsdk_event_type_enEventType;//事件状态,参考表6charszDevId[DPSDK_CORE_DEV_ID_LEN];//报警设备IDuint32_tuChannel;//报警通道uint64_tuAlarmTime;//报警时间dpsdk_alarm_dealwith_enDealWith;//处理意见,参考表2}Single_Alarm_Info_t;请问C#调用这个接口该怎么写?更多0

解决方案

解决方案二:

不要做A语言代码修改为B语言代码的无用功。也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。即可很方便地让A、B两种语言之间协调工作。比如:A将请求数据写到文件a.txt,写完后改名为aa.txtB发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txtA发现bb.txt存在时,读取其内容,读完后删除bb.txt以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。除非A或B不支持判断文件是否存在、文件读写和文件更名。但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?可以将临时文件放在RamDisk上提高效率减少磨损磁盘。数据的结构很复杂的话,文本文件的格式问题可参考json或xml共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:·进程之间松耦合·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。·方便在线开关服务,只需删除或创建该临时文本文件即可。·方便实现分布式和负载均衡。·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)·……“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边,回头是“使用共享纯文本文件进行信息交流”的岸!
解决方案三:

http://blog.csdn.net/jiangxinyu/article/details/7848015[DllImport(“MyDLL.dll")]publicstaticexternintmySum(inta,intb);注意C++函数的参数转换成C#的时候要对应usignedchar-byteint*int[]usignedchar*-byte[]
解决方案四:

有哪位大侠给翻译成C
解决方案五:

#你是来找解决方案的,长篇理论就不说了,什么不要这样,不要那样的就是废话,c#调用c++为什么要这样做也不是你能决定的给你写了一个没有验证,因为这个还得你调试一下才知道行不行。类型转换你网上找一下[DllImport(dllPath,EntryPoint="DPSDK_QueryAlarmInfo")]//c/c++:intDPSDK_QueryAlarmInfo(INint32_tnPDLLHandle,INAlarm_Query_Info_t*pQuery,//INOUTAlarm_Info_t*pInfo,//INintnFirstNum,//INintnQueryCount,//INintnTimeout=DPSDK_CORE_DEFAULT_TIMEOUT)publicexternstaticintDPSDK_QueryAlarmInfo([In]intnPDLLHandle,[In]IntPtrpQuery,[In,Out]IntPtrpInfo,[In]intnFirstNum,[In]intnQueryCount,[In]intnTimeout);[StructLayout(LayoutKind.Sequential)]publicstructtagAlarmQueryInfo{[MarshalAs(UnmanagedType.ByValTStr,SizeConst=DPSDK_CORE_CHL_ID_LEN)]publicstringszCameraID;//通道IDpublicSystem.UInt64uStartTime;//开始时间publicSystem.UInt64uEndTime;//结束时间/*dpsdk_alarm_dealwith_e这个我不知道是什么类型,如果是int就这样处理*/publicintnDealWith;//报警处理类型,参考表2publicintnAlarmType;//报警类型,参考表3}

还要说明一下,我这个写法是直接把你的结构体变成IntPtr了,你调用的时候需要转换tagAlarmQueryInfoQueryInfo=newtagAlarmQueryInfo();intnSizeOfQueryInfo=Marshal.SizeOf(QueryInfo);IntPtrpQueryInfo=Marshal.AllocHGlobal(nSizeOfQueryInfo);QueryInfo=(tagAlarmQueryInfo)Marshal.PtrToStructure(pQueryInfo,typeof(tagAlarmQueryInfo));Marshal.FreeHGlobal(pQueryInfo);

解决方案六:

其他的结构体你按照一样的方式转换就像了,用的过程中比较麻烦的应该是内存问题。避免c++里面开辟的内存在c#里面释放,一样的避免c#申请的空间在c++里面被释放了。其他应该就是参数转换,加载的时候就要注意dll路径要正确,c++那边应该接口要用c的导出方式

时间: 2024-09-23 02:47:34

C#调用C++的DLL接口问题的相关文章

C#调用PB 的dll接口问题 急~~~~~~~~~~~~~接口

问题描述 C#调用PB 的dll接口问题 急~~~~~~~~~~~~~接口 这边有个PB写的gzyblocalcom.dll文件 在C#中调用, 接口开发商 说这个是PB 的dll 是COM组件接口,但是我在C#引用中COMTab页中找不到但是在浏览中能够找到并且添加引用,能够调用方法 yh_ybfw(string a,string b,ref string c ,ref short d ,ref string e):但是出错 提示 无效的字符转换 , using gzyblocalcom; g

C#调用C++的DLL接口问题。

问题描述 有没有精通C++和C#的大侠:我想用C#调用C++的DLL的一个接口,但实在不会C++转C#请教:C++接口如下:函数:int32_tDPSDK_CALL_METHODDPSDK_QueryAlarmInfo(INint32_tnPDLLHandle,INAlarm_Query_Info_t*pQuery,INOUTAlarm_Info_t*pInfo,INintnFirstNum,INintnQueryCount,INintnTimeout=DPSDK_CORE_DEFAULT_TI

stringbuilder-C#中调用C++Dll接口,字符串编码问题

问题描述 C#中调用C++Dll接口,字符串编码问题 在C#中调用C++Dll接口,接口返回一个多字节字符串,然后再C#中再次转码为宽字节字符串. 字符串内容都为汉字. **_问题: 如果汉字为偶数个,则一切正常: 如果汉字为奇数个,则C#获得的多字节字符串内容的最后一个字节被篡改成'?'的ascll码.(多字节编码时,每个汉字占三个字节) 本人没多少币,全部家当拿出来了,求大神指点.**_ C++代码: // 宽字节转多字节 __declspec(dllexport) void TCharTo

有关VB6.0语言调用DLL接口的问题

问题描述 有关VB6.0语言调用DLL接口的问题 VB语言定义的Type是不是就是C++的结构体,如何获取Type中的内存分配指针呢? 解决方案 http://blog.csdn.net/sjrhero/article/details/6732068 解决方案二: VB6.0调用WEBService问题VB6.0调用WEBService问题

c++-【下跪】PB调用C的DLL报错

问题描述 [下跪]PB调用C的DLL报错 一下是文档中的结构体: typedef struct{byte Track2[37]; /*二磁道信息 ,asc格式 最长37个字节 */byte Track3[104]; /*三磁道信息 asc 格式 最长 104个字节*/byte Pwd[8]; /*加密后的密码 8个字节 */byte Amount[12]; /* 金额, 分为单位000000000001 代表1分不允许0金额积分兑奖时为积分*/byte Trace[6]; /* 终端流水,不是动

dll c#-c#调用c++的dll出现尝试读取或写入受保护的内存问题

问题描述 c#调用c++的dll出现尝试读取或写入受保护的内存问题 使用c#调用c++的一个dll.c++的接口函数为: extern "C" __declspec(dllexport)bool __stdcall CreateDetmObject(IDetManager **ppDetManager); 参数IDetManager为一个结构体: struct IDetManager { virtual void __stdcall SetListener(HWND hWnd) = 0

jna java c++ dll-最近用JNA技术,实现java调用C++的DLL,如何用java模拟c++的链表结构体。

问题描述 最近用JNA技术,实现java调用C++的DLL,如何用java模拟c++的链表结构体. C++结构体 struct CUser_DataStruct { char pKKSCoding[128]; //标签点Kks编码 DWORD time; //UTC时间 WORD millisecond; //毫秒 int nDataState; //数据状态 double dValue; //数值 CUser_DataStruct* pNext; //指向下一个数据节点的指针 }; C++的入

javaweb-java视频监控,java怎么操控摄像头,怎么调用厂家的dll

问题描述 java视频监控,java怎么操控摄像头,怎么调用厂家的dll 最近遇到一个项目,有视频监控部分,以前没有接触过摄像头,请问java该如何控制摄像头的行为呢,还有上传和下载摄像头的视频信息到页面上,请大神前辈们指教 解决方案 想问下各位 怎么编写android手机上的应用去取得网络摄像头的资源来呢?我现在遇到的问题就是自己写了一个应用 但是不能够获得网络摄像机的数据 用他自己带的软件是可以的 它是通过登陆摄像头ID然后就可以了,我的为什么不行呢,是不是需要验证呢(用浏览器ip方式登陆摄

请教:关于从C#调用外部C++ DLL出错,二维指针参数不匹配

问题描述 请教:关于从C#调用外部C++ DLL出错,二维指针参数不匹配 我是新人,头一次发帖,如果这个问题太低级还请各位大神原谅! 我在写一段C#代码调用外部一个C++DLL,该DLL数据初始化部分接口是这样的: public unsafe void SetImage(ushort** slices, int xSize, int ySize, int zSize) 其中第2-4个参数分别是一个3维图像数据的长宽高,我们假定图像是512×512×400:而这个二维指针参数slices则是指向指