Как да създадете екземпляр на COM обект на CLSID, без да знаете IID

Как мога да създам екземпляр на клас по неговия CLSID, без да знам нито един от интерфейсите, които прилага.

Например CLSID "{3ad05575-8857-4850-9277-11b85bdb8e09}" имплементира клас, извлечен от IFileOperation (в win7), но ако не знаех, че е извлечен от него, имаше ли някакъв начин за създаване на такъв обект или поне разберете кои интерфейси изпълнява този CLSID?

Благодаря! :-)


person TCS    schedule 16.02.2011    source източник


Отговори (2)


Дейвид е прав, винаги можете да поискате IUnknown. Но оттам ще се ударите в стената, COM не предоставя начин за откриване на внедрени интерфейси извън това, ако не знаете IID. Като се има предвид възможният брой стойности на GUID, няма практичен начин да „изпробвате всички“. Нито пък има много смисъл, ако случайно познаете IID правилно, все още нямате представа как правилно да извикате интерфейсния метод. Не знаете какви аргументи изисква, не знаете какво прави. Пазете се от IFormatDiskDrive.

Сървър, който е съвместим с автоматизация, обикновено предоставя библиотека с типове. Можете да изкопаете интерфейсите от това. Не че някога бихте го направили, вие оставяте вашия компилатор да направи това копаене.

Но с интерфейси на обвивка, които са базирани на IUnknown и по този начин не прилагат автоматизация (като IFileOperation), трябва да знаете какво искате да използвате предварително. Може също така да предаде този IID на CoCreateInstance веднага.

person Hans Passant    schedule 16.02.2011
comment
Има смисъл да се прави заявка за IDispatch, за да се види дали обектът е съвместим с автоматизация. Ако е, тогава можете да откриете методи и свойства с помощта на IDispatch. Но дори и в този случай няма начин да знаете всички интерфейси, които обектът може да поддържа. - person Paul Keister; 19.02.2011
comment
Не, това все още не работи. IDispatch::GetIdOfNames() ви позволява да откривате методи и свойства. Но това все пак изисква първо да имате име. ITypeLib е достъпен за откриване на информация за типа. Но изисква библиотека от типове, обхваната в моя отговор. - person Hans Passant; 20.04.2012

Предполагам, че винаги можете просто да поискате IUnknown и да го вземете оттам.

Но мисля, че въпросът ви е малко объркан и начинът, по който използвате определена терминология, ме кара да подозирам, че основните ви познания за COM липсват донякъде.

person David Heffernan    schedule 16.02.2011