C#读取外部DLL中的CString型的变量只能读取最前一位,怎么办

qufusongyu 2011-08-20 11:05:12
我用C#是这样封装的
[DllImport(@"Lqdkqdll.dll", EntryPoint = "LQRead_Card_Info", SetLastError = true)]
private static extern string LQRead_Card_Info(); //读卡信息

但是用VC就可以读取
CString cardno,cardinfo;
VC是用的CString类型

C#读取外部DLL中的CString型的变量只能读取最前一位,怎么办
...全文
100 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qufusongyu 2011-08-21
  • 打赏
  • 举报
回复
厂家改成
char * WINAPI LQRead_Card_Info();//读卡信息

替换了DLL,现在就好了.

谢谢大家了
Icedmilk 2011-08-20
  • 打赏
  • 举报
回复
MFC里CString只有一个成员
class CString{
char* m_pStr;
}
其实CString就是个char*,但是这个char*指向的字符串不一定是以'\0'结尾的,所以传递的时候肯定有问题
qufusongyu 2011-08-20
  • 打赏
  • 举报
回复

LQDKQDLL BSTR LQRead_Card_Info();//读卡信息
//返回 卡信息
LQDKQDLL BSTR LQRead_Device_Num();//读设备编号
//返回 设备编号
LQDKQDLL BSTR LQGetCardNO();//获取读卡号
//返回 卡号
LQDKQDLL BSTR LQGetOldInfo();//获取就卡信息
//返回旧卡信息
LQDKQDLL BSTR LQGetUSERID();//获取用户ID
//返回用户ID
LQDKQDLL BSTR LQGetresult();//获取结果
sdl2005lyx 2011-08-20
  • 打赏
  • 举报
回复
楼主,我要你发“private static extern string LQRead_Card_Info(); //读卡信息”
这个函数的C++定义,你贴出那么多干什么?
qufusongyu 2011-08-20
  • 打赏
  • 举报
回复
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();
}
vrhero 2011-08-20
  • 打赏
  • 举报
回复
先试试StringBuilder接收,不行用byte[],再不行就用unsafe code...还不行就得改C++ DLL或者再加一层wrapper了...

用CString这种MFC类型做接口就是吃饱了专门找事儿的...
sdl2005lyx 2011-08-20
  • 打赏
  • 举报
回复
楼主,你把C++的函数原型贴出,看看是什么问题。。。

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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