定义写函数
extern "C" __int16 __stdcall writecard(int icDev,UCHAR *cardNo)
{
if(icDev!=514) return error_comp;  //错误厂商 CString strfirst,strfun,strprice,stramount,strmoney;
UCHAR buf[128];
UCHAR a;
a=cardNo[0]*16+cardNo[1];
buf[0]=a;
a=cardNo[2]*16+cardNo[3];
buf[1]=a;
a=cardNo[4]*16+cardNo[5];
buf[2]=a;
a=cardNo[6]*16+cardNo[7];
buf[3]=a;
swr_24c01a(0,0,4,buf); return 0;
}
编辑未报错,调试报access violation UpdateData(true);
int ret=writecard(514,(UCHAR *)m_cardsn.GetBuffer(0));
if(ret!=0)
{
AfxMessageBox("写卡失败");
}m_cardsn为cstring类型

解决方案 »

  1.   

    你这个函数很容易出问题啊。安全检查都没有。指针直接就拿来用了。你应该先判断cardNo是否为空,然后其长度是否为8,否则很容易爆掉。
    或者int ret=writecard(514,(UCHAR *)m_cardsn.GetBuffer(0));之前判断m_cardsn串的长度不小于8
      

  2.   

    (UCHAR *)m_cardsn.GetBuffer(0)
    改成,(UCHAR *)(LPCTSTR)m_cardsn 看看
      

  3.   

    m_cardsn.GetBuffer(0) 没有开辟内存空间,writecard直接操作这些内存肯定报错。也不确保m_cardsn开辟的空间足够供writecard操作
      

  4.   

    楼上正解,要给m_cardsn.GetBuffer(0)开辟一段空间
      

  5.   

    m_cardsn有内容么?
    不要用GetBuff
    直接传m_cardsn试一下
    或者声明一个UCHAR数组然后把字符串拷过去
      

  6.   

    1、要检查m_cardsn的长度及内容是否符合要求;
    2、GetBuffer用完后需要ReleaseBuffer,对于读取操作最好不要用GetBuffer,可以把参数定义为const char*类型,直接传CString变量。
    3、从你的代码来看,貌似是输入卡号,经过处理后传给另一函数。需要注意,输入的内容是字符串而不是数值,如果要使用数值则需要转换一下,0~9这10个数字对应的字符值是0x30~0x39,字符值减去0x30就是对应的数值。
      

  7.   

    m_cardsn是从窗体上UpdateData(true)得到的,不会超过8
      

  8.   

    这是细节问题,以后会加判断的.m_cardsn长度是等于8的
      

  9.   

    m_cardsn.GetBuffer(0) 没有开辟内存空间,writecard直接操作这些内存肯定报错。???如何开辟存在空间
      

  10.   

    lz的这个函数writecard(int icDev,UCHAR *cardNo),最好加个参数,指明UCHAR[]的长度
    __int16 __stdcall writecard(int icDev,UCHAR *cardNo, int len);
      

  11.   

    谢谢各位,是我的cardsn转化过程中出的错,长度不等于8了