在C#中编写ActiveX控件,但在MFC中使用它

时间:2012-02-13 15:54:25

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

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

以下是要求

  1. 主机应用程序(用VC6编写)必须能够从已注册的类别中查找并加载活动的x控件。
  2. 活动x控件必须支持属性页。
  3. 活动x控件必须支持属性持久性。
  4. 以下是问题

    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个步骤, AfxOleRegisterTypeLib CreateComponentCategory RegisterCLSIDInCategory 。我们如何在C#中实现它们?

    3. C#实现属性持久性的等效方法是什么?
    4. 提前感谢您的任何评论和帮助!!!

1 个答案:

答案 0 :(得分:2)

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

我的理解是,技术上可以在C#中自己完成,只要你导入正确的COM接口然后在你的组件中正确实现它们,这将是很多工作。

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

免责声明:我没有处理属性页面或属性持久性。