0 / 0 / 0
Регистрация: 31.12.2013
Сообщений: 4
1

Внутренний сервер COM как локальный

17.01.2014, 14:13. Показов 2113. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Есть COM сервер в dll. Если обращаться к нему как к внутреннему - все работает. Однако при попытках обратиться как local процессу(с помощью dllhost), запускается dllhost c моей дллкой, создается экземпляр сервера, но при фабрика почему-то в итоге возвращает REGDB_E_IIDNOTREG. В связи с этим вопрос - каким образом правильно сделать так, чтобы внутренний сервер COM запустить как локальный?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.01.2014, 14:13
Ответы с готовыми решениями:

Как перенаправить почту домена на внутренний сервер?
Добрый день! Вопрос следующий: Есть зарегистрированный домен: domen.com на котором крутится сайт,...

Как локальный сервер сделать глобальным
Прив. Установлено Apache+php+mysql+phpmyadmin. Зарегал хост на no-ip. Скачал спец прогу, которая...

Как зарегистрировать новый локальный сервер?
Подскажитн как зарегистрировать новый локальный сервер. в доступных серверах ничего нет.

Как отправить запрос на локальный сервер?
Всем привет! Подскажите, кто в курсе, как отправить POST запрос на локальный сервер. Задумка такая:...

5
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
17.01.2014, 14:40 2
Цитата Сообщение от JetSQ Посмотреть сообщение
Однако при попытках обратиться как local процессу(с помощью dllhost), запускается dllhost c моей дллкой, создается экземпляр сервера, но при фабрика почему-то в итоге возвращает REGDB_E_IIDNOTREG.
Как я понимаю, речь идет об DllSurrogate ?
COM-сервер должен быть правильно зарегистрирован: должны быть все нужные
значения в разделах CLSID, AppID, TypeLib и Interface.
У меня, помню, COM-сервер не хотел работать в dllhost, пока я не добавил
запись ProxyStubClsid32 в его <clsid> ключ реестра.
1
0 / 0 / 0
Регистрация: 31.12.2013
Сообщений: 4
17.01.2014, 15:26  [ТС] 3
Цитата Сообщение от Убежденный Посмотреть сообщение
Как я понимаю, речь идет об DllSurrogate ?
COM-сервер должен быть правильно зарегистрирован: должны быть все нужные
значения в разделах CLSID, AppID, TypeLib и Interface.
У меня, помню, COM-сервер не хотел работать в dllhost, пока я не добавил
запись ProxyStubClsid32 в его <clsid> ключ реестра.
Да, o DllSurrogate. В книжке написано, что чтобы работало нужно добавить appid запись в clisd и создать appid ключ с записью DllSurrogate. Интерфейсы в реестре надо добавлять и в полноценных экзешниках и в сурогатах?
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,422
17.01.2014, 15:55 4
в реестр надо добавлять всегда. все что работает без него - фокус. как вариант для экспериментов - проект com_server_test (clear).rar лежащий в https://www.cyberforum.ru/com-... ost3538077
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
17.01.2014, 16:00 5
Цитата Сообщение от JetSQ Посмотреть сообщение
В книжке написано, что чтобы работало нужно добавить appid запись в clisd и создать appid ключ с записью DllSurrogate.
Что за книжка, если не секрет ?

Интерфейсы в реестре надо добавлять и в полноценных экзешниках и в сурогатах?
У меня в одном проекте сделано так (псевдокод):
Код
HKEY_CLASSES_ROOT
{
    AppID
    {
        <clsid>
        {
            REG_SZ @Default@ = "SomeName"
            REG_SZ DllSurrogate = ""
        }
    }

    CLSID
    {
        <clsid>
        {
            REG_SZ @Default@ = "SomeName"
            REG_SZ AppID = <clsid>

            InprocServer32
            {
                REG_SZ @Default@ = "path-to-dll"
                REG_SZ ThreadingModel = Both
            }

            TypeLib
            {
                REG_SZ @Default@ = <libid>
            }
        }
    }

    Interface
    {
        <iid>
        {
            REG_SZ @Default@ = "SomeName"
            
            ProxyStubClsid32
            {
                REG_SZ @Default@ = {00020424-0000-0000-C000-000000000046}
            }

            TypeLib
            {
                REG_SZ @Default@ = <libid>
                REG_SZ Version = 1.0
            }                
        }
    }

    TypeLib
    {
        <libid>
        {
            1.0
            {
                REG_SZ @Default@ = "SomeName"

                0
                {
                    win32
                    {
                        REG_SZ @Default@ = "path-to-typelib"
                    }
                }

                FLAGS
                {
                    REG_SZ @Default@ = 0
                }
            }
        }
    }
}
Здесь схематично показана структура записей в реестре, необходимых для регистрации COM-сервера.
@Default@ - это значение ключа реестра по умолчанию.
SomeName - это названия соответствующих компонентов, например MyComServer Type Library.
Они в 99% случаев опциональны, но на всякий случай привожу все, чтобы не искажать картину.
<clsid> - это ID COM-класса, <iid> - это ID интерфейса, <libid> - ID библиотеки типов.
path-to-dll указывает на путь к dll-ке, а path-to-typelib - путь к библиотеке типов.
Если у вас библиотека типов "вживлена" в dll как ресурс, то эти пути будут совпадать.
Вручную нужно заносить только CLSID и AppID, а TypeLib и Interface создаются автоматически,
при регистрации библиотеки типов с помощью функции RegisterTypeLib.
ThreadingModel может быть любой, у меня стоит "Both", например.

Пара моментов.

1) Все типы, использующиеся в COM-сервере, должны быть совместимыми с Automation,
иначе система не сможет маршаллить их между процессами.

2) Интерфейсы, которые будут вызываться через границы процессов, должны быть
помечены атрибутом oleautomation.

3) Для создания inproc-сервера в dllhost следует использовать CoCreateInstance с
флагом CLSCTX_LOCAL_SERVER.

4) Не забывайте вызывать CoInitialize(Ex) на клиенте.
1
0 / 0 / 0
Регистрация: 31.12.2013
Сообщений: 4
19.01.2014, 23:38  [ТС] 6
Цитата Сообщение от Убежденный Посмотреть сообщение
Что за книжка, если не секрет ?
"Троелсен. Модель Com", и вот эта: http://thrysoee.dk/InsideCOM+/ch12b.htm

Большое спасибо! попробую по вашей схеме.
0
19.01.2014, 23:38
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.01.2014, 23:38
Помогаю со студенческими работами здесь

Python + локальный сервер, как настроить
Здравствуйте. Возник вопрос того как настроить Пайтон на локальном сервере. Возможно он банален, но...

Локальный сервер SQL ,как перенести ?
Создал проект , связал с базой sql server которая расположена на пк тоесть localhost. Появился...

Как установить и настроить локальный web-сервер?
Здравствуйте мои люимые формучане! по рядом некоторых причин мне пришлось изменить Мелкософту и...

Как в Tor Browser настроить локальный сервер?
Хочу настроить Tor что б воспринимал локальный сервер. Когда я пишу в адресной строке браузера...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как подключить JavaScript файл в другом JavaScript файле
InfoMaster 20.01.2025
В современной веб-разработке организация кодовой базы играет ключевую роль в создании масштабируемых и поддерживаемых приложений. Модульность и правильное структурирование кода стали неотъемлемыми. . .
Как откатить изменения в исходниках, не внесенные в Git
InfoMaster 20.01.2025
При работе с системой контроля версий Git разработчики часто сталкиваются с необходимостью отменить внесенные изменения в исходном коде. Особенно актуальной становится ситуация, когда изменения еще. . .
В чем разница между px, in, mm, pt, dip, dp, sp
InfoMaster 20.01.2025
В мире цифрового дизайна и разработки интерфейсов правильный выбор единиц измерения играет ключевую роль в создании качественного пользовательского опыта. История развития систем измерений для. . .
Как изменить адрес удалённого репозитория (origin) в Git
InfoMaster 20.01.2025
В терминологии Git термин origin является стандартным именем для основного удаленного репозитория, с которым взаимодействует локальная копия проекта. Когда разработчик клонирует репозиторий с. . .
Как переместить последние коммиты в новую ветку (branch) в Git
InfoMaster 20.01.2025
При работе над проектом часто возникают ситуации, когда необходимо изолировать определенные изменения от основной линии разработки. Это может быть связано с экспериментальными функциями, исправлением. . .
Как вернуть результат из асинхронной функции в JavaScript
InfoMaster 20.01.2025
Асинхронное программирование представляет собой фундаментальную концепцию в JavaScript, которая позволяет выполнять длительные операции без блокировки основного потока выполнения программы. В. . .
Какой локальный веб-сервер выбрать
InfoMaster 19.01.2025
В современной веб-разработке локальные веб-серверы играют ключевую роль, предоставляя разработчикам надежную среду для создания, тестирования и отладки веб-приложений без необходимости использования. . .
Почему планшеты и iPad уже не так популярны, как раньше
InfoMaster 19.01.2025
Эра революционных инноваций История планшетов началась задолго до того, как эти устройства стали привычными спутниками нашей повседневной жизни. В начале 1990-х годов появились первые прототипы,. . .
Как самому прошить BIOS ноутбука
InfoMaster 19.01.2025
BIOS (Basic Input/ Output System) представляет собой важнейший компонент любого компьютера или ноутбука, который обеспечивает базовое взаимодействие между аппаратным и программным обеспечением. . .
Какой Linux выбрать для домашнего компьютера
InfoMaster 19.01.2025
Современные реалии выбора операционной системы В современном мире выбор операционной системы для домашнего компьютера становится все более важным решением, которое может существенно повлиять на. . .
Как объединить два словаря одним выражением в Python
InfoMaster 19.01.2025
В мире программирования на Python работа со словарями является неотъемлемой частью разработки. Словари представляют собой мощный инструмент для хранения и обработки данных в формате "ключ-значение". . . .
Как без исключения проверить существование файла в Python
InfoMaster 19.01.2025
При разработке программного обеспечения на Python часто возникает необходимость проверить существование файла перед выполнением операций с ним. Это критически важная задача, которая помогает избежать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru