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

原创 2013年12月03日 00:09:04

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;



opencv+vs2010安装和运行时出现的几个问题与解决办法

今天搞了整整一天,win7 64位调试opencv和vs2010,郁闷啊。。。。 先说一下win7 64位加载opencv的步骤,给链接http://www.opencv.org.cn/forum/...
  • reiliu
  • reiliu
  • 2013年03月08日 01:01
  • 3371

初学时常见的几个问题

  • 2011年12月29日 18:07
  • 191KB
  • 下载

Handler运行机制中必须明白的几个问题

概述我在看完Handler的源码后有两个感觉,一是貌似明白了很多东西,二是当问到具体问题时感觉还是模模糊糊。下面我们就带着问题再看一次源码,力争把这块知识点搞的明明白白。问题有: 在UI线程中有几个L...

NS2安装时应注意的几个问题

  • 2013年03月27日 20:55
  • 93KB
  • 下载

spark程序打包集群运行方法及使用中的几个问题解决

spark程序打包集群运行

运行时的问题提示

  • 2008年06月02日 11:08
  • 1000KB
  • 下载

QT学习——QT命令行开发环境搭建的几个问题以及处理

QT命令行开发环境搭建的几个问题以及处理 刚学QT,看了丁林松老师的视频《丁林松QT系列教程:1.手工布局》,自己动手写了代码,在命令行编译和运行程序中发现有几个问题,这边把处理方法记录下来。 这...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:nxclient运行时的几个问题的处理
举报原因:
原因补充:

(最多只允许输入30个字)