nxclient运行时的几个问题的处理
来源:互联网 发布:端口范围 编辑:程序博客网 时间:2024/06/05 09:28
nxclient的所有模块的编译选项如下:
.DEBUG版本
.CODEGUARD=0
以下问题中的前2个是比较奇怪的.虽然已经处理但仍然有所不解.
问题3的逻辑错误是确定的.
1.程序结束异常
1.1现象
hotfox不加载任何插件,甚至仅有以下代码时程序结束产生异常:
void ace_init(void){#pragma startup ace_init ACE::init();}void ace_fini(void){#pragma exit ace_fini ACE::fini();}///< 是否有ace_init,ace_fini情况相同WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { Application->Initialize(); ///< 无此行也异常 return 0;}
异常时调用栈如下:
7C9313F7 ntdll.dll019B22BF ACE_OS::thread_mutex_destroy(m=:004FB548)019ED6B8 ACE_Thread_Mutex::remove(this=:004FB548)019ED6DD ACE_Thread_Mutex::~ACE_Thread_Mutex(this=:004FB548)0042A1A1 _STDES0_()且在CODEGUARD=0时,程序结束产生异常.而在CODEGUARD=1时,未产生异常。
1.2分析与处理
从调用栈信息联想到BCB6中使用ACE_Atomic_Op产生异常.
对DeamonTaskManager的成员变量进行修改,把
ACE_Atomic_Op<ACE_Thread_Mutex,unsigned long> id_seed_;修改为:
ACE_Atomic_Op<ACE_Thread_Mutex,long> id_seed_;重新编译测试,异常消失.
***不确定是否是此原因,抑或是重新编译了hotfox?
2.登录取消时异常/主窗口显示后退出应用异常
2.1现象
以下情况下会出现程序结束异常:
.登录界面打开时,选择"取消",程序结束产生异常.
.登录后主窗口显示后结束程序时也产生异常.
异常时调用栈如下:
7C812FD3 C:\WINDOWS\system32\kernel32.dll0468CA79 Sysutils::RaiseLastOSError()0462BFF6 Controls::TWinControl::DestroyWindowHandle(Self=:023A3300)0460EB3D Forms::TCustomForm::DestroyWindowHandle(Self=:023A3300)0460BFFC Forms::TCustomForm::Destroy(Self=:023A3300, ...)042EC1EC Forms::TForm::~TForm(this=:023A3300)04316135 TfrmTip2::~TfrmTip2(this=:023A3300)042E23F2 mbox::client::Plugin::~Plugin(this=:02A77840)
DestroyWindowHandle代码:
procedure TWinControl.DestroyWindowHandle;begin Include(FControlState, csDestroyingHandle); try if not Windows.DestroyWindow(FHandle) then RaiseLastOSError; finally Exclude(FControlState, csDestroyingHandle); end; FHandle := 0;end;
/// Windows.DestroyWindow(FHandle) 失败.什么原因失败的?
2.2分析与处理
新建一个TfrmTest1窗体,与TfrmTip2对比,排除窗体本身的差异造成问题.TfrmTest1没有任何代码和属性设置.
运行结果同样出现异常.
把对象的销毁改为调用Close方法后没有异常,即用:
tip_wnd_->Close;代替:
delete tip_wnd_;
delete一个窗体也是常用的方法,并且直接在创建tip_wnd_之后立即delete也没有问题.
tip_wnd_ = new TfrmTip2(NULL); tip_wnd_->Visible = false; ///< 不显示在任务栏中 SetWindowLong(tip_wnd_->Handle, GWL_EXSTYLE, GetWindowLong(tip_wnd_->Handle, GWL_EXSTYLE)|WS_EX_TOOLWINDOW); ///< 设置为TOPMOST SetWindowPos(tip_wnd_->Handle,HWND_TOPMOST ,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); delete tip_wnd_; ///< 不会产生异常
****如何解释这种现象呢?
3.登录后有时主窗口没有显示出来
3.1现象
应用在任务栏上有显示,但主窗口没有打开.
我的机器上频率比较低,zengd的测试机器很高,有一半的机会。3.2分析与处理
修改FormCreate,FormResize,FormShow的代码,直接返回.修改WndProc直接调用TForm的WndProc函数后返回.
void __fastcall TBusinessMainForm::WndProc(TMessage& Message){
TForm::WndProc(Message);
return;
}
修改后,窗口能够显示(不关心显示内容).
从FormCreate开始排查,恢复原有代码.问题出现.
代码如下:
void __fastcall TBusinessMainForm::FormCreate(TObject *Sender){ this->Width = iMinWidth; this->Height = iMinHeight; this->Constraints->MaxWidth = iMaxWidth; this->Constraints->MaxHeight = iMaxHeight; this->Constraints->MinHeight = iMinHeight; this->Constraints->MinWidth = iMinWidth; tagLocalUserSetInfo * pSet = (tagLocalUserSetInfo*)CPluginHelper::GetResource(LOCALSETING_INFO); if(pSet->iBMFormHeight > 0 && pSet->iBMFormWidth > 0) { if(pSet->iBMFormMaxState == 1) { WindowState = wsMaximized; } else { Position = poDesigned; Top = pSet->iBMFormTop; Left = pSet->iBMFormLeft; Height = (pSet->iBMFormHeight > iMaxHeight && iMaxHeight > 0) ? iMaxHeight : pSet->iBMFormHeight; Width = (pSet->iBMFormWidth > iMaxWidth && iMaxWidth > 0) ? iMaxWidth : pSet->iBMFormWidth; } } this->Caption = CAppEntryStyle1::instance()->app_name_.c_str();}
窗口位置和大小是根据记录的上次打开窗口的位置信息设置的.
问题是因为tagLocalUserSetInfo信息不正确,Top,Left,Width都可能是非常大的数值.
改为hotfox框架后此特性没有验证.可能tagLocalUserSetInfo的值是随机的.
目前一律设置为最大化:
WindowState = wsMaximized;
- nxclient运行时的几个问题的处理
- jsp运行时经常遇到的几个问题
- 影响Java程序运行的几个问题
- vim copy时的几个问题
- .Net在web服务器上启动调试开始运行时遇到的几个问题
- opencv+vs2010安装和运行时出现的几个问题与解决办法
- 今天运行代码过程中解决的几个问题
- lame 3.99和 AFNetworking升级遇到的几个问题的处理
- jsp 中关于日期时间处理的几个问题
- 和事务有关的几个问题 包含 com+ 事务 处理
- 使用异常处理语句需要注意的几个问题
- EmguCV在64位机上的几个问题处理办法
- 一维图像数据数组处理应该注意的几个问题
- 数字图像处理8--Canny算子中涉及到的几个问题
- JSP的运行处理
- libxml2使用时遇到的几个问题
- 使用GDI+时需要注意的几个问题
- 调用webservice时遇到的几个问题
- socket5代理 客户端代码
- 设计一个计算器类Calculator,它只有一个计数的成员count。该计算器的有效范围说0~65535,实现计算器的前自增、后自增、前自减、后自减、两个计算器相加减等运算
- POJ 1659 - Frogs' Neighborhood , Havel_Hakimi 定理
- Lua的使用入门之C/C++与lua函数的混合调用
- ACM之java速成
- nxclient运行时的几个问题的处理
- U盘安装 Centos Ubuntu 及安装后的源等设置
- 图像傅立叶变换的物理意义
- Working Practice-使用错误记录器记录错误
- linux中单引号、双引号、反引号的作用
- tnsnames.ora中的连接串
- 初步了解Html5,运用Html5的一些基本控件
- Android2.2 API 中文文档系列(6) —— ImageView
- Codeforces Round #137 (Div. 2)