COM / OLE может подключаться по GUID, но не по строке класса - PullRequest
0 голосов
/ 21 ноября 2011

У меня есть приложение MFC, которое предоставляет кучу объектов OLE для приложения и открывает документы.

Я могу подключиться к серверу, используя GUID класса приложения (например, в ruby ​​для windows: WIN23OLE.new('{12345678-1234-1234-1234-12345678}')), но когда я пытаюсь подключиться, используя имя класса WIN32OLE.new('MyApp.Application'), он всегда завершается неудачно с "Invalid Class String "ошибка (код ошибки HRESULT: 0x800401f3). То же самое происходит

Нет ошибок, возвращаемых инициализацией OLE в приложении MFC, и как только GUID-соединение установлено, оно работает нормально.

Мне просто очень любопытно, почему подход с использованием строк класса не работает. Есть идеи?

1 Ответ

2 голосов
/ 21 ноября 2011

Строка класса называется ProgID (сокращение от идентификатора программы), и на самом деле это просто читаемая версия ClassID.ProgID хранятся в реестре в 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

...