debug版本release版本下的GetDlgItem问题

//release版本下不能这样写,debug版本下没问题

GetDlgItem(IDC_STATIC_WAIT)->SetWindowTextA("正在登陆服务器,请稍候...");

出错:error C2039: SetWindowTextA: 不是“CWnd”的成员。

 

原来这样写:

m_cWaitText.SetWindowTextA("正在登陆服务器,请稍候...");

也出错:error C2039: SetWindowTextA: 不是“CStatic”的成员。

 

//以上代码在debug版本下没问题,release版本下不能这样写,原因是:

//1、线程函数是全局函数不能调用它的非static成员函数,

//  将你的对话框的HWND或者他的类的指针传到线程函数中执行。

//  你是在一个线程中调用GetDlgItem,这里的GetDlgItem是一个API,而不是CWnd的成员函数,

//  而这个API的参数有两个,不是一个,你可以用这个API,

//  方法是:GetDlgItem(对话框句柄,ID),然后用SetWindowText(控件HWND,字串)来完成这个工作.

 

//下面这样写就没问题了,两个版本都没有问题。

    HWND hwnd;

    CWnd* pWnd = CWnd::FromHandle(hwnd);

    if(pWnd)

    {

        pWnd-> GetDlgItem(IDC_STATIC_WAIT)->

SetWindowText(_T("正在登陆服务器,请稍候..."));

    }

//下面这里也应该加上_T(x),否则也会出错。

SetWindowText("正在登陆服务器,请稍候...");

//error C2664: CWnd::SetWindowTextW: 不能将参数1 从“const char [27]”转换为“LPCTSTR

//正确的应该是:

pWnd-> GetDlgItem(IDC_STATIC_WAIT)-> SetWindowText(_T("正在登陆服务器,请稍候..."));

 

//上面说明的情况是:代码存在错误在debug方式下可能会忽略而不被察觉到,

//  debug方式下数组越界也大多不会出错,

//  release中就暴露出来了,这个找起来就比较难了。

 

/*

总结:

DebugRelease不同的问题在刚开始编写代码时会经常发生,100%是因为你的代码书写错误而导致的,所以不要动不动就说系统问题或编译器问题,努力找找自己的原因才是根本。常常遇到这情况,经历过一次次的教训后就应该开始注意了。下面是几个避免的方面,即使没有这种问题也应注意一下:

1. 注意变量的初始化,尤其是指针变量,数组变量的初始化(很大的情况下另作考虑了)

2. 自定义消息及其他声明的标准写法

3. 使用调试宏时使用后最好注释掉

4. 尽量使用try - catch(...)

5. 尽量使用模块,不但表达清楚而且方便调试。

 

*/

 

 

 关于两个版本的问题,请参见转贴: http://blog.csdn.net/cobay/archive/2008/12/19/3555774.aspx

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值