我跟踪进去,是CString里面出错。
CMyClass直接放在Exe中没问题,放在DLL中才出错。
>>>  Debug Assertion Failed!  Program: D:\Work\VC\Test0\Debug\Test0.exe
  File:dbgheap.c
  Line:1044  Expression:_CrtIsValidHeapPoint(pUserData)
  .....

解决方案 »

  1.   

    你是不是new的CString然后delete了?还是你手动修改了它里面的Buffer了?
      

  2.   

    传引用相当于传的指针,dll中无法访问这个地址。
    类似的情况过去我也曾遇到过。改成传值试试
      

  3.   

    可是我需要改变它的值。
    好像MFC的类库中也有传引用的,使用MFC 的dll为什么没问题?
      

  4.   

    看看你的mc是不是有问题。
    要不用一个字符缓冲区先顶着
    BOOL DoSth(LPTSTR szValue);TCHAR buffer[1024]
    lstrcpy(buffer,szValue);
    mc.DoSth(buffer);
    szValue=buffer;
      

  5.   

    呵呵,我已经明白一些了。
    CString在堆中分配空间,当改变CString的内容时会将已分配的堆释放掉,然后重新分配,
    因为这个CString是在Exe中定义的,如果在Dll中改变内容,在释放空间时会失败,因为对
    DLL来说,要释放的不是一个本地堆中分配的空间。可DLL使用的不是应用程序的堆吗?为什么不是本地堆呢?哪位大虾给解释一下?
      

  6.   

    不会吧,我有很多DLL都导出这种修改CString的函数啊。
    要不把代码发过来我看看
    [email protected]
      

  7.   

    代码有关的基本上就是上面那么多,
    另外,我的DLL工程是
        Regular Dll with MFC statically linked.
    类型。EXE工程
        Use MFS in a Static Library
    跟踪到MFC源代码中相关注释是:      a bad pointer has been passed in. It may be
       totally bogus, or it may have been allocated from another heap.
       The pointer MUST come from the 'local' heap.
       Pointers from non-local heaps cannot be handled. For example, a
       non-local pointer may come from a DLL that has the CRT linked-in.
      

  8.   

    我用的是MFC扩展DLL,regular没有试过
      

  9.   

    一:VC的DLL是Extension DLL,你的是Regular,当然不一样啦
    二:Regular使用自己的存储池和其他MFC公用状态,而Extension和应用程序共享。你的Regular和Exe用的堆不一样的,你在某一个里面new一个,到另外一边去delete看看
    三:根据MSDN
    如果你的DLL需要使用MFC,并且DLL将来会被MFC或者非MFC程序调用,那么使用Regular DLL。动态链接的Regular DLL文件小,占用内存少,但是需要和MFCx0.DLL,MSVCRTx0.DLL一起发布;静态链接的Regular DLL文件大,而且可能占用额外的内存,因为他需要装入自己的MFC程序代码拷贝,还有一点需要考虑的就是静态链接的Regular DLL编译时间要长许多。
    Regular DLL使用"C"接口,可以使用MFC的类如果你的DLL需要使用MFC,并且只会被MFC程序调用,你可以选择Regular DLL或者Extension DLL。如果你的DLL实现可重用的MFC派生类,或者你需要在MFC程序和DLL之间传递MFC派生对象,你必须使用Extension DLL。
    Extension使用C++/MFC类接口。
    (基本上是翻译的,有我补充的,水平比较低,呵呵)根据上面的建议,在Regular里面是不应该传递使用MFC派生对象的,必须使用Extension。四:MFC的全局函数一般不用CString参数的,一般只有在类成员函数里面才会使用。建议你用字符数组加长度限制代替CString,象好多API函数一样。
      

  10.   

    感谢各位大虾。
    还有一个小问题:
       如果要导出一个CWnd的派生类,或在DLL中的Class中Create一个Window,是否也只能用
    Extension DLL?