C#调用C++写的DLL的问题,急急急!

duoxiangliuti 2011-06-09 10:46:15
C++的头文件定义如下:
//读输入寄存器
DWORD __stdcall ZMB_ReadInputReg( HANDLE hand,
BYTE serID,
int nStart,
int nCount,
WORD * bRet/*arr of reg*/,
WORD TranID);

C#中我是下面这样写的:
//读输入寄存器,读AI
[DllImport("ZModbusSdk.dll")]
static extern UInt32 ZMB_ReadInputReg(UInt32 hand,
byte serID,
int nStart,
int nCount,
ref short bRet,
ushort TranID);

调用时我是这么用的:
short tem = 0;
ZMB_ReadInputReg(hand, 3, 0x40, 1, ref tem, 0)


程序运行不了多久会出现错误,当我把调用的这句代码注释掉后,就不会出现错误了。
...全文
222 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
duoxiangliuti 2011-06-13
  • 打赏
  • 举报
回复
一周了,问题依然没有找到答案,快疯了!
duoxiangliuti 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 ghost5216 的回复:]
引用 20 楼 duoxiangliuti 的回复:
还是无答案!

[DllImport("ZModbusSdk.dll")]
static extern UInt32 ZMB_ReadInputReg(IntPtr hand,
byte serID,
int nStart,
int nCount,
ushort[] bRet,
ushort TranI……
[/Quote]
ushort[] bRet这里调用时怎么写啊?
duoxiangliuti 2011-06-13
  • 打赏
  • 举报
回复
问题已经解决,原来的代码没有任何问题,DLL的问题,厂家的DLL更新了。还是要谢谢各位的鼎力帮助!
ghost5216 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 duoxiangliuti 的回复:]
引用 21 楼 ghost5216 的回复:
引用 20 楼 duoxiangliuti 的回复:
还是无答案!

[DllImport("ZModbusSdk.dll")]
static extern UInt32 ZMB_ReadInputReg(IntPtr hand,
byte serID,
int nStart,
int nCount,
ushort[] bRet,
……
[/Quote]
ushort[] bRet= new ushort[10];//你自己指定长度/*arr of reg*/,

ReadInputReg(hand,serId,nStart,nCount,bRet,.......);
ghost5216 2011-06-11
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 duoxiangliuti 的回复:]
还是无答案!
[/Quote]
[DllImport("ZModbusSdk.dll")]
static extern UInt32 ZMB_ReadInputReg(IntPtr hand,
byte serID,
int nStart,
int nCount,
ushort[] bRet,
ushort TranID);
kobe_24 2011-06-10
  • 打赏
  • 举报
回复
DWORD 可以用UINT试试
sw324073442 2011-06-10
  • 打赏
  • 举报
回复
遇到不行的参数,可以试试用byte数组,我们项目中也总是遇到这种C++ 库调用的,什么StringBuilder都没用,遇到char*的用byte数组。 Word类型还真不清楚。等高手~~
duoxiangliuti 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 mjp1234airen4385 的回复:]
有c++的demo最好贴出来看看。
[/Quote]
以前C++是这样调用的:
ZMB_ReadInputReg(m_hEthMaster,3,0x40,1,&temp,0);

没有出过错!
大侠们来帮帮忙啊!
duoxiangliuti 2011-06-10
  • 打赏
  • 举报
回复
还是无答案!
duoxiangliuti 2011-06-10
  • 打赏
  • 举报
回复
大家都不要纠结在数据类型的问题上了,如果数据类型错了,那程序一开始不就错了,也不会运行正常一段时间后才报错。
现在我换了一台电脑来调试,现在不会弹出出错的对话框,只是程序自动退出,只是怎么回事啊!
flyerwing 2011-06-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bdmh 的回复:]
WORD无符号数,你的ref short 是有符号数,可能某个时刻数据范围不符合了
[/Quote]
估计是了
isjoe 2011-06-09
  • 打赏
  • 举报
回复

上面的错了,,需要加上[],另外你也可以采用动态分配该指针的大小,然后封送一个Intptr类型
不过,编码复杂了。

//读输入寄存器,读AI
[DllImport("ZModbusSdk.dll")]
static extern UInt32 ZMB_ReadInputReg(UInt32 hand,
byte serID,
int nStart,
int nCount,
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 这里初始化大小)]
ref short[] bRet,
ushort TranID);


isjoe 2011-06-09
  • 打赏
  • 举报
回复
你必须明确该指针的大小



//读输入寄存器,读AI
[DllImport("ZModbusSdk.dll")]
static extern UInt32 ZMB_ReadInputReg(UInt32 hand,
byte serID,
int nStart,
int nCount,
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 这里初始化大小)]
ref short bRet,
ushort TranID);


ghost5216 2011-06-09
  • 打赏
  • 举报
回复
[DllImport("ZModbusSdk.dll")]
static extern UInt32 ZMB_ReadInputReg(IntPtr hand,
byte serID,
int nStart,
int nCount,
ref ushort bRet,
ushort TranID);

kingdom_0 2011-06-09
  • 打赏
  • 举报
回复


//读输入寄存器,读AI
[DllImport("ZModbusSdk.dll")]
static extern UInt32 ZMB_ReadInputReg(UInt32 hand, byte serID, int nStart, int nCount, ref short bRet, short TranID);


bdmh 2011-06-09
  • 打赏
  • 举报
回复
WORD无符号数,你的ref short 是有符号数,可能某个时刻数据范围不符合了
风骑士之怒 2011-06-09
  • 打赏
  • 举报
回复
错误信息来,
duoxiangliuti 2011-06-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lovesongforever 的回复:]
http://www.cnblogs.com/sunrack/articles/871257.html

对照数据类型多试几次。
[/Quote]这个跟数据类型没有关系吧!如果有错的话,一开始执行就应该报错了,不会执行一段时间才会出现错误。
mjp1234airen4385 2011-06-09
  • 打赏
  • 举报
回复
有c++的demo最好贴出来看看。
garfieldzf 2011-06-09
  • 打赏
  • 举报
回复
http://www.cnblogs.com/sunrack/articles/871257.html

对照数据类型多试几次。
加载更多回复(5)

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧