读书人

DllImport紧急求救-

发布时间: 2012-01-01 23:10:55 作者: rapoo

DllImport紧急求救---在线等
各位大侠,帮小弟一个忙吧,着急呀,我现在作软件和硬件接口那呢,现在的困难是我们买了一个 IC卡读卡器,厂商给我们提供了一个 Dll库,一个文档,我现在要调用 Dll库中的一个函数,文档中是这样说明这个函数的

/*
功能:查询是否有卡在天线区
参数:nMode:查询方式 缺省可以置 0;系统自动以QUERY_ALL方式查询
0x52 为QUERY_ALL;
0x26 为QUERY_IDLE
pszData:接收数据缓冲,格式:第一个字节为状态
其后的字节为卡类型 0x01 Mifare Light 0x04 Mifare Ultra Light
0x08 Mifare Standard S50 0x10 Mifare Plus S70
后面两个字节为卡片的ATQ
后面的四个字节为查到的卡号
如果没有查到卡则只有状态位
返回:返回的数据长度,如果为0xFE、0xFF则表示通讯失败
*/
unsigned char WINAPI QueryRFCard(HANDLE handlePort,unsigned char nMode,unsigned char *pszData);

我在C#里声明这个函数的时候是这样写的

/// <summary>
/// 功能:查询是否有卡在天线区
/// </summary>
/// <param name= "handlePort "> HANDLE handlePort 逻辑通道号 </param>
/// <param name= "nMode "> unsigned char nMode:查询方式 缺省可以置 0;系统自动以QUERY_ALL方式查询 ::::0x52 为QUERY_ALL;0x26 为QUERY_IDLE </param>
/// <param name= "pszData "> unsigned char *pszData:接收数据缓冲,格式:第一个字节为状态
/// 其后的字节为卡类型 0x01 Mifare Light 0x04 Mifare Ultra Light
/// 0x08 Mifare Standard S50 0x10 Mifare Plus S70
/// 后面两个字节为卡片的ATQ
/// 后面的四个字节为查到的卡号
/// 如果没有查到卡则只有状态位 </param>
/// <returns> 返回类型为unsigned char 返回: 返回的数据长度,如果为0xFE、0xFF则表示通讯失败 </returns>
[DllImport( "JzCard.dll " ,EntryPoint= "QueryRFCard ", CallingConvention=CallingConvention.Winapi)]
public static extern int QueryRFCard(long handlePort, uint nMode, [MarshalAs(UnmanagedType.LPStr)]string pszData);

结果运行的时候报这个错误

对 PInvoke 函数“ICCardReader!ICCardReader.CardReader.CardReader::QueryRFCard”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。



参数个数是对的,我估计就是从类型上有问题,请问怎么解决呀?谢谢了!

[解决办法]
[DllImport( "JzCard.dll " ,EntryPoint= "QueryRFCard ", CallingConvention=CallingConvention.Winapi)]
public static extern int QueryRFCard(integer handlePort, uint nMode, [MarshalAs(UnmanagedType.LPStr)]string pszData);

[解决办法]
试试换成integer,好像在C#里面的long和C++里面的long是不一样的
[解决办法]
应该这么写
[DllImport( "JzCard.dll " ,EntryPoint= "QueryRFCard ", CallingConvention=CallingConvention.Winapi)]
public static extern Int32 QueryRFCard(Int32 handlePort, Byte nMode, Byte[] pszData);

pszData在调用前应该先分配好地址。

[解决办法]
HANDLE一般就是一个32位的整型数据,用Int32/UInt32/IntPtr都可以。
unsigned char应该用byte而不是UInt,否则压栈的数据就不正确了
pszData我认为是一个调用者创建,被调用者写的内存块,用Byte[]表示最合适,看说明好像也是一个字节一个字节判断意义的。

可以参考一下
http://blog.csdn.net/Mittermeyer/archive/2007/04/27/1586867.aspx

读书人网 >C#

热点推荐