C#读取外部DLL中的CString型的变量只能读取最前一位,怎么办 本帖最后由 qufusongyu 于 2011-08-20 11:07:15 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 先试试StringBuilder接收,不行用byte[],再不行就用unsafe code...还不行就得改C++ DLL或者再加一层wrapper了...用CString这种MFC类型做接口就是吃饱了专门找事儿的... void CDemoCardDlg::OnOK() { // TODO: Add extra validation here// UpdateData(TRUE); m_cardstate = _T(""); m_cardno = _T(""); m_cardclose = _T(""); m_device = _T(""); m_port = _T(""); m_deviceno = _T(""); int ret=0; CString cardno,cardinfo; ret=LQPORT_open(); if(ret==1) m_port = _T("打开设备成功"); else { m_port = _T("打开设备失败!!"); goto end; } ret=LQCheckReader(); if(ret==1) m_device = _T("合法设备"); else { m_device = _T("非法设备!!"); goto out; } ret=LQCheck_Card(); if(ret==0) { m_cardstate = _T("新卡!!"); goto out; } else if(ret==1) { m_cardstate = _T("已初始化"); goto out; } else if(ret==2) { m_cardstate = _T("卡已发行"); } else if(ret==3) { m_cardstate = _T("卡未初始化"); goto out; } else if(ret==4) { m_cardstate = _T("非法卡"); goto out; } else if(ret==5) { m_cardstate = _T("非识别卡"); goto out; } else if(ret==6) { m_cardstate = _T("卡密码有误"); goto out; } else if(ret==7) { m_cardstate = _T("卡已损坏"); goto out; } else if(ret==8) { m_cardstate = _T("无卡"); goto out; } else if(ret==9) { m_cardstate = _T("旧卡"); goto out; } else { m_cardstate = _T("异常卡"); goto out; }// 0--新卡 1--此卡已初始化 2---此卡已发行 3---此卡未初始化 4---此卡为非法卡 5---此卡为非识别卡// 6---此卡密码有误 7--此卡已损坏 8--无卡 9---旧卡 // 其它--异常卡 cardinfo=LQRead_Card_Info(); m_deviceno = cardinfo; cardno=LQGetCardNO(); m_cardno=cardno;out: ret=LQCPORT_close(); if(ret==0) m_cardclose = _T("设备关闭成功"); else m_cardclose = _T("设备关闭失败"); end: UpdateData(FALSE); // CDialog::OnOK(); return;}void CDemoCardDlg::OnCancel() { // TODO: Add extra cleanup here CDialog::OnCancel();} 楼主,我要你发“private static extern string LQRead_Card_Info(); //读卡信息”这个函数的C++定义,你贴出那么多干什么? LQDKQDLL BSTR LQRead_Card_Info();//读卡信息//返回 卡信息LQDKQDLL BSTR LQRead_Device_Num();//读设备编号//返回 设备编号LQDKQDLL BSTR LQGetCardNO();//获取读卡号//返回 卡号LQDKQDLL BSTR LQGetOldInfo();//获取就卡信息//返回旧卡信息LQDKQDLL BSTR LQGetUSERID();//获取用户ID//返回用户IDLQDKQDLL BSTR LQGetresult();//获取结果 MFC里CString只有一个成员class CString{ char* m_pStr;}其实CString就是个char*,但是这个char*指向的字符串不一定是以'\0'结尾的,所以传递的时候肯定有问题 厂家改成char * WINAPI LQRead_Card_Info();//读卡信息替换了DLL,现在就好了.谢谢大家了 感性的人就真的不适合编程? 这个是我用C#写的发送电子邮件的程序代码,怎么老是报以下异常啊? C# winfrom 问题 关于Word文档的操作问题 脚本问题 急!!!! 线程问题 窗体被最大化时的问题 数据结构单链表倒置问题 程序设计 —— 分层 windows 中的 datagrid 问题 有关线程循环,等待,调用的问题??在线等待 [求助]如何让DataGridView像Excel一样点击列标题选中一列 .net和java如何选择?
{
// TODO: Add extra validation here
// UpdateData(TRUE);
m_cardstate = _T("");
m_cardno = _T("");
m_cardclose = _T("");
m_device = _T("");
m_port = _T("");
m_deviceno = _T("");
int ret=0;
CString cardno,cardinfo;
ret=LQPORT_open();
if(ret==1)
m_port = _T("打开设备成功");
else
{
m_port = _T("打开设备失败!!");
goto end;
} ret=LQCheckReader();
if(ret==1)
m_device = _T("合法设备");
else
{
m_device = _T("非法设备!!");
goto out;
}
ret=LQCheck_Card();
if(ret==0)
{
m_cardstate = _T("新卡!!");
goto out;
}
else if(ret==1)
{
m_cardstate = _T("已初始化");
goto out;
}
else if(ret==2)
{
m_cardstate = _T("卡已发行");
}
else if(ret==3)
{
m_cardstate = _T("卡未初始化");
goto out;
}
else if(ret==4)
{
m_cardstate = _T("非法卡");
goto out;
}
else if(ret==5)
{
m_cardstate = _T("非识别卡");
goto out;
}
else if(ret==6)
{
m_cardstate = _T("卡密码有误");
goto out;
}
else if(ret==7)
{
m_cardstate = _T("卡已损坏");
goto out;
}
else if(ret==8)
{
m_cardstate = _T("无卡");
goto out;
}
else if(ret==9)
{
m_cardstate = _T("旧卡");
goto out;
}
else
{
m_cardstate = _T("异常卡");
goto out;
}
// 0--新卡 1--此卡已初始化 2---此卡已发行 3---此卡未初始化 4---此卡为非法卡 5---此卡为非识别卡
// 6---此卡密码有误 7--此卡已损坏 8--无卡 9---旧卡
// 其它--异常卡
cardinfo=LQRead_Card_Info();
m_deviceno = cardinfo;
cardno=LQGetCardNO();
m_cardno=cardno;
out:
ret=LQCPORT_close();
if(ret==0)
m_cardclose = _T("设备关闭成功");
else
m_cardclose = _T("设备关闭失败");
end:
UpdateData(FALSE);
// CDialog::OnOK();
return;
}void CDemoCardDlg::OnCancel()
{
// TODO: Add extra cleanup here
CDialog::OnCancel();
}
这个函数的C++定义,你贴出那么多干什么?
LQDKQDLL BSTR LQRead_Card_Info();//读卡信息
//返回 卡信息
LQDKQDLL BSTR LQRead_Device_Num();//读设备编号
//返回 设备编号
LQDKQDLL BSTR LQGetCardNO();//获取读卡号
//返回 卡号
LQDKQDLL BSTR LQGetOldInfo();//获取就卡信息
//返回旧卡信息
LQDKQDLL BSTR LQGetUSERID();//获取用户ID
//返回用户ID
LQDKQDLL BSTR LQGetresult();//获取结果
class CString{
char* m_pStr;
}
其实CString就是个char*,但是这个char*指向的字符串不一定是以'\0'结尾的,所以传递的时候肯定有问题
char * WINAPI LQRead_Card_Info();//读卡信息替换了DLL,现在就好了.谢谢大家了