又是一个函数问题

chuting1 2010-05-04 05:09:20
定义写函数
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类型
...全文
214 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
chuting1 2010-05-05
  • 打赏
  • 举报
回复
谢谢各位,是我的cardsn转化过程中出的错,长度不等于8了
Eleven 2010-05-05
  • 打赏
  • 举报
回复
lz的这个函数writecard(int icDev,UCHAR *cardNo),最好加个参数,指明UCHAR[]的长度
__int16 __stdcall writecard(int icDev,UCHAR *cardNo, int len);
chuting1 2010-05-05
  • 打赏
  • 举报
回复
m_cardsn.GetBuffer(0) 没有开辟内存空间,writecard直接操作这些内存肯定报错。

???如何开辟存在空间
chuting1 2010-05-05
  • 打赏
  • 举报
回复
这是细节问题,以后会加判断的.m_cardsn长度是等于8的
jyh_baoding 2010-05-05
  • 打赏
  • 举报
回复
是的,上面说的有道理
快乐鹦鹉 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chuting 的回复:]
m_cardsn是从窗体上UpdateData(true)得到的,不会超过8
[/Quote]
那可能少于8个啊,你必须不少于8个
chuting1 2010-05-05
  • 打赏
  • 举报
回复
m_cardsn是从窗体上UpdateData(true)得到的,不会超过8
cnzdgs 2010-05-04
  • 打赏
  • 举报
回复
1、要检查m_cardsn的长度及内容是否符合要求;
2、GetBuffer用完后需要ReleaseBuffer,对于读取操作最好不要用GetBuffer,可以把参数定义为const char*类型,直接传CString变量。
3、从你的代码来看,貌似是输入卡号,经过处理后传给另一函数。需要注意,输入的内容是字符串而不是数值,如果要使用数值则需要转换一下,0~9这10个数字对应的字符值是0x30~0x39,字符值减去0x30就是对应的数值。
向立天 2010-05-04
  • 打赏
  • 举报
回复
m_cardsn有内容么?
不要用GetBuff
直接传m_cardsn试一下
或者声明一个UCHAR数组然后把字符串拷过去
尹成 2010-05-04
  • 打赏
  • 举报
回复
楼上正解,要给m_cardsn.GetBuffer(0)开辟一段空间
aa3000 2010-05-04
  • 打赏
  • 举报
回复
m_cardsn.GetBuffer(0) 没有开辟内存空间,writecard直接操作这些内存肯定报错。

也不确保m_cardsn开辟的空间足够供writecard操作
13880079673 2010-05-04
  • 打赏
  • 举报
回复
(UCHAR *)m_cardsn.GetBuffer(0)
改成,(UCHAR *)(LPCTSTR)m_cardsn 看看
快乐鹦鹉 2010-05-04
  • 打赏
  • 举报
回复
你这个函数很容易出问题啊。安全检查都没有。指针直接就拿来用了。你应该先判断cardNo是否为空,然后其长度是否为8,否则很容易爆掉。
或者int ret=writecard(514,(UCHAR *)m_cardsn.GetBuffer(0));之前判断m_cardsn串的长度不小于8

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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