关于从dll中输出class

codemon 2001-08-29 04:14:45
在dll中定义1个class

class AFX_CLASS_EXPORT CMyClass
{
...
public:
...
BOOL DoSth(CString& szValue);
}

编译连接通过。
在使用此class出错。

...
CMyClass mc;
CString szStr;
...
mc.DoSth(szStr);//出错
...

跟踪进去。。。


BOOL CmyClass::DoSth(CString& szValue)
{
...

szValue="OK!";//Run到这里出错了!!!!
...
}


为什么?
为什么?
为什么?
为什么?

...全文
474 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
codemon 2001-09-06
  • 打赏
  • 举报
回复
再次感谢各位
codemon 2001-09-05
  • 打赏
  • 举报
回复
感谢各位大虾。
还有一个小问题:
如果要导出一个CWnd的派生类,或在DLL中的Class中Create一个Window,是否也只能用
Extension DLL?
蒋晟 2001-09-05
  • 打赏
  • 举报
回复
xj_h 2001-09-04
  • 打赏
  • 举报
回复
一: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函数一样。
蒋晟 2001-09-04
  • 打赏
  • 举报
回复
我用的是MFC扩展DLL,regular没有试过
codemon 2001-09-04
  • 打赏
  • 举报
回复
代码有关的基本上就是上面那么多,
另外,我的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.




codemon 2001-09-03
  • 打赏
  • 举报
回复
呵呵,我已经明白一些了。
CString在堆中分配空间,当改变CString的内容时会将已分配的堆释放掉,然后重新分配,
因为这个CString是在Exe中定义的,如果在Dll中改变内容,在释放空间时会失败,因为对
DLL来说,要释放的不是一个本地堆中分配的空间。

可DLL使用的不是应用程序的堆吗?为什么不是本地堆呢?哪位大虾给解释一下?



蒋晟 2001-09-03
  • 打赏
  • 举报
回复
不会吧,我有很多DLL都导出这种修改CString的函数啊。
要不把代码发过来我看看
sheng@jiang.com.cn
codemon 2001-09-03
  • 打赏
  • 举报
回复
up
蒋晟 2001-08-29
  • 打赏
  • 举报
回复
看看你的mc是不是有问题。
要不用一个字符缓冲区先顶着
BOOL DoSth(LPTSTR szValue);

TCHAR buffer[1024]
lstrcpy(buffer,szValue);
mc.DoSth(buffer);
szValue=buffer;
codemon 2001-08-29
  • 打赏
  • 举报
回复
可是我需要改变它的值。
好像MFC的类库中也有传引用的,使用MFC 的dll为什么没问题?
codemon 2001-08-29
  • 打赏
  • 举报
回复
我什么都没做,只不过是赋值而已。
luxes 2001-08-29
  • 打赏
  • 举报
回复
传引用相当于传的指针,dll中无法访问这个地址。
类似的情况过去我也曾遇到过。改成传值试试
蒋晟 2001-08-29
  • 打赏
  • 举报
回复
你是不是new的CString然后delete了?还是你手动修改了它里面的Buffer了?
wzaen 2001-08-29
  • 打赏
  • 举报
回复
@_@
codemon 2001-08-29
  • 打赏
  • 举报
回复
我跟踪进去,是CString里面出错。
CMyClass直接放在Exe中没问题,放在DLL中才出错。
>>>

Debug Assertion Failed!

Program: D:\Work\VC\Test0\Debug\Test0.exe
File:dbgheap.c
Line:1044

Expression:_CrtIsValidHeapPoint(pUserData)
.....
蒋晟 2001-08-29
  • 打赏
  • 举报
回复
是AFX_EXT_CLASS吧
什么错?
codemon 2001-08-29
  • 打赏
  • 举报
回复
Waiting>>>>>>>

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧