问题是这样的:
我在VS2005中开发,会用到外部DLL中提供的一个接口,如下(外部DLL中某个类的成员函数):
GetName(CString &str)引用方式1:
CString temp;
p->GetName(temp);<---  报错的都是这一行  
结果:无论是Debug还是Release版,都报如下错误:
HEAP[Test.exe]:   Invalid   Address   specified   to   RtlFreeHeap
如果选择继续,GetName()能正确返回结果.引用方式2:
CString temp("");
p->GetName(temp);<---  报错的都是这一行 
同上面情况一样引用方式3:
CString temp("1");
p->GetName(temp);<---  报错的都是这一行 
同上面情况一样引用方式4:
CString temp("11");
p->GetName(temp);
这样就没问题了,无论是在Debug中执行还是在release中执行都正常.上面的p指针都是正确初始化了的
高手指教啊!!! 搞了两三天了,一点头绪都没有

解决方案 »

  1.   

    跨DLL,要保证哪里申请,哪里删除。
    所以,不要传CString的引用进去。
    改成:GetName(const CString &str)
      

  2.   

    微软api处理这类问题都是使用buffer pointer + buffer size我觉得在这里使用CString作为输入引用麻烦多多.
    还是换成最简单的WCHAR buffer 吧.
      

  3.   

    CString最好不要用作函数的参数,因为它本身是变长的变量,长度是不固定的,会有很多隐患。
    切忌!
      

  4.   

    谢谢楼上各位的回复,万分感谢。可是我用的DLL就别人写好的,没法改。对于为什么初始化成长度大于2人串之后就没有问题了,大家有没有什么看法?
      

  5.   

    首先,传递CSTRING类型的参数没有问题,但是不建议这么做,因为传递效率很低,而且无法跨语言
    其次,估计你的这个报错是在GetName内部
      

  6.   

    是还没进入GetName出错还是里面代码出错?
      

  7.   

    是不是BSTR啊,前两个字节存长度。
      

  8.   

    是不是他编译的时候是unicode的,而你不是,你加个unicode参数试试
      

  9.   

    DLL要用基本数据类型如char、wchar_t、BSTR等等,不能用CString,CString是MFC的一个类。给你举个例子如果你用一个VB的程序调用DLL你可能传CString类型么?VB根本就不认识啊!