我的函数、简单的写一下
extern "C" int Trans( const char *Sentence1,  CString& Sentence2)
{
 CString  myString="";
 .....
Sentence2 = myString;
return 1; }在这里  Sentence2 = myString;总是出错、为什么?
CString  myString="";把myString 变为全局变量也不行。

解决方案 »

  1.   

    Invalid Address specified to RtlValidateHeap( 01080000, 006118C8 )
    我的函数是Dll函数。
      

  2.   

    我调试了一下你的代码,在我这没有什么问题,你的代码没错,就看你的调用Trans的地方有没有问题了
      

  3.   

    NTDLL! 7c941230()
    NTDLL! 7c9acd80()
    NTDLL! 7c9a0af8()
    KERNEL32! 7c85e7af()
    _CrtIsValidHeapPointer(const void * 0x006118e8 int * _afxInitData) line 1697
    _free_dbg_lk(void * 0x006118e8 int * _afxInitData, int 0x00000001) line 1044 + 9 bytes
    _free_dbg(void * 0x006118e8 int * _afxInitData, int 0x00000001) line 1001 + 13 bytes
    operator delete(void * 0x006118e8 int * _afxInitData) line 351 + 11 bytes
    CString::FreeData() line 146 + 15 bytes
    CString::Release() line 157
    CString::AllocBeforeWrite(int 0x00000003) line 200
    CString::AssignCopy(int 0x00000003, const char * 0x01087a1c) line 315
    CString::operator=(const char * 0x01087a1c) line 346
    堆栈信息
    主程序调用函数int ReadFile(const TCHAR  *filename )
    {
    .......
    CString strMorph="";
    Trans( m_strGenbun, strMorph);
    }
      

  4.   

    void CCStringDlg::OnButton1() 
    {
    CString  str1= "这是初值";
        Function(str1);
    AfxMessageBox(str1);

    }void CCStringDlg::Function(CString &str)
    {
        CString  ss = "AAAAAAA";
    str = ss;}
      

  5.   

    如果你是dll调用,记得要在函数开头加上
    AFX_MANAGE_STATE(AfxGetStaticModuleState()) ;
    如下:
    ///////////////////////////////////////////////////////////////////
    extern "C" int Trans( const char *Sentence1,  CString& Sentence2)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState()) ;
     CString  myString="";
     .....
    Sentence2 = myString;
    return 1; }
      

  6.   

    调用之前试试这个,分配足够的内存。
    CString::AllocBuffer(int nLen);
      

  7.   

    是不是变量在不同的地址空间、引用就不能进行?
    问题就出在Sentence2上
      

  8.   

    这个原因是发生在  Sentence2.release()时候它的大小为-1。
    但是调用它的时候已经赋值为""了。为什么呢?多谢各位指点!
      

  9.   

    我的目的主要是想用dll函数返回一个Cstring 类型的结果。上面方法如果不行、还有什么别的方法呢?
      

  10.   

    哪位老大给个传字符串的Dll函数的例子。
    用 char * 传回字符串、要定义一个全局变量、每次字符串大小不一定、大的话就太浪费了。
      

  11.   

    因该没有问题才对。是不是myString的值到最后都没有更改?另外,用指针试试呢。还有一个办法:
    extern "C" int Trans( const char *Sentence1,  char** Sentence2)
    {
     CString  myString="";
     .....
     *Sentence2 = new char [myString.GetLength()];
     strcpy (*Senetence2, myString);
    return 1; }
    然后在函数调用后把值赋给一个CString对象。对了,记得delete。
      

  12.   

    extern "C" int Trans( const char *Sentence1,  char*& Sentence2)
    {
     CString  myString="";
     .....
     Sentence2 = (char*)GlobalAlloc(GHND,myString.GetLength());
     strcpy (Senetence2, LPCTSTR (myString));
    return 1; }
    调用完成后GlobalFree();
      

  13.   

    你的工程是用Regular MFC dll,还是Extend MFC dll????
    如果是前者,好象应该没什么问题吧,函数开头加上
    AFX_MANAGE_STATE(AfxGetStaticModuleState()) ;
      

  14.   

    用的是Regular MFC dll、我是问在那里释放内存?不好意思、我很菜!
    AFX_MANAGE_STATE(AfxGetStaticModuleState()) ;加和不加好像没有什么区别吧!我没有调用什么资源。
      

  15.   

    从你给出的CallStack来看,传进来的Sentence2对象有问题。看看是怎么传的。Sentence2.m_pchData的值有问题。
    建议调用前初始化Sentence2先
      

  16.   

    To 羽战士 、一开始的程序 已经赋了空值。
    刚才还是有问题、释放内存的时候。
    是在调用的地方释放吧!这样写好像不行、该如何释放呢?int ReadFile(const TCHAR  *filename )
    {
    .......
    char*strMorph=NULL;
    Trans( m_strGenbun, strMorph);
              if (strMorph)
                 delete[] strMorph;          
           
    }
      

  17.   

    动态库里从堆分配内存有问题,原因不明。
    最好改成globalalloc, globalfree
      

  18.   

    To MZP(mzp):按照你的方法如何释放内存呢?
      

  19.   

    如果你这个函数是DLL暴露出来让EXE调用的话就会出问题
    Sentence2是EXE里的变量,在DLL里负值的时候,DLL会对Sentence2分配内存,这样,EXE中Sentence2 这个变量实效的时候CString释放内存实际释放的是DLL的内存,会出现访问越界,简单的方法是把CString Sentence2改成一个buffer
      

  20.   

    我是说在函数体内部赋个初值……把这个地方改一下:
    *Sentence2 = new char [myString.GetLength() + 1];
      

  21.   

    因为我已开始写的代码有点问题,如果myString为空的话,new char [0];必然导致delete的问题。
    而且CString::GetLength返回值不考虑最后的'\0'结束位,长度需要+1才能保证不溢出。呵呵~~手误啊 ~~不好意思。
      

  22.   

    extern "C" int Trans( const char *Sentence1,  char** Sentence2)
    {
     CString  myString="";
     .....
     *Sentence2 = new char [myString.GetLength()];
     strcpy (*Senetence2, myString);
    return 1; }
    我是说在这里如果申请了空间、肯定要在这里释放。因为EXE和DLL是两个空间。
     但是释放的话返回值又没有了、矛盾啊!
    我现在用了个办法是在Exe中调用两次这个函数。第一次 获得字符串大小
    第二次申请空间返回值。就是这样做效率变低了。
      

  23.   

    extern "C" int Trans( const char *Sentence1,  char*& Sentence2)
    {
     CString  myString="";
     .....
     Sentence2 = (char*)GlobalAlloc(GHND,myString.GetLength()+1);  //^ ^
     strcpy (Senetence2, LPCTSTR (myString));
    return 1; }int ReadFile(const TCHAR  *filename )
    {
    .......
    char*strMorph=NULL;
    Trans( m_strGenbun, strMorph);
              if (strMorph)
                 GlobalFree(strMorph);          
           
    }
      

  24.   

    CString的内部实现中有new的动作,所以在dll中使用CString作为返回是会出现问题的,因为它的空间已经被释放了。
    改成char*就可以了
      

  25.   

    To MZP(mzp):  EXE 编译不能通过
      

  26.   

    此时exe和dll是同一个进程中,共用空间,在DLL外删除不会有问题。