在DLL中定义一个函数返回字符串,应该声明成什么类型。
我的定义如下
这是定义的一个类的成员函数:
LPCTSTR CTransData::HeaderInfo()
{
CString lpstrInfo, str;
ReadFile();
if(m_FileHeader.DeviceID != DEVICE_NUM)
{
AfxMessageBox("此文件不能解析");
return FALSE;
}
switch(m_FileHeader.BusType)
{
case 1:
str="板卡类型:PCI ";
break;
case 2:
str="板卡类型:USB ";
break;
case 3:
str="板卡类型:ISA ";
break;
case 4:
str="板卡类型:PC104 ";
break;
}
lpstrInfo = str;
str.Format("板卡型号:%X\r\n",m_FileHeader.DeviceID);
lpstrInfo += str;
str.Format("文件头大小:%d字节\r\n", m_FileHeader.HeaderSizeBytes);
lpstrInfo += str;
str.Format("\n量程上限:%d.0mV 量程下限:%d.0mV\r\n",
m_FileHeader.VoltTopRange, m_FileHeader.VoltBottomRange );
lpstrInfo += str;
str.Format("通道数:%d\r\n",m_FileHeader.LastChannel - m_FileHeader.FirstChannel + 1);
lpstrInfo += str;
str.Format("首通道:%d 末通道:%d\r\n",m_FileHeader.FirstChannel ,m_FileHeader.LastChannel );
lpstrInfo += str;
str.Format("采样频率:%d\r\n",m_FileHeader.Frequency);
lpstrInfo += str;
return lpstrInfo;
}
导出函数:
_declspec(dllexport) LPCTSTR GetHeaderInfo(LPCTSTR lpszFileName)
{
CTransData m_TransData(lpszFileName);
return m_TransData.HeaderInfo();
}
在程序中调用时出现乱码(返回值为:葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺4),不知是什么问题。调用返回值为ULONG的没有问题。请问应该怎么解决。在线等。
问题点数:20、回复次数:11Top
1 楼Hendy_So(横笛)回复于 2005-04-03 10:25:14 得分 0
m_TransData只是个局部对象,GetHeaderInfo返回后就无效了,返回的指针指向了无效的地址。
你可以在GetHeaderInfo增加一个参数,将字符串拷贝到这个参数里。Top
2 楼xuzheng318(忧郁王子)回复于 2005-04-03 10:31:57 得分 0
楼上说得有理!Top
3 楼redkit(ChinaYan)回复于 2005-04-03 12:45:37 得分 0
嗯。局部对象的问题Top
4 楼wenhui1215()回复于 2005-04-04 21:48:37 得分 0
能不能说详细一点,我试了,如果返回CSTRING类型是可以,用LPCTSTR能不能实现Top
5 楼wenhui1215()回复于 2005-04-04 21:49:28 得分 0
能不能说详细一点,我试了,如果返回CSTRING类型是可以,用LPCTSTR能不能实现Top
6 楼wenhui1215()回复于 2005-04-04 21:49:52 得分 0
能不能说详细一点,我试了,如果返回CSTRING类型是可以,用LPCTSTR能不能实现Top
7 楼krh2001(边城浪子)回复于 2005-04-04 21:51:45 得分 5
不如返回 BSTR 类型, 给 VB用正好,跟VB的String十分兼容 :)
已知楼主用的是MFC:
这样返回:
BSTR Function(...)
{
CString str;
.....
return str.AllocSysString();
}Top
8 楼betsyalan(alan)回复于 2005-04-05 09:52:29 得分 10
局部变量的问题,你可以这样定义
LPCTSTR CTransData::HeaderInfo(LPCTSTR lpStr)
{
..
return lpStr;
}
Top
9 楼signoft(晴天)回复于 2005-04-05 10:21:56 得分 5
局部变量,出栈后变量内存被释放,所以出现乱码;
和返回什么类型的变量没有关系,如果你要返回LPCTSTR,
按照 betsyalan的方法没问题Top
10 楼signoft(晴天)回复于 2005-04-05 10:22:45 得分 0
或者使用引用也可以Top
11 楼e_bird_winki001()回复于 2005-04-27 15:14:21 得分 0
是局部变量被释放的问题!
解决方法:
1,将lpstrInfo设置为全局变量
2,用CString 作为返回类型(保证内存不被释放)
3,把lpstrInfo 放到一个缓冲区中返回:char buf[1024];strcpy(buf,lpstrInfo.GetBuffer(0));return buf;
4,采用引用
ok!!!Top




