Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.07.2009, 17:55   #1
PAUK
 
Регистрация: 07.07.2009
Сообщений: 3
По умолчанию Масса вопросов по COM (OUT-OF-PROC)

Всю голову поломал. Надеюсь кто нибудь тут хоть чем то поможет. Значит суть вопроса №1 вот в чем:
имеется exe OutOfProc ком сервер. Имеется клиент на C#.
через ProgId получается CLSID и соответственно тип объекта и далее сам объект. Так вот как раз объект создаться не может. Никаких ошибок не вылетает, ничего не происходит. Клиент просто висит.
вот кусок кода клиента :

Код:
            Type typeofOPCserver = Type.GetTypeFromProgID(clsidOPCserver);
            if (typeofOPCserver == null)
                Marshal.ThrowExceptionForHR(0);
            try
            {
                OPCserverObj = Activator.CreateInstance(typeofOPCserver); - Тут собственно и висит.
            }
            catch (Exception ee)
            { 
            
            }
Проверял с другими серверами. Все работает нормально. У меня же пока сервер не прекратит работу - клиент висит. Пытался выкинуть сервер в отдельный поток - не помогло.

Вопрос номер 2:

Возможно проблема краится в регистрации ком сервера. Возможно кто нибудь может дать какой нибудь шаблон для регистрации COM OutOfProc сервера.

я свой регистрирую следующим образом :

Код:
/// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Guid srv_guid = new Guid("7F7F5947-DFFE-3DC4-B1DD-60F946C10EBD");

            RegistryKey appkey = null;
            RegistryKey key = null;
            RegistryKey keyIC = null;
            RegistryKey keyIC1 = null;
            RegistryKey keyIC2 = null;
            RegistryKey key2 = null;
            RegistryKey key3 = null;
            RegistryKey key4 = null;
            RegistryKey key5 = null;
            try
            {
                appkey = Registry.ClassesRoot.CreateSubKey("AppId\\" + System.Windows.Forms.Application.ProductName + ".exe");
                appkey.SetValue("AppId", srv_guid.ToString("B"));
                key = Registry.ClassesRoot.CreateSubKey("CLSID\\" + srv_guid.ToString("B"));
                keyIC = key.CreateSubKey("Implemented Categories");
                keyIC1 = keyIC.CreateSubKey("{63D5F430-CFE4-11D1-B2C8-0060083BA1FB}");
                keyIC2 = keyIC.CreateSubKey("{63D5F432-CFE4-11D1-B2C8-0060083BA1FB}");
                key.SetValue(null, "BEMN.OPC_ServerDA_205.SERVER");
                key.SetValue("AppId", srv_guid.ToString("B"));
                key2 = key.CreateSubKey("LocalServer32");
                key2.SetValue(null, System.Windows.Forms.Application.ExecutablePath);
                key3 = key.CreateSubKey("ProgId");
                key3.SetValue(null, "BEMN.OPC_ServerDA_205.SERVER");
                key4 = Registry.ClassesRoot.CreateSubKey(System.Windows.Forms.Application.ProductName);
                key5 = key4.CreateSubKey("CLSID");
                key5.SetValue(null, srv_guid.ToString("B"));
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error while registering the server:\n" + ex.ToString());
            }
            finally
            {
                if (key != null)
                    key.Close();
                if (key2 != null)
                    key2.Close();
                if (key3 != null)
                    key3.Close();
            }

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
извините за переменные типа key2,key3. Уже не заморачивался над красотой. Главная цель чтобы хоть как то заработало. Потом марафет наведу.


Очень надеюсь на чью либо помощь в данном вопросе. Разыскиваю Гуру COM и реестра!
PAUK вне форума Ответить с цитированием
Старый 26.07.2009, 18:02   #2
armivl
Пользователь
 
Регистрация: 26.07.2009
Сообщений: 19
По умолчанию

Регистрирую свой OPC Server DA вот так, все отлично работает

Код:
RegistrationServices regServ = new RegistrationServices();

                    System.IO.FileStream fsGac = System.IO.File.Create(System.IO.Path.Combine(System.Environment.SystemDirectory, "gacutil.exe"));
                    fsGac.Write(Armivl.Properties.Resources.gacutil, 0, Armivl.Properties.Resources.gacutil.Length);
                    fsGac.Close();
//добавляю сборку в GAC
                    System.Diagnostics.Process.Start(System.IO.Path.Combine(System.Environment.SystemDirectory, "gacutil.exe"),
                        "/i " + String.Format(@"""{0}", System.IO.Path.Combine(System.Environment.CurrentDirectory, Assembly.GetExecutingAssembly().GetName().Name + ".exe")));

                    regServ.RegisterTypeForComClients(typeof(OPCServer), RegistrationClassContext.LocalServer, RegistrationConnectionType.MultipleUse);
//запускаю сервер для того, чтобы он прописался в ComponentServices
                    OPCServer serv = new OPCServer();

                    RegistryKey regkey = Registry.ClassesRoot;
                    RegistryKey opcVend = regkey.CreateSubKey(@"Armivl.OPCServer\OPC\Vendor");
                    RegistryKey opcCLSID = regkey.CreateSubKey(@"CLSID\{6D01D76E-43CD-499F-82DB-B507972B27B4}\Implemented Categories\{CC603642-66D7-48F1-B69A-B625E73652D7}");
                    opcVend.SetValue("", "Armivl");
                    serv.Dispose();

                    regkey.Close();

Последний раз редактировалось MaTBeu; 26.07.2009 в 18:56.
armivl вне форума Ответить с цитированием
Старый 30.07.2009, 17:34   #3
PAUK
 
Регистрация: 07.07.2009
Сообщений: 3
По умолчанию

У тебя OUT OF PROCESS Exe сервер в виде простого COM?
PAUK вне форума Ответить с цитированием
Старый 30.07.2009, 17:37   #4
PAUK
 
Регистрация: 07.07.2009
Сообщений: 3
По умолчанию

Если можешь напиши в ICQ - 412948357
PAUK вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Куча вопросов vilini Работа с сетью в Delphi 1 18.08.2008 11:56
Запрет на read table или execute proc <name_proc> Lunatikus БД в Delphi 2 27.02.2008 11:26
Пара вопросов... ~N@um~ Помощь студентам 6 14.07.2007 09:49
Пара вопросов. Kukkk Общие вопросы Delphi 5 03.07.2007 11:40