C++的dll函数在c#中调用获取不到值,请大家帮忙看下,谢谢!

问题描述

下面的方法是c++写的DLL封装的方法,我要在c#里面引用然后使用:intSTDCALLSDT_ReadBaseMsg(intiPortID,unsignedchar*pucCHMsg,unsignedint*puiCHMsgLen,unsignedchar*pucPHMsg,unsignedint*puiPHMsgLen,intiIfOpen);

我在c#里面是这样写的:///<summary>///读取卡的信息///</summary>///<paramname="iPortID">端口号</param>///<paramname="pucManaInfo"></param>///<paramname="iIfOpen"></param>///<returns></returns>[DllImport("IdCardDLL/sdtapi.dll")]privatestaticexternintSDT_ReadBaseMsg(intiPortID,refchar[]pucCHMsg,refintpuiCHMsgLen,refchar[]pucPHMsg,refintpuiPHMsgLen,intiIfOpen);publicunsafestaticintReadBaseMsg(intiPortID,refchar[]pucCHMsg,refintpuiCHMsgLen,refchar[]pucPHMsg,refintpuiPHMsgLen,intiIfOpen){returnSDT_ReadBaseMsg(iPortID,refpucCHMsg,refpuiCHMsgLen,refpucPHMsg,refpuiPHMsgLen,iIfOpen);}

然后Form窗体中这样调用:intpuiCHMsgLen=0;intpuiPHMsgLen=0;char[]pucCHMsg=newchar[1024];char[]pucPHMsg=newchar[1024];inti=ReadBaseMsg(1001,refpucCHMsg,refpuiCHMsgLen,refpucPHMsg,refpuiPHMsgLen,1);MessageBox.Show(i.ToString()+""+pucCHMsg.Length);

调用之后发现,pucCHMsg根本获取不到值,请大家帮忙分析下,谢谢!

解决方案

本帖最后由 fendy5201 于 2014-03-01 15:36:12 编辑
解决方案二:
设备均可正常得到端口值,没有其他的异常,DLL的引用路径也是对的。
解决方案三:
privatestaticexternintSDT_ReadBaseMsg(intiPortID,StringBuilderpucCHMsg,refintpuiCHMsgLen,...intpuiCHMsgLen=1024;StringBuilderpucCHMsg=newStringBuilder(puiCHMsgLen);inti=ReadBaseMsg(1001,pucCHMsg,refpuiCHMsgLen,...
解决方案四:
引用2楼gomoku的回复:

privatestaticexternintSDT_ReadBaseMsg(intiPortID,StringBuilderpucCHMsg,refintpuiCHMsgLen,...intpuiCHMsgLen=1024;StringBuilderpucCHMsg=newStringBuilder(puiCHMsgLen);inti=ReadBaseMsg(1001,pucCHMsg,refpuiCHMsgLen,...

我都换成了StringBuilder,仍然是空的,获取不到值,不过谢谢啦!
解决方案五:
有人帮忙看下么?谢谢了先
解决方案六:
你看下传参的类型对没有
解决方案七:
你试试[DllImport("IdCardDLL/sdtapi.dll",CharSet=CharSet.Ansi)]
解决方案八:
引用6楼kkzhangyu的回复:

你试试[DllImport("IdCardDLL/sdtapi.dll",CharSet=CharSet.Ansi)]

我已经这么写了,还是没有得到值。[DllImport("IdCardDLL/sdtapi.dll",CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall,EntryPoint="SDT_ReadBaseMsg")]privatestaticexternintSDT_ReadBaseMsg(intiPortID,refbytepucCHMsg,refintpuiCHMsgLen,refbytepucPHMsg,refintpuiPHMsgLen,intiIfOpen);publicunsafestaticintReadBaseMsg(intiPortID,refbytepucCHMsg,refintpuiCHMsgLen,refbytepucPHMsg,refintpuiPHMsgLen,intiIfOpen){returnSDT_ReadBaseMsg(iPortID,refpucCHMsg,refpuiCHMsgLen,refpucPHMsg,refpuiPHMsgLen,iIfOpen);}

解决方案九:
debugview慢慢调试看看dll里面能接受到不最好dll返回之前再输出下结果
解决方案十:
二代身份证PC端标准调用接口。
解决方案十一:
[DllImport("IdCardDLL/sdtapi.dll",CharSet=CharSet.Ansi,EntryPoint="SDT_ReadBaseMsg")]privatestaticexternintSDT_ReadBaseMsg(intiPortID,StringBuilderpucCHMsg,refintpuiCHMsgLen,StringBuilderpucPHMsg,refintpuiPHMsgLen,intiIfOpen);publicunsafestaticintReadBaseMsg(intiPortID,StringBuilderpucCHMsg,refintpuiCHMsgLen,StringBuilderpucPHMsg,refintpuiPHMsgLen,intiIfOpen){returnSDT_ReadBaseMsg(iPortID,pucCHMsg,refpuiCHMsgLen,pucPHMsg,refpuiPHMsgLen,iIfOpen);}

解决方案十二:
StringBuilder改成string,反正是参数不对个个的试
解决方案十三:
从C#中传递一个缓冲区到DLL中,用以获取数据时,需要进行托管内存与非托管内存之间的转换。1char*对应到C#为IntPtr2从托管内存到非托管内存的转换为:定义一个byte[]buff,获取IntPtr,GCHandlegc=GCHandle.Alloc(buff,GCHandleType.Pinned);IntPtrp=gc.AddrOfPinnedObject();2从非托管内存到托管内存的转换为:Marshal.Copy(...)系列方法其中一个
解决方案十四:
楼主解决这个问题了吗,我也遇到相似的问题了,我的问题是结构体返回的值不完整,也就是说,这个结构体内,有的变量能够返回值,而有的变量没有返回值。
解决方案十五:
C++和C#参数不匹配。

时间: 2025-01-05 18:44:53

C++的dll函数在c#中调用获取不到值,请大家帮忙看下,谢谢!的相关文章

c++/cli-C++ 加载 CTP DLL 报 LNK2001 错误,请大家帮忙看下,这个问题已经困扰几天了

问题描述 C++ 加载 CTP DLL 报 LNK2001 错误,请大家帮忙看下,这个问题已经困扰几天了 有个问题困扰我几天了,群里的大牛帮忙看下. 我加载ctp的dll时,会报下面这个错误. 谁知道原因,或者之前遇到过吗? 解决方案 删除所有的obj,重新编译下,检查下你的lib目录,对应的lib是否齐全.如果程序是自己写的,那么检查下函数的定义和调用是否一致. 解决方案二: 你需要工程中添加ctp的lib库文件.这样link才找得到.

DAO中,rs.next 结果集里是空值,请大家帮看下,谢谢!有贴代码

问题描述 public boolean isExists(Operator operator) {Connection conn = null;PreparedStatement stmt = null;boolean tmp = false;try {conn = OracleDAOFactory.getConnection(); //conn = OracleDAOFactory.getConnection();stmt = conn.prepareStatement(GET_AN_OPER

c语言-求帮忙看下为什么程序调用了西沟函数导致程序整个不能运行

问题描述 求帮忙看下为什么程序调用了西沟函数导致程序整个不能运行 写说明一下代码,代码主要是要在控制台模拟浏览器对tab和网页前进后退的一些操作 再说明一下问题,问题在于brwosertab类和webinformation类的西沟函数,一旦在这两个类的西沟函数里面写上delete 指针名字:整个程序就不能运行了,最关键的是我不太明白为什么程序要调用这两个函数,因为我感觉我都是动态对象啊.最后说明一下,我很菜,只有一点java编程的经验,所以第一次应对c++我真的需要一些帮助.谢谢你们了! 解决方

javase-请大神帮忙看下,为什么MyPanel中的Paint方法没有被调用

问题描述 请大神帮忙看下,为什么MyPanel中的Paint方法没有被调用 package javademo; import javax.swing.*; import java.awt.*; public class DrawDemo extends JFrame{ MyPanel mp = null; public static void main(String []args){ DrawDemo drawdemo = new DrawDemo(); } public DrawDemo(){

请问java语言中的样条插值算法在vfp程序语言中调用获取的思路是什么?相关的例程在哪里找?

问题描述 请问java语言中的样条插值算法在vfp程序语言中调用获取的思路是什么?相关的例程在哪里找? 请问java语言中的样条插值算法在vfp程序语言中调用获取的思路是什么?相关的例程在哪里找? 解决方案 http://download.csdn.net/detail/zjjxinanjd/5236561

c++-win10下VS2010中调用CreateFileMapping失败,请教一下问题出在哪里?谢谢

问题描述 win10下VS2010中调用CreateFileMapping失败,请教一下问题出在哪里?谢谢 m_hFile = CreateFileMapping (INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, max_size, name); if (!m_hFIle) throw Exception(GetLastError(),TEXT("SHM:can't CreateFileMapping"); DWORD dwLastErro

vc6 0 extern 问题2个-vc6.0 中extern使用时遇到的2个疑问,还望诸位帮忙看下,多谢

问题描述 vc6.0 中extern使用时遇到的2个疑问,还望诸位帮忙看下,多谢 我在文件1CTestHello.cpp 声明了 extern void delete_string(char a[],char b[],char standard); 再调用文件2 file2.c中的delete_string(a,b,Standard);函数: 发现2个问题: 问题1:用extern实验发现必须用include,但查找资料,没有说这两个有必然关联.请问到底有没有必然关联?下面是实验: 如果文件1中

c++11-请帮忙看下async_accept的这种调用方法,没有使用Bind,看不懂...

问题描述 请帮忙看下async_accept的这种调用方法,没有使用Bind,看不懂... void AsyncAcceptManaged(ManagerAcceptHandler mgrHandler) { _acceptor.async_accept(_socket, [this, mgrHandler](boost::system::error_code error) { if (!error) { try { _socket.non_blocking(true); mgrHandler(

spring mvc-求帮忙看下springmvc框架中注解事务失效问题

问题描述 求帮忙看下springmvc框架中注解事务失效问题 web.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&q