//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中就暴露出来了,这个找起来就比较难了。
/*
总结:
Debug与Release不同的问题在刚开始编写代码时会经常发生,100%是因为你的代码书写错误而导致的,所以不要动不动就说系统问题或编译器问题,努力找找自己的原因才是根本。常常遇到这情况,经历过一次次的教训后就应该开始注意了。下面是几个避免的方面,即使没有这种问题也应注意一下:
1. 注意变量的初始化,尤其是指针变量,数组变量的初始化(很大的情况下另作考虑了)。
2. 自定义消息及其他声明的标准写法
3. 使用调试宏时使用后最好注释掉
4. 尽量使用try - catch(...)
5. 尽量使用模块,不但表达清楚而且方便调试。
*/
关于两个版本的问题,请参见转贴: http://blog.csdn.net/cobay/archive/2008/12/19/3555774.aspx