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;