ATL::CString在dll中使用问题

chenzhou35 2005-08-31 11:59:07
dll export function
_____________________________________
ATL::CString s = "test string";
extern "C" STRALLOC_API ATL::CString& fnstrAlloc(void)
{
return s;
}

exe main
_____________________________________
typedef ATL::CString & (*fnstrAlloc_t)(void);
int _tmain(int argc, _TCHAR* argv[])
{

HINSTANCE h = LoadLibrary("d:\\testxx\\debug\\TestXX.dll");
fnstrAlloc_t fnstrAlloc = (fnstrAlloc_t)GetProcAddress(h,"fnstrAlloc");
ATL::CString s = fnstrAlloc();
FreeLibrary(h);
s.Mid(2);
return 0;
}

以上代码在运行到s.mid(2)的时候会崩溃,崩溃原因是ATL::String的(IAtlStringMgr*)(&g_strmgr)无效了,这个g_strmgr是每个dll一个的么?以上代码在MFC下运行没有问题,虽然MFC使用的相同的CString代码,看上去MFC在所有dll里面使用了一个统一的g_strmgr,ATL里面有类似机制么?
...全文
209 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenzhou35 2005-09-01
  • 打赏
  • 举报
回复
都容易出哪些问题?能说说么?
Kudeet 2005-09-01
  • 打赏
  • 举报
回复
CString导出很容易出问题,建议采用char* / LPTSTR等
chenzhou35 2005-08-31
  • 打赏
  • 举报
回复
根据执行跟踪来看,ATL::CString s = fnstrAlloc();的时候字串的引用计数被加了1,所以FreeLibrary的时候,CString s = "test string"仍然还存在,这个已经确认过了,FreeLibrary的时候会release一次,但是release之后的引用计数为1,所以没释放。

真正被释放的是这个CString的(IAtlStringMgr*)(&g_strmgr),也就是字符串的内存分配器...是否有办法让多个dll共用相同的分配器?或者在由此分配器说分配的字符串没有全部释放之前,此分配器不会被释放?
aceouter 2005-08-31
  • 打赏
  • 举报
回复
还是变量生存期的问题,DLL被释放之后ATL::CString s = "test string";就不存在了。

ATL::CString& fnstrAlloc(void)
改为
ATL::CString fnstrAlloc(void)
chenzhou35 2005-08-31
  • 打赏
  • 举报
回复
顶一下

大家给点建议,谢谢

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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