Получить информацию или свойства COM-объектов

Я пишу инструмент, в котором у меня есть COM-компонент (например, DLL) с файлом манифеста (Sxs/RegFree). Мой инструмент перебирает все идентификаторы классов и должен проверить, могу ли я создать экземпляр с этим идентификатором класса.

НО, есть некоторые проблемы. Некоторые COM-объекты (классы) запрограммированы таким образом, что я не могу создать экземпляр, потому что это просто запрещено.

В одной из моих итераций мой инструмент дает сбой, потому что он хочет создать экземпляр из объекта, где это запрещено. Даже попытка... catch не помогает. При отладке с Visual Studio 2013 получаю информацию, что произошла ошибка с кучей.

Итак, мой вопрос: как-то возможно получить некоторую информацию о COM-объекте, например, может ли кто-то создать экземпляр из этого идентификатора класса перед созданием экземпляра?

EDIT: Вот код, в котором я создаю экземпляр:

var clsid = new Guid(guid);
Guid IID_IUnknown = new Guid("00000000-0000-0000-C000-000000000046");
object instance = null;
hResult = CoCreateInstance(ref clsid, null, CLSCTX_INPROC_SERVER, ref IID_IUnknown, out instance);
if (hResult > 0x7FFFFFFF)
{
    // ...
}

person starki    schedule 16.01.2015    source источник
comment
Много проблем с этим подходом. Но, конечно же, прежде всего, вы делаете это неправильно.   -  person Hans Passant    schedule 16.01.2015
comment
@HansPassant: Нет, это не решение. Мой манифест работает, потому что я могу создавать экземпляры для многих идентификаторов классов. Но есть специальный Class-ID с классом, где я получаю ошибку кучи. Но DLL загружается, потому что я могу создавать экземпляры из той же DLL, но с другими идентификаторами класса.   -  person starki    schedule 16.01.2015
comment
Я не предлагал решение, просто указал, что вы делаете это неправильно. Нет смысла следовать этому подходу, такой COM-компонент никогда не сможет работать на практике. Что бы вы ни делали, это также должно быть очень неправильно, ошибки кучи — очень неприятные ошибки.   -  person Hans Passant    schedule 16.01.2015
comment
@HansPassant: я добавил свой код C# выше, где я хочу создать экземпляр. Данный GUID обычно создает экземпляр из этого COM-объекта. Без ошибок. Но со специальным GUID я получаю ошибку кучи. Но когда я делаю что-то не так (и извините за это, я не знаю, что), как это исправить?   -  person starki    schedule 16.01.2015
comment
Нет смысла делать это таким образом, когда вы можете использовать Type.GetTypeFromCLSID(). Для диагностики ошибок кучи требуется отладка машинного кода.   -  person Hans Passant    schedule 16.01.2015
comment
Если вы получаете ошибку кучи, значит, в DLL есть ошибка. Свяжитесь с продавцом.   -  person Raymond Chen    schedule 16.01.2015


Ответы (1)


Некоторые CLSID не имеют прямого доступа, они предназначены для системы COM только при создании реальных объектов. Когда вы создаете объект типа "VBScript" CLSID:
"{B54F3741-5B07-11CF-A4B0-00AA004A55E8}"
COM автоматически создает другой объект для внутреннего использования, подобный этому:
{00000323-0000-0000 -C000-000000000046} (CLSID_StdGlobalInterfaceTable)
Подобно последнему есть много других только для администрирования. См.:
Назначения стандартов

person lsalamon    schedule 16.01.2015