【问题标题】:Use MFC library without MFC使用没有 MFC 的 MFC 库
【发布时间】:2023-04-07 08:31:01
【问题描述】:

我在我的项目中使用纯 C 和 Windows SDK,但现在我需要处理 DVR 的摄像头,该驱动程序是在 MFC 6.0 中制作的。

我可以随时切换到 C++(我已经在某些模块中使用它),但是在这个相机 SDK 中我需要 CWnd 的对象。

//Initialize is a function, which initializes the related SDK instance.
Void Initialize(CWnd* pParent)

我可以创建一个假的 CWnd,而不将 MFC 的东西加载到 MFC 项目中,而只使用我的普通 CreateWindowEx() 吗?

谢谢。

【问题讨论】:

  • 你有图书馆的来源吗?你也许可以伪造它。如果它唯一要做的就是获取 CWnd::m_hWnd 或调用 Cwnd::GetSafeHwnd,那么您可以创建一个虚拟 Cwnd 类来返回您的实际 HWND。但是,如果它使用 Cwnd 的成员函数的嵌套混乱,您可能会陷入困境......
  • 不,我没有。但我知道这个库使用 Cwnd 创建与这个 HWND 关联的线程(用于相机)。不过我可以试试!如何创建这个虚拟 CWnd?
  • 看看openmfc.codeplex.com - 它是 MFC 的开源版本。

标签: c winapi mfc


【解决方案1】:

CWnd 只是窗口句柄的一个包装器,可能只有 SDK 函数使用的方法是获取父窗口句柄。您可以尝试撕掉 CWnd 的所有继承分支和依赖项,以在不使用实际 MFC 的情况下使用所有数据和方法模拟对象,但我想这将是一个真正的麻烦。 可能您将不得不创建一些简单的 MFC 层,如 dll,它将从您的代码中获取 HWND 句柄,然后将其包装到 CWnd 中,然后调用相机 SDK。您可能需要相同版本的 VC++ 6.0 来创建一个层以使其与您拥有的旧库一起工作。

【讨论】:

    【解决方案2】:

    如果 SDK 有一个接受 CWnd 的函数,那么它可能已经与 MFC 静态链接。这意味着您的项目现在依赖于客户端计算机上的 MFC dll。由于您现在绑定到 MFC,您不妨硬着头皮创建一个静态链接到 MFC 的 MFC 项目。我建议只创建一个简单的控制台 MFC 项目并从那里开始工作。

    【讨论】:

      【解决方案3】:

      如果有任何来自 MFC 库的类,则应用程序将依赖于 MFC。这是显而易见的。如果必须避免使用 MFC 库,请使用 HWND 而不是 CWnd,即使用 Win32 并创建窗口句柄并使用它。

      但是,由于相机 SDK 使用 CWnd 类,它已经依赖于 MFC。所以使用 MFC dll 应该没有问题。如果要避免使用 MFC,可以使用中间包装 dll,将 HWND 转换为 CWnd 并将其传递给 SDK 函数。

      主要应用:

      HWND m_hWnd;
      

      中间DLL(资源使用时应妥善处理):

      void Initialize (HWND hWnd)
      
      //Passing to SDK
      
             Initialize( CWnd::FromHandle(hWnd))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-27
        • 2011-07-20
        • 1970-01-01
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        相关资源
        最近更新 更多