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;