c++ - 是否可以在主应用程序中使用在 DLL 中创建的 CPropertyPage?

标签 c++ winapi mfc

我有一个基于对话框的 MFC 应用程序,它托管 CPropertySheet

想法是扫描一些文件夹中的 DLL,动态加载它们中的每一个(使用 LoadLibrary()),获取一个指向像 CPropertyPage 一样工作的函数的指针> 工厂,使用该函数创建每个 DLL CPropertyPage 实例并将它们插入到 CPropertySheet

换句话说,扫描文件夹中的插件,获取每个插件的属性页并将它们插入到主应用程序的 CPropertySheet 中,以便每个插件都有自己的选项 GUI。

插件以常规 MFC dll(而非扩展 dll)的形式实现。我知道要使用 AFX_MANAGE_STATE(AfxGetStaticModuleState())

创建的每个 CPropertyPage 都必须派生自抽象接口(interface)(例如,IPluginOptionsPropPage),因此可以将工厂函数返回的指针转换为 IPluginOptionsPropPage.

这个任务应该是常规任务,但是,我找不到任何可靠的例子。

最佳答案

是的,这是可以做到的。您可以尝试这些步骤

  1. 使用::LoadLibrary 加载属性页库。返回句柄是资源的句柄。

    m_hResInstance = ::LoadLibrary(strFile);
    
  2. 在创建属性页的实例之前,将资源句柄的实例设置为库的句柄。

    m_hCurrent = AfxGetResourceHandle();
    
    AfxSetResourceHandle(hResInstance);
    
    //Create your property sheet here.
    
  3. 然后将资源句柄重置为当前进程资源。

    //Reset the previous
    
    AfxSetResourceHandle(m_hCurrent);
    

这将使您能够加载属性页的资源,其他如标题和库或函数指针可以按预期使用。

关于c++ - 是否可以在主应用程序中使用在 DLL 中创建的 CPropertyPage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48853228/

相关文章:

c++ - boost::asio 和事件对象

c++ - QT 串行丢弃数据

c - "Size in TCHARs"是什么意思?

multithreading - InterlockedRead在哪里?

c++ - XP 滚动条在 Windows7/Vista 中乱七八糟

c++ - 静态库中的对话框资源

c++ - 计算点云部分体积的算法

c++ - OpenCV 无法设置 SVM 参数

c# - 如何获取本地网络计算机列表?

c++ - MFC C++ 应用程序的最佳 XML 序列化库