Проблема создания вкладки в дереве документа со своим UserControl на C#

Автор bitteehan, 09.04.14, 06:59:19

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

bitteehan

Здравствуйте, есть проблема при создании вкладки в дереве документов (AddTab)  со своим UserControl написанным на C#, сама библиотека ActiveX подключается, вкладка создается только с указанием ocxProgID = "VCTree.VCTreeCtrl.1 из примера
AddTab("NameTab", "VCTree.VCTreeCtrl.1"). Подскажите пожалуйста, в чем ошибка?

Здесь произвожу регистрацию userControl:

using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using Microsoft.Win32;
using CopmassAddIn;


namespace CCompass
{
    [ComVisible(true),
    ClassInterface(ClassInterfaceType.AutoDispatch),
    Guid("D780F2DE-5467-4639-9B4E-D8349C86F0D8"),
    ProgId("CCompass.CompassControl")]
    public partial class CompassControl : UserControl
    {
        public CompassControl()
        {
            InitializeComponent();
        }

        [ComRegisterFunction]
        public static void RegisterClass(string key)
        {
            StringBuilder stringBuilder = new StringBuilder(key);
            stringBuilder.Replace("HKEY_CLASSES_ROOT\\", "");
            RegistryKey registryKey = Registry.ClassesRoot.OpenSubKey(stringBuilder.ToString(), true);
            RegistryKey registryKey2 = registryKey.CreateSubKey("Control");
            registryKey2.Close();
            RegistryKey registryKey3 = registryKey.OpenSubKey("InprocServer32", true);
            registryKey3.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);
            registryKey3.Close();
            registryKey.Close();
        }

        [ComUnregisterFunction]
        public static void UnregisterClass(string key)
        {
            StringBuilder stringBuilder = new StringBuilder(key);
            stringBuilder.Replace("HKEY_CLASSES_ROOT\\", "");
            RegistryKey registryKey = Registry.ClassesRoot.OpenSubKey(stringBuilder.ToString(), true);
            registryKey.DeleteSubKey("Control", false);
            registryKey.OpenSubKey("InprocServer32", true);
            registryKey.DeleteSubKey("CodeBase", false);
            registryKey.Close();
        }

    }
}


Здесь создаю вкладку со своим UserControl:

#if (__LIGHT_VERSION__)
   using Kompas6LTAPI5;
   using KompasLTAPI7;
#else
   using Kompas6API5;
   using KompasAPI7;
#endif

using System;
using System.Drawing;
using System.Reflection;
using System.Collections;
using KAPITypes;
using Kompas6Constants;
using Kompas6Constants3D;
using CCompass;
using Microsoft.Win32;


using reference = System.Int32;

namespace CopmassAddIn
{
      private static CompassControl m_Control;

        public static void CreateAndSubscriptionPropertyManager(bool mes)
        {
                IKompasDocument doc = NewKompasAPI.ActiveDocument;

                IDocumentFrames frames = doc.DocumentFrames;

                IDocumentFrame frame = null;

                if (frames.Count > 0) frame = frames[0];

                IFrameTreesManager FrameMng = (IFrameTreesManager)frame;

                if (FrameMng != null)
                {
                    object tab = FrameMng.AddTab("NameTab", "CCompass.CompassControl");

                    //object tab = FrameMng.AddTab("NameTab", "VCTree.VCTreeCtrl.1");

                    FrameMng.ActiveTab = tab;
                }

        }
}

Здесь регистрирую библиотеку:

#if (__LIGHT_VERSION__)
   using Kompas6LTAPI5;
   using KompasLTAPI7;
#else
   using Kompas6API5;
   using KompasAPI7;
#endif

using System;
using Microsoft.Win32;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using KAPITypes;
using Kompas6Constants;
using Kompas6Constants3D;

using reference = System.Int32;

namespace CopmassAddIn
{
   // Класс Step12 - Пример создания пользовательской панели свойств
  [ClassInterface(ClassInterfaceType.AutoDual)]
   public class CompassAddIn
   {
      // Имя библиотеки
      [return: MarshalAs(UnmanagedType.BStr)] public string GetLibraryName()
      {
                    return "Новая библиотека";
      }
      

      // Головная функция библиотеки
      public void ExternalRunCommand([In] short command, [In] short mode, [In, MarshalAs(UnmanagedType.IDispatch)] object kompas_)
      {
         Global.Kompas = (KompasObject)kompas_;
         Global.NewKompasAPI = (IApplication)Global.Kompas.ksGetApplication7();

         switch (command)
         {
            case 1 :   // Создать закладку и подписаться
               Global.CreateAndSubscriptionPropertyManager(true);
               break;
            case 2 :   // Отписаться
               //Global.ClosePropertyManager(true);   // Запоминаем положение панели и гасим ее
               break;
                               case 3 :
                                     //Global.CreateAndSubscriptionPropertyManager1();
                                break;
         }
      }


      // Формирование меню библиотеки
      [return: MarshalAs(UnmanagedType.BStr)]   public string ExternalMenuItem(short number, ref short itemType, ref short command)
      {
         string result = string.Empty;   //По уполчанию - пустая строка
         itemType = 1;               //MENUITEM

         switch (number)
         {
            case 1:
               result = "Создать закладку и подписаться";
               command = 1;
               break;
            case 2:
               result = "Отписаться";
               command = 2;
               break;
                case 3:
                    result = "Add tree";
                    command = 3;
                    break;
            case 4:
               itemType = 3;         //ENDMENU
               command = -1;
               break;
         }

         return result;
      }


      #region COM Registration
      // Эта функция выполняется при регистрации класса для COM
      // Она добавляет в ветку реестра компонента раздел Kompas_Library,
      // который сигнализирует о том, что класс является приложением Компас,
      // а также заменяет имя InprocServer32 на полное, с указанием пути.
      // Все это делается для того, чтобы иметь возможность подключить
      // библиотеку на вкладке ActiveX.
      [ComRegisterFunction]
      public static void RegisterKompasLib(Type t)
      {
         try
         {
            RegistryKey regKey = Registry.LocalMachine;
            string keyName = @"SOFTWARE\Classes\CLSID\{" + t.GUID.ToString() + "}";
            regKey = regKey.OpenSubKey(keyName, true);
            regKey.CreateSubKey("Kompas_Library");
            regKey = regKey.OpenSubKey("InprocServer32", true);
            regKey.SetValue(null, System.Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\mscoree.dll");
            regKey.Close();
         }
         catch (Exception ex)
         {
            MessageBox.Show(string.Format("При регистрации класса для COM-Interop произошла ошибка:\n{0}", ex));
         }
      }
      
      // Эта функция удаляет раздел Kompas_Library из реестра
      [ComUnregisterFunction]
      public static void UnregisterKompasLib(Type t)
      {
         RegistryKey regKey = Registry.LocalMachine;
         string keyName = @"SOFTWARE\Classes\CLSID\{" + t.GUID.ToString() + "}";
         RegistryKey subKey = regKey.OpenSubKey(keyName, true);
         subKey.DeleteSubKey("Kompas_Library");
         subKey.Close();
      }
      #endregion
   }
}



Ваш компонент в системе зарегистрирован?

bitteehan

Да зарегистрирован и определяется в компасе

Если функция object tab = FrameMng.AddTab("NameTab", "CCompass.CompassControl"); возвращает не nul, то проблема скорее всего в самом компоненте.

bitteehan

при проверке  tab = FrameMng.AddTab("NameTab", "CCompass.CompassControl") возвращает null, сам контрол(CCompass.CompassControl) проверял в других программа он работает.