C# 引用C的DLL出错

uglywolf 2011-07-28 10:44:00
情况是这样的,我买了一块插在电脑上的CAN卡,想用C#做一个上位机程序,厂家提供了一个DLL,里面有个函数声明如下:
extern "C" void _stdcall HSCAN_InitCANDevice(unsigned char nDevice,unsigned char nPort,HSCAN_INIT *pInit);
在C#中我是这样声明的
[DllImport("HS2102API.DLL", CharSet = CharSet.Auto)]
public static extern int HSCAN_OpenCANDevice(IntPtr hWnd, UInt32 nMsg);
调用如下:
int g_iDeviceNum = HS2102CANAPI.HSCAN_OpenCANDevice(this.Handle,HS2102CANAPI.USER);//其中HS2102CANAPI.USER=0x5001
调试时出现了以下情况,F5运行没有问题,但关闭此调试窗体时,总是会出现“指令引用的***内存。该内存不能为“read”。要终止程序,请单击“确定””这样的错误。这是怎么回事呢?
...全文
187 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdl2005lyx 2011-07-28
  • 打赏
  • 举报
回复
hWnd这个窗口句柄,用完释放。。。
uglywolf 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sdl2005lyx 的回复:]
[DllImport("HS2102API.DLL",
CallingConvention=CallingConvention.Cdecl,
CharSet = CharSet.Ansi)]
public static extern int HSCAN_OpenCANDevice(IntPtr hWnd, UInt32 nMsg);
[/Quote]
我试过了,问题依旧,还是会出现同样的错误。
sdl2005lyx 2011-07-28
  • 打赏
  • 举报
回复
[DllImport("HS2102API.DLL",
CallingConvention=CallingConvention.Cdecl,
CharSet = CharSet.Ansi
)]
public static extern int HSCAN_OpenCANDevice(IntPtr hWnd, UInt32 nMsg);
uglywolf 2011-07-28
  • 打赏
  • 举报
回复
晕,刚才发错函数原型了,DLL里面定义如下:
extern "C" int _stdcall HSCAN_OpenCANDevice(HWND hWnd,UINT nMsg);
viki117 2011-07-28
  • 打赏
  • 举报
回复
名字都不一样,另外32位和64位的问题,我最近的项目就是,一个C写的库,方法全找到了,只是一调用就出错,分析了半天才知道,c库作的时候用的是32位寻址,所以...
sdl2005lyx 2011-07-28
  • 打赏
  • 举报
回复
怎么两个函数的参数个数都不相同,你难道在net这边有重写封装了?
HSCAN_InitCANDevice 与 HSCAN_OpenCANDevice,函数不一样?
py1025677845 2011-07-28
  • 打赏
  • 举报
回复
给个例子看看吧
[DllImport(@"D:\workspace\Projects\QD\Debug\QD.dll", EntryPoint = "Q2D", CallingConvention = CallingConvention.Cdecl)]
public static extern int* Q2D(double* p, int n);

uglywolf 2011-07-28
  • 打赏
  • 举报
回复
没有人帮忙了么?
uglywolf 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 skylkj 的回复:]
引用 4 楼 sdl2005lyx 的回复:
[DllImport("HS2102API.DLL",
CallingConvention=CallingConvention.Cdecl,
CharSet = CharSet.Ansi)]
public static extern int HSCAN_OpenCANDevice(IntPtr hWnd, UInt32 nMsg);


……
[/Quote]
改成你所说的我也试了,不行。
skylkj 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sdl2005lyx 的回复:]
[DllImport("HS2102API.DLL",
CallingConvention=CallingConvention.Cdecl,
CharSet = CharSet.Ansi)]
public static extern int HSCAN_OpenCANDevice(IntPtr hWnd, UInt32 nMsg);
[/Quote]

函数原型里都申明了是stdcall压栈方式,这里自然要用stdcall而不是Cdecl
sdl2005lyx 2011-07-28
  • 打赏
  • 举报
回复
估计是内存释放的问题,你仔细检查,有没有非托管内存分配,用Marshal释放,
或在C++那边写正确的释放函数:new -》delete ;malloc-》free,C#这边调用。。。。
uglywolf 2011-07-28
  • 打赏
  • 举报
回复
有个VC++的例程,它应用这个DLL没有问题。我自编的C#,还是有问题
sdl2005lyx 2011-07-28
  • 打赏
  • 举报
回复
怪了,那你用VC写个程序测试,看是否有问题。。。。
uglywolf 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 megglove 的回复:]
用depend看下,是不是缺少什么依赖文件
[/Quote]我看了看,里面一共有8个函数,和我的声明也都一样。
但只要我一利用里面的任意一个函数,在关闭窗体的时候都会报错。这事怎么回事呢
  • 打赏
  • 举报
回复
用depend看下,是不是缺少什么依赖文件
uglywolf 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sdl2005lyx 的回复:]
hWnd这个窗口句柄,用完释放。。。
[/Quote]
好像不是这个问题,这个DLL中还有其他函数,我用其他不带句柄操作的函数测试了一下,还是有类似错误。

110,567

社区成员

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

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

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