您的位置:首页 > 其它

DrGraph软件升级:WIN7下的程序BUG修正

2013-04-24 21:02 337 查看
简要说明

启动程序出现脚本错误(OK)
提交人

DrGraph 2013/04/24

处理状态

处理完毕

同步状态

 
现象

程序启动时,出现脚本错误



定位及调试过程

可以确定,这是起始页面的JavaScript导致的问题

再定位确定为swfobject_modified.js的484行,打开之
对应函数

function setVisibility(id, isVisible) {

        var v = isVisible ? "inherit" : "hidden";

        if (isDomLoaded) {

            getElementById(id).style.visibility = v;

        }

        else {

            createCSS("#" + id, "visibility:" + v);

        }

    }

即getElementById(id).style.visibility = v;出错

屏蔽该行,再运行,正常

 

 

 

简要说明

程序出现内部已捕获处理的异常
提交人

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__

String literal

Name of the current file being processed.

不费事再去查__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;

即可。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: