nxclient运行时的几个问题的处理


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.dll
019B22BF 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.dll
0468CA79 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;



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值