各位大佬,都来看看啊~ 非常奇怪的问题 本帖最后由 skyxie 于 2009-12-03 23:19:14 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 mfc/atl都没有使用?没做过这样的控件。 上面以及贴出来了~有问题和没有问题之间的区别就是一个W2A,A2W;以及使用了std::stringps, tttyd是啥意思啊?我想到一个,但是太...太...太淫荡,不好意思说出来 ^_^ std::string enc_string; { USES_CONVERSION; enc_string = W2A(wstrEnc); } 与你遇到的问题无关的是,如果在循环中用转换宏,会出问题的。其分配的内存,只会在函数结尾才会被释放,循环中反复使用,堆栈可能存在溢出 上面已经贴出来了~ 几个W2A,A2W;以及使用了std::string 没有在循环中使用;而且就是是这样的,也应该是程序执行到这里的时候才会出这个问题嘛现在的问题是加上这个之后,regsvr32 xxx.ocx, 连dllmain, dllregisterserver都进入不了... std::string enc_string; { USES_CONVERSION; enc_string = W2A(wstrEnc); } 在这个大括号内,W2A申请的内存是在栈上,括号结尾处,申请的内存已经被释放。enc_string实际返回的是已经释放过的内存地址。所以这是有问题的。 不是函数的结尾,而是作用域的结尾。我在USES_CONVERSION; enc_string = W2A(wstrEnc); 的前后加上{},就是为了让作用域尽量的小,在执行完这个赋值动作之后就释放。 在{}括号中赋值的时候就调用了 std::string的copy ctor,赋值之后释放与否,对 enc_string 来说已经不重用了 tyd我的名字拼音头一个字母 前面加两t避免重复 你在DllMain之前的启动函数_DllMainCRTStartup函数处设置断点,查看一下模块初始化情况。看能否扑捉到异常信息。_DllMainCRTStartup函数在crtdll.c文件中。 _CRT_INIT_DllMainCRTStartup 都没有进去,难道是 #include <AtlConv.h> 之后,它就用Atl 而不是 crt的 entry point了?明天去公司再研究看看 有没有定义全局对象?连接时有无警告?看起来是VC的bug,如果你用的是VC版本比较旧,建议换高版本的VC试试。 link的时候没有任何warning已经是用的vs2008 sp1了 汗~ 果然是全局对象的原因!在某个文件中定义了一个 static const std::string 的全局对象,将其改为非全局的就OK了。 连_DllMainCRTStartup函数都进不了,只能哪个是静态或全局变量初始化的问题了.gx lz问题解决 CMyDialogBar里的控件响应很多消息,怎么办 怎样防止键盘钩子 问闻诒洋,您的ODBC API文档的vc 下二进制字段读有问题,请救急,都好几天,进展慢??O 怎么关闭各各对话框? 当我用CAsyncSocket时候怎么才能判段 CIPAddressCtrl的函数GetAddress()的使用问题 Dll调试,在线等待。 请教:我是文科类的,可以学编程吗?从哪开始? mfc还有戏吗? 请问EditBox获得输入焦点应该怎么表示? 构造函数和拷贝构造函数的问题 为什么用API的CreateWindow函数创建的按钮外观跟操作系统主题不匹配?
没做过这样的控件。
有问题和没有问题之间的区别就是一个W2A,A2W;以及使用了std::string
ps, tttyd是啥意思啊?我想到一个,但是太...太...太淫荡,不好意思说出来 ^_^
{
USES_CONVERSION;
enc_string = W2A(wstrEnc);
} 与你遇到的问题无关的是,如果在循环中用转换宏,会出问题的。其分配的内存,只会在函数结尾才会被释放,循环中反复使用,堆栈可能存在溢出
几个W2A,A2W;以及使用了std::string
没有在循环中使用;而且就是是这样的,也应该是程序执行到这里的时候才会出这个问题嘛现在的问题是加上这个之后,regsvr32 xxx.ocx, 连dllmain, dllregisterserver都进入不了...
{
USES_CONVERSION;
enc_string = W2A(wstrEnc);
}
在这个大括号内,W2A申请的内存是在栈上,括号结尾处,申请的内存已经被释放。enc_string实际返回的是已经释放过的内存地址。所以这是有问题的。
不是函数的结尾,而是作用域的结尾。我在
USES_CONVERSION;
enc_string = W2A(wstrEnc);
的前后加上{},就是为了让作用域尽量的小,在执行完这个赋值动作之后就释放。
在{}括号中赋值的时候就调用了 std::string的copy ctor,赋值之后释放与否,对 enc_string 来说已经不重用了
看能否扑捉到异常信息。
_DllMainCRTStartup函数在crtdll.c文件中。
_CRT_INIT
_DllMainCRTStartup 都没有进去,难道是 #include <AtlConv.h> 之后,它就用Atl 而不是 crt的 entry point了?
明天去公司再研究看看
看起来是VC的bug,如果你用的是VC版本比较旧,建议换高版本的VC试试。
已经是用的vs2008 sp1了
汗~ 果然是全局对象的原因!
在某个文件中定义了一个 static const std::string 的全局对象,将其改为非全局的就OK了。
gx lz问题解决