Как определить, является ли библиотека COM или DCOM?

Мне была поставлена ​​задача воссоздать DLL с небольшими модификациями исходной DLL, которая будет выполнена при запуске другой программы. По сути, это макет DLL для тестирования / моделирования других частей более крупной системы.

Я искал, есть ли какой-либо способ проверить, является ли библиотека COM или DCOM, но не нашел. Мне известно о различия, но учитывая библиотеку DLL, как я могу определить, является ли она библиотекой COM или DCOM?

Кроме того, есть ли способ заменить библиотеку COM / DCOM на более новую технологию, но не изменять части кода, вызывающие библиотеку COM / DCOM?


person matrixanomaly    schedule 19.06.2015    source источник
comment
Почти каждый COM-сервер поддерживает DCOM без изменения исполняемого файла, требуется лишь дополнительная настройка. Сосредоточьтесь на том, как это происходит прямо сейчас.   -  person Hans Passant    schedule 19.06.2015
comment
Спасибо за совет. Заглядывая в это!   -  person matrixanomaly    schedule 19.06.2015


Ответы (2)


Имея только исполняемый код, вы не можете сказать, какой это, за исключением того, что если с ним поставляется прокси / заглушка dll, вы можете предположить, что это DCOM.

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

person sharptooth    schedule 22.06.2015
comment
Я заметил, что в COM используются функции cocreateInstance, а в DCOM - cocreateInstanceEx, а другой код, вызывающий исполняемый код, использует их. это возможный способ определить, является ли библиотека COM или DCOM? - person matrixanomaly; 22.06.2015
comment
@matrixanomaly CoCreateInstanceEx() позволяет создать экземпляр сервера DCOM на другом компьютере, однако вы также можете использовать CoCreateInstance() для его создания на том же компьютере. - person sharptooth; 22.06.2015

Ух ты, здесь ты идешь в олдскул!

Если я правильно помню, любой допустимый COM-объект также может участвовать в DCOM. Разве соединение для удаленных вызовов процедур не выполняется на уровне операционной системы?

Из https://msdn.microsoft.com/en-us/library/aa295360(v=vs.60).aspx:

После того, как COM был адаптирован для работы в сети, любой интерфейс, который не был привязан к локальной модели выполнения (некоторые интерфейсы изначально полагались на средства локального компьютера, такие как те интерфейсы рисования, методы которых имеют дескрипторы контекстов устройства в качестве параметров), будет иметь возможность распространения: потребитель интерфейса сделает запрос для данного интерфейса; этот интерфейс может быть предоставлен экземпляром объекта, запущенного (или подлежащего запуску) на другом компьютере. Механизм распространения внутри COM будет соединять потребителя с поставщиком таким образом, чтобы вызовы методов, сделанные потребителем, появлялись на стороне поставщика, где они и выполнялись. Затем любые возвращаемые значения будут отправлены обратно потребителю. Во всех смыслах и целях акт распространения прозрачен как для потребителя, так и для поставщика.

Такое разнообразие COM сейчас действительно существует. DCOM (для «распределенного COM») поставляется с версиями Windows NT, начиная с версии 4.0. С конца 1996 года он также доступен для Windows 95 и ее производных. В обоих случаях DCOM включает набор заменяющих и дополнительных DLL с некоторыми утилитами, которые обеспечивают как локальные, так и удаленные возможности COM. Таким образом, теперь он является неотъемлемой частью платформ на базе Win32 и со временем будет доступен на других платформах другими организациями.

person Robert Moskal    schedule 19.06.2015
comment
Да, я правильно понимаю, моя текущая стажировка заставляет меня пытаться заменить библиотеку на макеты функций, которые возвращают истину / ложь, чтобы протестировать большую часть системы. Не помогает. У меня нет источника указанной библиотеки. Все, кто занимался COM / DCOM (не так уж и много), стонут и меня жалко, когда я об этом говорю. Спасибо. - person matrixanomaly; 19.06.2015
comment
COM до сих пор используется повсюду в Windows. DCOM не всегда означает транзакцию. Это просто причудливое название, которое они придумали, когда добавили возможность выполнения COM через сеть. В то же время и по этой причине они удалили жесткую зависимость от сообщений Windows для межпроцессного взаимодействия, хотя они все еще используются / могут использоваться. - person Simon Mourier; 19.06.2015