• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Реализация конвертера на C# ...что делаю не так? Вопрос разработчикам!

Автор MasterMVC, 15.12.13, 11:56:23

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

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

MasterMVC

На базе примера Step1 SDK создаю маленький конвертер на С#. Там добавляю функции: LIBRARYID,GetIKompasConverter() и LIBRARYENTRY (int comm) код класса:
// Класс Step1 - Самая простая библиотека на C#
    public class Step1
   {
      // Имя библиотеки
      [return: MarshalAs(UnmanagedType.BStr)] public string GetLibraryName()
      {
         return "Step1 - Самая простая библиотека на C#";
      }
      public void ExternalRunCommand([In] short command, [In] short mode, [In, MarshalAs(UnmanagedType.IDispatch)] object kompas_)
      {
         KompasObject kompas = (KompasObject) kompas_;
         kompas.ksMessage("Привет!");
      }
      #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

        public static int LIBRARYID()
        {
            save("LIBRARYID");
            return 1005;
        }
        public static void LIBRARYENTRY(uint comm)
        {
            switch (comm)
            {
                case 1: // Конвертировать файл
                    {
                        save("LIBRARYENTRY");
                        break;
                    }
            }
        }
        public static IKompasConverter GetIKompasConverter()
        {
            KompasConverter KompasConverter = new KompasConverter();
            save("GetIKompasConverter");
            return KompasConverter;
        }

        // HINSTANCE модуля с ресурсами
        public  object ExternalGetResourceModule()
        {
            save("ExternalGetResourceModule");
            return Assembly.GetExecutingAssembly().Location;
        }
        private static void save(string str)
        {
            String str1;
            str1 = str;
            String PathName = "d:/save+" + str + ".txt";
            System.IO.StreamWriter st = new System.IO.StreamWriter(PathName, false);
            st.Write(str);
            st.Close();
            st.Dispose();
        }
    }

где в методе GetIKompasConverter()  инициализирую класс KompasConverter. Код класса:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using KompasAPI7;
using CONVERTLIBINTERFACES;
public class KompasConverter : IKompasConverter
    {
        public bool CanUnloadLibrary
        {

            get
            {
                save("CanUnloadLibrary");
                return true;
            }
        }

        public int Convert(string inputFile, string outfile, int command, bool showParam)
        {
            save("Convert");
            String NameMy = "";
            NameMy = inputFile;
            return 1;
        }
        public object ConverterParameters(int command)
        {
            save("ConverterParameters");
            return this;
        }

        public string GetFilter(int docType, bool saveAs, out int command)
        {
            save("GetFilter");
            command = 1;
            return @"ArcCADa-формат (*.myfrw )|*.myfrw|";
        }

        public bool VisualEditConvertParam(int parentHwnd, int command)
        {
            save("VisualEditConvertParam");
            return false;
        }
        private void save(string str)
        {
            String str1;
            str1 = str;
            String PathName = "d:/save+" + str + ".txt";
            System.IO.StreamWriter st = new System.IO.StreamWriter(PathName, false);
            st.Write(str);
            st.Close();
            st.Dispose();
        }
    }

Затем регистрирую в регистре(regedit.exe) по примеру в SDK. Код файла регистра:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\ASCON\KOMPAS-3D\Converters\LibConverter]
@=dword:00000000
"Path"="C:\\Program Files (x86)\\ASCON\\KOMPAS-3D V11\\SDK\\C#\\Automation\\Step1\\obj\\Debug\\Step1.dll"
"Name"="Пример конвертера"
"Connect"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\ASCON\KOMPAS-3D\Converters\LibConverter\frw]
@=dword:00000000
"Filter"="Файлы фрагментов(*.myfrw)|*.myfrw|"
"OpenCommandID"=dword:00000009
"SaveCommandID"=dword:00000003
"OpenConverterParameters"=dword:00000001
"SaveConverterParameters"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\ASCON\KOMPAS-3D\Converters\LibConverter\cdw]
@=dword:00000000
"Filter"="Файлы чертежей(*.mycdw)|*.mycdw|"
"OpenCommandID"=dword:0000000a
"SaveCommandID"=dword:00000004
"OpenConverterParameters"=dword:00000001
"SaveConverterParameters"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\ASCON\KOMPAS-3D\Converters\LibConverter\spw]
@=dword:00000000
"Filter"="Файлы спецификаций(*.myspw)|*.myspw|"
"OpenCommandID"=dword:0000000b
"SaveCommandID"=dword:00000005
"OpenConverterParameters"=dword:00000001
"SaveConverterParameters"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\ASCON\KOMPAS-3D\Converters\LibConverter\kdw]
@=dword:00000000
"Filter"="Файлы текстовых документов(*.mykdw)|*.mykdw|"
"OpenCommandID"=dword:0000000c
"SaveCommandID"=dword:00000006
"OpenConverterParameters"=dword:00000001
"SaveConverterParameters"=dword:00000001


где C:\\Program Files (x86)\\ASCON\\KOMPAS-3D V11\\SDK\\C#\\Automation\\Step1\\obj\\Debug\\Step1.dll путь к моей dll.
После регистрации в окне сохранения(открытия) KOMPAS появляются новые форматы. Но при сохранении открытии ничего не происходит


Может кто встречался с данной проблемой. В SDK есть пример Myconverter на C++, но в C++ к сожалению я не силен. И вообще это возможно сделать на C#.
Буду признателен любой помощи.




MasterMVC


GkmSoft

Компас 32-битный?

проверьте что Вы пишете в 32-битный реестр тоже...
в [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ASCON ...
+ Благодарностей: 1