C++的dll函数在c#中调用获取不到值,请大家帮忙看下,谢谢! 本帖最后由 fendy5201 于 2014-03-01 15:36:12 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 设备均可正常得到端口值,没有其他的异常,DLL的引用路径也是对的。 private static extern int SDT_ReadBaseMsg(int iPortID, StringBuilder pucCHMsg, ref int puiCHMsgLen, ...int puiCHMsgLen = 1024;StringBuilder pucCHMsg = new StringBuilder(puiCHMsgLen);int i = ReadBaseMsg(1001, pucCHMsg, ref puiCHMsgLen, ... 我都换成了StringBuilder,仍然是空的,获取不到值,不过谢谢啦! 你试试[DllImport("IdCardDLL/sdtapi.dll",CharSet = CharSet.Ansi)] 我已经这么写了,还是没有得到值。 [DllImport("IdCardDLL/sdtapi.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall, EntryPoint = "SDT_ReadBaseMsg")] private static extern int SDT_ReadBaseMsg(int iPortID, ref byte pucCHMsg, ref int puiCHMsgLen, ref byte pucPHMsg, ref int puiPHMsgLen, int iIfOpen); public unsafe static int ReadBaseMsg(int iPortID, ref byte pucCHMsg, ref int puiCHMsgLen, ref byte pucPHMsg, ref int puiPHMsgLen, int iIfOpen) { return SDT_ReadBaseMsg(iPortID, ref pucCHMsg, ref puiCHMsgLen, ref pucPHMsg, ref puiPHMsgLen, iIfOpen); } debugview慢慢调试 看看dll里面能接受到不最好dll返回之前再输出下结果 [DllImport("IdCardDLL/sdtapi.dll", CharSet = CharSet.Ansi, EntryPoint = "SDT_ReadBaseMsg")] private static extern int SDT_ReadBaseMsg(int iPortID, StringBuilder pucCHMsg, ref int puiCHMsgLen, StringBuilder pucPHMsg, ref int puiPHMsgLen, int iIfOpen); public unsafe static int ReadBaseMsg(int iPortID, StringBuilder pucCHMsg, ref int puiCHMsgLen, StringBuilder pucPHMsg, ref int puiPHMsgLen, int iIfOpen) { return SDT_ReadBaseMsg(iPortID, pucCHMsg, ref puiCHMsgLen, pucPHMsg, ref puiPHMsgLen, iIfOpen); } StringBuilder 改成string ,反正是参数不对个个的试 从 C# 中传递一个缓冲区到 DLL 中,用以获取数据时,需要进行托管内存与非托管内存之间的转换。1 char * 对应到 C# 为 IntPtr2 从托管内存到非托管内存的转换为:定义一个 byte[] buff,获取 IntPtr,GCHandle gc = GCHandle.Alloc(buff, GCHandleType.Pinned);IntPtr p = gc.AddrOfPinnedObject();2 从非托管内存到托管内存的转换为:Marshal.Copy(...) 系列方法其中一个 c#未处理异常问题 C#事件的简单问题。 分享自己做的学习笔记本,同时希望高手改进 救命啊,我快抓狂了。。。c# 返回参数存储过程 不能执行啊 如何让Dategridview 的列标题每行只显示5个字 Winamp中的out_disk.dll怎么引用不了? 大家都进来看看吧,高分送分题 救助 编译错误 .net编程 Server 反馈给PLC的数据 PLC 丢包 控件的 invoke是将多线程里的操作回调到主线程里操作吗? 关于static对这个理解比较深的人进来看看 关于tabControl重绘问题
int puiCHMsgLen = 1024;
StringBuilder pucCHMsg = new StringBuilder(puiCHMsgLen);
int i = ReadBaseMsg(1001, pucCHMsg, ref puiCHMsgLen, ...
我都换成了StringBuilder,仍然是空的,获取不到值,不过谢谢啦!
我已经这么写了,还是没有得到值。 [DllImport("IdCardDLL/sdtapi.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall, EntryPoint = "SDT_ReadBaseMsg")]
private static extern int SDT_ReadBaseMsg(int iPortID, ref byte pucCHMsg, ref int puiCHMsgLen, ref byte pucPHMsg, ref int puiPHMsgLen, int iIfOpen);
public unsafe static int ReadBaseMsg(int iPortID, ref byte pucCHMsg, ref int puiCHMsgLen, ref byte pucPHMsg, ref int puiPHMsgLen, int iIfOpen)
{
return SDT_ReadBaseMsg(iPortID, ref pucCHMsg, ref puiCHMsgLen, ref pucPHMsg, ref puiPHMsgLen, iIfOpen);
}
慢慢调试 看看dll里面能接受到不
最好dll返回之前再输出下结果
private static extern int SDT_ReadBaseMsg(int iPortID, StringBuilder pucCHMsg, ref int puiCHMsgLen, StringBuilder pucPHMsg, ref int puiPHMsgLen, int iIfOpen);
public unsafe static int ReadBaseMsg(int iPortID, StringBuilder pucCHMsg, ref int puiCHMsgLen, StringBuilder pucPHMsg, ref int puiPHMsgLen, int iIfOpen)
{
return SDT_ReadBaseMsg(iPortID, pucCHMsg, ref puiCHMsgLen, pucPHMsg, ref puiPHMsgLen, iIfOpen);
}
个个的试
1 char * 对应到 C# 为 IntPtr
2 从托管内存到非托管内存的转换为:
定义一个 byte[] buff,获取 IntPtr,
GCHandle gc = GCHandle.Alloc(buff, GCHandleType.Pinned);
IntPtr p = gc.AddrOfPinnedObject();
2 从非托管内存到托管内存的转换为:
Marshal.Copy(...) 系列方法其中一个