首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

DllImport紧急求救-

2012-01-01 
DllImport紧急求救---在线等各位大侠,帮小弟一个忙吧,着急呀,我现在作软件和硬件接口那呢,现在的困难是我

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

热点排行