让俺崩溃的CString,该怎么解决
让俺崩溃的CString
是酱紫的:
我的一个com组件里有一个类A,A包含了一个类B的对象b,用来实现一些功能,类A,B的.h, .cpp文件都在com组件里。
其中A有一个成员函数如下:
int A::Set(CString strName)
{
m_b.Set(strName);
return 0;
}
B中,有一个成员函数:
int B::Set(CString strName)
{
m_strName = strName;
}
其中m_strName是B的一个成员变量
如上,一切工作正常!
但是,由于俺个人人力无法抗拒的原因,现在要把B抽出来,以一个MFC扩展dll导出类的形式来使用B(我承认这完全是吃饱了撑得,人力不可抗啊……),如下是导出类头文件的形式
//B.h
...
class AFX_EXT_CLASS B
{
........
........
}
...
//B.cpp略
然后在A中定义一个B的对象,进行使用(当然该使用的B的.h, lib文件, dll文件都设好了)
现在问题来了
当我接连两次调用A::Set(...)的时候,第一次正常,第二次时就会异常,我调试跟踪,发现是在B的Set()中
m_strName = strName;
时,似乎是m_strName要首先释放之前的空间,释放的时候出的异常;
但是如果是如下形式给m_strName赋值,就不会发生问题
char* p = char[100]; // 100 仅示意
//然后将strName的内容copy到p空间中,接着
m_strName = p;
这样不会出任何问题
我还试过在B:Set(...)中使用如下的代码
{
CString strTemp = _T( "test ");
m_strName = strTemp; // 同样的第二次调用时异常
}
及
{
m_strTemp = _T( " test "); // 怎么调用都正常
}
此外,还有另一种情形也会出同样的异常,我在dll的B的一个成员函数里new 了一个CString strName,将strName的指针传给A,在A中释放:delete (CString*)lparam,同样的异常会出现……
以上只是一个简化,实际情形复杂的多,但是由于XXX的因素, 无法把代码贴出来……
我也曾以最简单的形式,以MFC扩展dll导出类的形式建立工程,实现如上的Set功能,只是为了看连续两次Set是否会出异常,但是一切正常,俺彻底晕菜啦……和几个人整了一天也不清楚为什么……
说了这么多,恐怕还是没叙述清楚,俺只想知道这是为虾米啊,是否有大侠遇到过类似情形,俺欲哭无泪啊……
------解决方案--------------------
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_MFCNOTES_TN058.asp
------解决方案--------------------
写的真复杂,是不是理理思路再写啊,看的眼晕~
------解决方案--------------------
查查以前的帖子
------解决方案--------------------
http://msdn2.microsoft.com/en-us/library/ms174286(VS.80).aspx
------解决方案--------------------
不要尝试传递CString
它不是一个基本的win32数据类型,而是MFC中一个类.
不同模块中传递字符串,使用最基本的 char* 或者 w_char*
------解决方案--------------------
为什么不考虑使用BSTR?
------解决方案--------------------
对,跨模块传字符串用BSTR
------解决方案--------------------
跨模块传递字符串要用基本类型或者bstr,不要用类,不然你会哭的很惨的。
是酱紫的:
我的一个com组件里有一个类A,A包含了一个类B的对象b,用来实现一些功能,类A,B的.h, .cpp文件都在com组件里。
其中A有一个成员函数如下:
int A::Set(CString strName)
{
m_b.Set(strName);
return 0;
}
B中,有一个成员函数:
int B::Set(CString strName)
{
m_strName = strName;
}
其中m_strName是B的一个成员变量
如上,一切工作正常!
但是,由于俺个人人力无法抗拒的原因,现在要把B抽出来,以一个MFC扩展dll导出类的形式来使用B(我承认这完全是吃饱了撑得,人力不可抗啊……),如下是导出类头文件的形式
//B.h
...
class AFX_EXT_CLASS B
{
........
........
}
...
//B.cpp略
然后在A中定义一个B的对象,进行使用(当然该使用的B的.h, lib文件, dll文件都设好了)
现在问题来了
当我接连两次调用A::Set(...)的时候,第一次正常,第二次时就会异常,我调试跟踪,发现是在B的Set()中
m_strName = strName;
时,似乎是m_strName要首先释放之前的空间,释放的时候出的异常;
但是如果是如下形式给m_strName赋值,就不会发生问题
char* p = char[100]; // 100 仅示意
//然后将strName的内容copy到p空间中,接着
m_strName = p;
这样不会出任何问题
我还试过在B:Set(...)中使用如下的代码
{
CString strTemp = _T( "test ");
m_strName = strTemp; // 同样的第二次调用时异常
}
及
{
m_strTemp = _T( " test "); // 怎么调用都正常
}
此外,还有另一种情形也会出同样的异常,我在dll的B的一个成员函数里new 了一个CString strName,将strName的指针传给A,在A中释放:delete (CString*)lparam,同样的异常会出现……
以上只是一个简化,实际情形复杂的多,但是由于XXX的因素, 无法把代码贴出来……
我也曾以最简单的形式,以MFC扩展dll导出类的形式建立工程,实现如上的Set功能,只是为了看连续两次Set是否会出异常,但是一切正常,俺彻底晕菜啦……和几个人整了一天也不清楚为什么……
说了这么多,恐怕还是没叙述清楚,俺只想知道这是为虾米啊,是否有大侠遇到过类似情形,俺欲哭无泪啊……
------解决方案--------------------
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_MFCNOTES_TN058.asp
------解决方案--------------------
写的真复杂,是不是理理思路再写啊,看的眼晕~
------解决方案--------------------
查查以前的帖子
------解决方案--------------------
http://msdn2.microsoft.com/en-us/library/ms174286(VS.80).aspx
------解决方案--------------------
不要尝试传递CString
它不是一个基本的win32数据类型,而是MFC中一个类.
不同模块中传递字符串,使用最基本的 char* 或者 w_char*
------解决方案--------------------
为什么不考虑使用BSTR?
------解决方案--------------------
对,跨模块传字符串用BSTR
------解决方案--------------------
跨模块传递字符串要用基本类型或者bstr,不要用类,不然你会哭的很惨的。