【问题标题】:Write ActiveX control in C# but use it in MFC在 C# 中编写 ActiveX 控件,但在 MFC 中使用它
【发布时间】:2012-03-05 00:48:53
【问题描述】:

目前的项目都是用VC6VB6编写的。事实证明,.Net 可以编写用于 MFC 的 Active X 控件。因此,我们希望使用 .Net 编写一些活动的 x 控件,同时对遗留代码进行最少的更改。

这是要求

  1. Host 应用程序(用 VC6 编写)必须能够从注册的类别中找到并加载活动的 x 控件。
  2. 活动的 x 控件必须支持属性页。
  3. 活动 x 控件必须支持属性持久性。

这是我的问题

  1. 是否可以使用 .Net WinForm 控件编写 Active X 属性页?以及如何在 C# 中的控件和对应的属性之间进行通信?
  2. 如何在C#中注册某个类别下的Active X控件?下面是一段 MFC 中关于控件注册的示例代码。

    STDAPI DllRegisterServer(void)
    {
    
    HRESULT hr;  
    
    AFX_MANAGE_STATE(_afxModuleAddrThis);
    
    if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
      return ResultFromScode(SELFREG_E_TYPELIB);
    
    if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
      return ResultFromScode(SELFREG_E_CLASS); 
    
    hr = CreateComponentCategory(CATID_CTRL_CAT, 
         L"XXXX");
    if (FAILED(hr))
      return hr;
    
    hr = RegisterCLSIDInCategory(CATID_CONTROL, 
         CATID_CTRL_CAT);
    if (FAILED(hr))
        return hr; 
    
    return NOERROR;
    }
    

    上面的注册有3个步骤,AfxOleRegisterTypeLibCreateComponentCategoryRegisterCLSIDInCategory。我们如何在 C# 中实现它们?

  3. 在 C# 中实现属性持久化的等效方法是什么?

提前感谢您的任何 cmets 和帮助!!!

【问题讨论】:

    标签: c# .net visual-c++ mfc activex


    【解决方案1】:

    我必须编写一个 .NET ActiveX 组件以供遗留应用程序使用,我最初探索在 C# 中实现它。虽然在 C# 中实现一个组件并提供最低限度以满足“ActiveX 组件”的现代定义(即实现 COM IUnknown 接口)并不难,但在 C# 中构建一个支持所有拖放的组件使用我的组件的遗留应用程序开发人员所期望的易用性要求它实现许多额外的 COM 接口。

    我的理解是,如果您导入正确的 COM 接口,然后在您的组件中正确实现它们,那么在 C# 中自己执行此操作在技术上是可行的,这将是很多工作。

    我最终创建了一个普通的 C# 组件(不涉及 ActiveX)来包含我所有的实际逻辑,然后我围绕我的 C# 组件创建了一个 C++/CLI(AKA 托管 C++)包装器,它使用 MFC 来提供必要的 ActiveX功能。

    免责声明:我不必处理属性页或属性持久性。

    【讨论】:

    • 这给了我另一个想法,混合 MFC 和托管 C++ 代码可能满足我的要求。真的非常感谢!
    • 混合 MFC 和托管 C++ 将是我目前想要的方法,因为它显然对我来说更容易,尽管必须使用 clr 支持重新编译主机应用程序。再次感谢。
    • @james - 我很高兴这个方向看起来适合您的情况。您说,“必须使用 clr 支持重新编译宿主应用程序”;我不确定我是否理解。就我而言,我在我的解决方案中创建了一个 MFC ActiveX 项目,其中包含我的 .NET 组件的 ActiveX 包装器,因此该项目确实需要使用 CLR 支持进行编译。不过,宿主应用程序(使用 ActiveX 控件的 GUI 应用程序)不需要了解 .NET。
    • 嗨@Dr。威利的学徒,这实际上是我想问的另一个问题。如果我的 activex 控件使用任何 winform 控件,我将无法运行主机程序。但是,如果我删除 winform 控件,一切正常。我添加的只是一个静态 mfc 控件,但将它与 MaskedTextBox 变量相关联并进行托管数据交换,仅此而已。这就是为什么我认为我必须重新编译宿主程序才能使其工作......但我没有宿主程序可以尝试......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多