mfc扩展dll 的调用以及dll中creat出错分析

要实现在DLL库中创建MFC的窗口,必须创建一个扩展DLL,Extension Dll

在DLL中配置好窗口资源,如:IDD_DIALOG这种模板资源。

 

在外部调用的时候只需要通过一个接口来创建窗体。

 

例子代码:

class __declspec(dllexport) CIeDlg : public CDialog
{

      //内容省略

      ............

}

 

CIeDlg为外部需要调用的窗体类。

 

在DLL中创建一个函数接口,创建该窗体(该函数不能放在Dialog中)

CIeDlg *CreateIeDlg(HWND   hWndParent)
{
 CIeDlg * g_MainDlg=new CIeDlg ();
 CWnd   *pWndParent   =   CWnd::FromHandle(hWndParent);   
 g_MainDlg->Create(IDD_IEDLG,pWndParent);
 g_MainDlg->ShowWindow(SW_SHOW);

return g_MainDlg;
}

外部直接调用CreateIeDlg来创建窗口

注意:

<strong>非模态对话框</strong>显示的时候<strong><span style="margin: 0px; padding: 0px; color: rgb(51, 102, 255);">程序不会暂停等待用户操作</span></strong>,会继续执行后续的代码,如果使用临时变量的话,对象的生命周期在调用函数执行完之后就结束,这样就无法正常显示(显示了又瞬间消失),所以可采用创建对象指针的方式,由于动态创建的指针对象是分配在堆内存上,堆内存上的变量周期可应用程序相同。

而模态对话框,要想在显示前做些事情,可以响应OnShow 消息去处理。

 

 

exe动态加载dll,在扩展dll中CreateIeDlg接口create窗口时出错。执行过程中出现AfxGetResourceHandle()断言错误。

     上网查了很多资料很多都说是因为资源切换的问题,但是我在应用程序中,已经进行了资源切换,应该不存在这个问题了啊!!所以我又在dllmain中定义了变量HINSTANCE theInstance,重新设置了资源,但是又出现了新的问题:

BOOL CObject::IsKindOf(const CRuntimeClass* pClass) const
{
   ENSURE(this != NULL);//在这里错误

   。。。。。。。。。

}

很多网友也遇见了这样的问题,主要是我原来有个可以正常调用的demo,这个demo调用方式和上面的一模一样,所以我就想可能是我哪里设置的问题,所以我仔细对比了两个DLL,也没有不一样的地方。经过多次查找资料,将exe和dll的编译选项中关于mfc库的选择设为一样的,因为exe工程中还依赖了一些lib静态库(有自己开发的,也有第三方的),一起编译时还是编译出错。

经分析原因如下:

主要原因是编译选项中关于mfc库的选择。第三方库recognizer.lib和你的工程选择不同造成的。
打开Property Pages。在Configureation Properties->General->Use of MFC中改变选项

 

再编译执行,问题就不再出现了。
在Flutter框架调用继承类的`createState`方法通常是在Stateful Widget进行的。Stateful Widget是有状态的组件,它可以在用户的交互下改变其界面。`createState`方法的调用发生在Flutter框架初始化Stateful Widget时,用于创建与之对应的State对象。以下是如何在Flutter调用继承类的`createState`方法的基本步骤: 1. 创建一个继承自Stateful Widget的类。 2. 在这个子类重写`createState`方法。 3. 在重写的`createState`方法,返回一个State类的实例。 这需要注意的是,通常我们不会直接调用`createState`方法,因为它是由Flutter框架在适当的时机调用的。以下是一个简单的示例代码,展示了如何创建一个继承自Stateful Widget的类,并在其重写`createState`方法: ```dart import 'package:flutter/material.dart'; // 定义一个Stateful Widget class MyStatefulWidget extends StatefulWidget { // 重写createState方法,返回对应的State类实例 @override _MyStatefulWidgetState createState() => _MyStatefulWidgetState(); } // 定义State类 class _MyStatefulWidgetState extends State<MyStatefulWidget> { // State类的逻辑代码 @override Widget build(BuildContext context) { // 在这构建UI return Text('Hello, World!'); } } ``` 在上面的示例,`MyStatefulWidget`是一个Stateful Widget的子类,我们在它面重写了`createState`方法,并返回了`_MyStatefulWidgetState`类的实例,这个类继承自`State<MyStatefulWidget>`。我们不会直接调用`createState`方法,而是通过创建`MyStatefulWidget`的实例并将其加入到Widget树,Flutter框架会在适当的时机调用`createState`来创建对应的State实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值