调用DLL 中的MDI子窗体,提示"Cannot create form.No MDI forms are currently active"

mimong_lin 2008-06-13 10:34:07
如果,我的程序结构是这样的,一个存放MDI Child 子窗体的DLL(DLLMDIChildPro.dll),一个管理这些MDI Child子窗体DLL的管理DLL(DLLMDIChildManagePro.dll),MDI主程序(DLLMDIChildTestPro.exe).程序结构就要求这样子,不能改变的.显示MDI Child子窗体的过程是这样的,MDI主程序中的一个MDI Child子窗体(在主程序里带的,不是DLL生成)调用管理DLL中的接口来显示MDI Child.

DLLMDIChildPro.dll的导出函数

extern "C" __declspec(dllexport)
bool GetReportFileInfo(ReportInfo& rptInfo)
{
rptInfo.formClass = __classid(TFormFirstDLLMDIChild);
rptInfo.ppForm = (TForm **)&FormFirstDLLMDIChild;
//rptInfo.reportTitle = std::string("第一个DLL MDI子窗体");
//rptInfo.reportType = std::string("测试报表");

return true;
}


DLLMDIChildManagePro.dll的导出函数

extern "C" __declspec(dllexport)
void ShowFirstMDIChild(TApplication* pApp)
{
if(g_SavedApp == NULL)
{
g_SavedApp = Application;
Application = pApp;
}

if(g_firstDLLMDIChildIns == NULL)
{
g_firstDLLMDIChildIns = ::LoadLibrary("DLLMDIChildPro.dll");
if(g_firstDLLMDIChildIns == NULL)
{
return ;
}
}

struct ReportInfo rptInfo;
GETREPORTFILEINFOFUNC GetInfo
= (GETREPORTFILEINFOFUNC)::GetProcAddress(g_firstDLLMDIChildIns, "_GetReportFileInfo");
if(GetInfo == NULL)
{
return ;
}
GetInfo(rptInfo);

if(rptInfo.ppForm == NULL)
{
return ;
}
if((*rptInfo.ppForm) == NULL)
{
Application->CreateForm(rptInfo.formClass, rptInfo.ppForm);
}
(*rptInfo.ppForm)->Show();
}


DLLMDIChildTestPro.exe中的调用代码

void __fastcall TFormDLLMDIChildUsage::btn1Click(TObject *Sender)
{
typedef void (*SHOWFIRSTMDICHILDFUNC)(TApplication* pApp);
SHOWFIRSTMDICHILDFUNC ShowFunc
= (SHOWFIRSTMDICHILDFUNC)::GetProcAddress(m_dllMDIChildMIns, "_ShowFirstMDIChild");
if(ShowFunc == NULL)
{
throw(Exception(Format("函数取址失败:%u", ARRAYOFCONST(((int)::GetLastError())))));
}
ShowFunc(Application);
}


Application->CreateForm(rptInfo.formClass, rptInfo.ppForm);
这个是在网上找到的内容,说是在调用DLL中的MDI Child子窗体的时候,需要从外部传入Application,在调试的时候,我查看传进来的Application的MainForm的FFormStyle,是2(fsMDIForm),但是在这一步调用的时,问题提示"Cannot create form.No MDI forms are currently active".

这究竟是什么问题呢?要怎么解决?
...全文
1143 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
我来看看CB 2008-06-13
  • 打赏
  • 举报
回复
关注。。。。。。
mimong_lin 2008-06-13
  • 打赏
  • 举报
回复
问题解决,是认识上的错误.
虽然知道DLL中的Application和MDI主程序中的Application是不同样的,在ShowForm有替换DLL中的Application.以为用GetFormClass后是在MDI主程序中调用Application->CreateForm,应该不关DLL中的Application的事,没想到它还是会去判断DLL中的那个Application.所以,需要在GetFormClass的时候,也替换DLL中的Application,才能解决问题.新的函数接口如下:

void GetFormClass(TApplication* pApp, struct FormClass& f)
{
if(g_SavedApp == NULL)
{
g_SavedApp = Application;
Application = pApp;
}

f.ppForm = (TForm **)&FormDLL;
f.formClass = __classid(TFormDLL);
}


这样就OK了.
mimong_lin 2008-06-13
  • 打赏
  • 举报
回复
经过调试发现,对于fsMDIChild的窗体,调用Application->CreateForm的时候,似乎需要CreateForm这个操作和fsMDIChild窗体在同一个模块中(同一个DLL或者EXE文件中,也就是同一个项目中),是否是这样子的呢?

请向前辈们求证一下.
内容概要:本文研究了基于Q-Learning自适应强化学习的PID控制器在自主水下航行器(AUV)运动控制的应用,旨在提升其在复杂海洋环境下的控制性能。通过建立AUV的动力学模型,将Q-Learning算法与传统PID控制相结合,实现控制器参数的在线自适应优化,有效增强了系统的响应速度、稳定性和抗干扰能力。研究采用Matlab进行仿真验证,结果表明该方法在轨迹跟踪与姿态控制方面具有优越表现,为水下机器人智能控制提供了可行的技术路径与理论支持。; 适合人群:具备自动控制理论、强化学习或水下机器人建模背景,从事相关科研工作的研究人员、高校研究生及工程技术开发者。; 使用场景及目标:①应用于高精度、强鲁棒性的水下机器人运动控制系统设计;②开展智能PID控制器在非线性、时变系统的参数自整定研究;③作为强化学习在复杂工业控制场景落地的典型案例参考,推动算法与工程实践融合。; 阅读建议:建议结合提供的Matlab代码进行仿真实验,重点剖析Q-Learning与PID融合的架构设计、奖励函数设定及参数收敛过程,可进一步拓展至与其他智能优化算法(如DQN、Actor-Critic)的对比研究,深化对自适应控制机制的理解。
已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 Matlab 被视为一种功能卓越的编程平台,特别是在数值运算和数据分析方面展现出广泛的应用价值。在应对多元非线性回归的挑战时,Matlab 拥备多种工具和函数,支持用户对复杂的数据进行构建模型和适配。本指南将重点阐释在 Matlab 环境下如何执行多元非线性回归分析。 我们需要掌握三种关键的回归指令: 1. `polyfit(x,y,n)`:此函数适用于拟合一元幂函数,能够导出一个多项式模型。例如,若知晓数据呈现二次函数形态,可选择`n=2`来适配一个二次曲线。 2. `regress(y,x)`:这是一个多元线性回归指令,能够处理多个自变量对因变量的影响。即便数据并非完全呈现线性特征,该函数也能提供一个线性近似。 3. `nlinfit(x,y,’fun’,beta0)`:这是最为通用的非线性回归指令,适用于适配任何类型的函数,无论是一元或多元,前提是用户能够定义函数形式(`fun`参数)。 回归分析的核心在于寻找一组最优的系数,使得模型能够最恰当地描述数据。这通常涉及选择一个合适的函数形态,随后通过最小化误差平方和来估算系数。在Matlab,`regress`指令主要用于处理线性模型,而`nlinfit`则处理更为复杂的非线性模型。 对于多元线性回归模型,我们可以用如下形式进行表述: \[ y = \beta_0 + \beta_1x_1 + \beta_2x_2 + \cdots + \beta_px_p + \epsilon \] 其,\( y \)是因变量,\( x_1, x_2, \ldots, x_p \)是自变量,\( \beta_0, \beta_1, ...

13,872

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧