简要说明 |
| 提交人 | DrGraph 2013/04/24 | |
处理状态 | 处理完毕 | 同步状态 | ||
现象 | 程序启动时,出现脚本错误 | |||
定位及调试过程 |
|
简要说明 |
| 提交人 | DrGraph 2013/04/24 | ||||
处理状态 | 同步状态 | ||||||
现象 | 程序运行后,日志中记录 <Info msg="Open File failed! ErrorCode:5 " /> <Info msg="出现异常 (null): Failed to get data for 'ServiceType' 抛出异常处:文件 (null) 第 0 行 处理异常处: 文件 ??尮潆浲屳敗卢牥楶散摁牤獥?牯?挮灰 第 85 行 " /> | ||||||
定位及调试过程 | Open File failed! ErrorCode:5 的原因在于,在WIN7下无法写文件,需要加上管理员权限 Failed to get data for 'ServiceType' 的原因在于,在WIN7无法读取注册表,需要加上管理员权限 乱码的所在: THelper::FormatString(L"出现异常 %s: %s\n\n抛出异常处:文件 %s 第 %d 行\n\n处理异常处: 文件 %s 第 %d 行\n\n", \ __ThrowExceptionName(), ex.Message.c_str(), __ThrowFileName(), \ __ThrowLineNumber(), __FILE__, __LINE__) 即__FILE__写入到其中出现乱码 单独测试一下: THelper::MessageBox( THelper::FormatString(L"出现异常 \n\n抛出异常处:文件 行\n\n处理异常处: 文件 %s 第 %d 行\n\n", \ __FILE__, __LINE__), false);
查帮助,知道:
不费事再去查__FILE__是如何定义的了,直接强制转化 THelper::MessageBox( THelper::FormatString(L"出现异常 \n\n抛出异常处:文件 行\n\n处理异常处: 文件 %s 第 %d 行\n\n", \ UnicodeString(__FILE__).w_str(), __LINE__), false); 得到结果,达到目标:
最终,如果不以管理员权限运行程序,会记录日志: 如果以管理员权限运行程序,会记录日志: |
简要说明 |
| 提交人 | DrGraph 2013/04/24 | |
处理状态 | OK | 同步状态 | 完成 | |
现象 | 经常有以下情况: 有多个控件(如A、B控件) A控件属性修改时,其事件处理函数中会导致B控件的属性也相应赋值 B控件属性修改时,其事件处理函数中会导致A控件的属性也相应赋值 从而导致死循环 | |||
定位及调试过程 | 加上一个全局变量,标志是否正在修改,或允许修改 class TGlobalVariables { … static bool EnableAutoChangeValue; ///< 全局变量:允许自动修改值,主要用途:避免多个控件属性修改时,导致关联控件属性事件触发,出现死循环 }; bool TGlobalVariables::EnableAutoChangeValue = true; // 缺省为true,允许修改
则使用时,首先判断该标志,若不为true,则不处理;然后置该标志为false,避免其它地方再入;处理完成后,恢复该标志。即: if (!TGlobalVariables::EnableAutoChangeValue) return; TRestore(TGlobalVariables::EnableAutoChangeValue, false); 为编码方便,定义一个宏: #define CBW_PREVENT_CHANGE_LOOP \ if (!TGlobalVariables::EnableAutoChangeValue) \ return; \ TRestore(TGlobalVariables::EnableAutoChangeValue, false); 则在使用时,只需在最开始处加上: CBW_PREVENT_CHANGE_LOOP; 即可。 |