2012-02-13 64 views
1

當前項目全部寫入VC6VB6。已經證明.Net可以編寫用於MFC使用的Active X控件。所以我們想用遺留代碼中的最小變化來編寫一些使用.Net的活動x控件。在C#中編寫ActiveX控件,但在MFC中使用它

這裏是要求

  1. 宿主應用程序(用VC6)必須能夠找到並加載從註冊類別中的Active 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#中實現屬性持久性的等效方式?

預先感謝您的任何意見和幫助!

回答

2

我不得不編寫一個.NET ActiveX組件供遺留應用程序使用,而且我最初研究瞭如何在C#中實現它。雖然在C#中實現一個組件並不是非常困難,但它提供的最低限度滿足現代定義的「ActiveX組件」(即實現COM IUnknown接口),在C#中構建一個支持所有拖放操作的組件遺留應用程序開發人員使用我的組件所期望的易用性要求它實現許多其他COM接口。

我的理解是,在C#中自己做這件事在技術上是可行的,只要你導入正確的COM接口然後在你的組件中正確實現它們,這將是很多工作。我最終創建了一個正常的C#組件(沒有涉及ActiveX)來包含我所有的實際邏輯,然後在我的C#組件中創建了一個C++/CLI(AKA Managed C++)包裝器,該組件使用MFC提供必要的ActiveX功能。

聲明:我不必處理屬性頁面或屬性持久性。

+0

這給了我另一個想法,即混合MFC和託管C++代碼可能會滿足我的要求。非常感謝你! – james 2012-02-14 11:12:03

+0

混合MFC和託管C++將成爲我現在所期望的方法,因爲它對我來說顯然更容易,但主機應用程序必須用clr支持重新編譯。再次感謝。 – james 2012-02-15 10:07:47

+0

@james - 我很高興這個方向看起來對你的情況可行。你說過,「主機應用程序必須用clr支持重新編譯」;我不確定我是否明白這一點。在我的情況下,我在我的解決方案中創建了一個MFC ActiveX項目,該項目包含我的.NET組件的ActiveX包裝,因此該項目確實需要使用CLR支持進行編譯。儘管如此,宿主應用程序(使用ActiveX控件的GUI應用程序)並不需要知道.NET。 – 2012-02-15 17:21:31

相關問題