COM/OLE може да се свързва чрез GUID, но не и чрез низ от клас

Имам MFC приложение, което разкрива куп OLE обекти за приложението и отворени документи.

Мога да се свържа със сървъра, като използвам GUID на класа на приложението (напр.: в ruby ​​за windows: WIN23OLE.new('{12345678-1234-1234-1234-12345678}')), но когато се опитам да се свържа с името на класа WIN32OLE.new('MyApp.Application'), винаги се проваля с грешка „Невалиден низ от клас“ (код на грешка HRESULT: 0x800401f3). Същото се случва

Няма грешки, върнати от инициализацията на OLE в приложението MFC и след като връзката е направена от GUID, тя работи добре.

Просто съм много любопитен защо подходът на клас низ не работи. Някакви идеи?


person Matt Connolly    schedule 21.11.2011    source източник


Отговори (1)


Класовият низ се нарича ProgID (съкращение от programmatic ID) и всъщност е просто четима от човека версия на ClassID. ProgIDs се съхраняват в системния регистър под HKEY_CLASSES_ROOT, например избирам един произволно от моя регистър:

HKEY_CLASSES_ROOT\Microsoft.XMLDOM

Под този ключ има друг ключ, наречен CLSID:

HKEY_CLASSES_ROOT\Microsoft.XMLDOM\CLSID

И вътре в този ключ е REG_SZ стойност, която съдържа ClassID:

{2933BF90-7B36-11D2-B20E-00C04F983E60}

Така че основно начинът, по който работи, е, че COM ще се опита да намери CLSID в системния регистър под посочения ProgID. Предполагам, че не е там или е недостъпен по някакъв начин. Ако искате да го разберете със сигурност, отворете REGEDIT.EXE и погледнете дали очакваните настройки на системния регистър са там. Ако не са, това е вашият отговор защо не работи (по някаква причина регистрацията на COM компонента не създава ProgID ключовете).

Ако настройките са там, бих препоръчал да стартирате Process Monitor (sysinternals.com) и да настроите някои филтри на регистъра, за да видите какво се случва, когато регистърът се сканира за този ProgID.

Ето малко повече информация за ProgID:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd542719(v=vs.85).aspx

person JohnD    schedule 21.11.2011
comment
Мислех, че трябва да са само в регистъра, за да може приложението да се стартира от COM. Като алтернатива приложението може да се регистрира в системата, когато се стартира, и след това ще стане достъпно. Инсталаторът за тази програма създава записи в системния регистър за асоциираните DLLS (които всички работят по класов низ / ProgID), но не и за основния изпълним файл. Благодаря за информацията! - person Matt Connolly; 21.11.2011