При работе с COM-объектами в среде программирования на Object Pascal (Delphi) важно правильно обращаться к реестру для получения информации о сервере. Вопрос пользователя касается ситуации, когда после проверки существования ключа реестра HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\...\LocalServer32 сервер COM не загружается корректно. Давайте разберемся, в чем может быть проблема.
Описание проблемы
Пользователь столкнулся с проблемой, при которой сервер COM загружается только в том случае, если не выполняется проверка ключа реестра. В коде используется функция CreateComObject(...), которая вызывается после проверки ключа реестра. Проблема заключается в том, что при выполнении проверки ключа реестра сервер COM не загружается, что приводит к ошибке в работе программы.
Анализ кода
В коде представлен класс TLibLoader с процедурой CheckLibraryChecksum, которая выполняет чтение из реестра и проверку файлов на соответствие MD5-сумме. Ключевой момент заключается в том, что при чтении значения из реестра не проверяется, был ли ключ успешно открыт. Это может привести к возникновению исключений, если ключ не существует.
Подтвержденный ответ
Проблема кроется в неправильной обработке результата вызова метода OpenKey класса TRegistry. Необходимо проверять, был ли ключ успешно открыт, и только после этого пытаться прочитать значение. В случае, если ключ не существует, метод OpenKey вернет False, и попытка чтения приведет к исключению.
procedure AddFileName(AHKEY: HKEY; const AFormat: string);
begin
Registry.RootKey := AHKEY;
if Registry.OpenKey(
Format(AFormat, [GUIDToString(csLibGuid)])
, False
) then begin
try
FileName := Registry.ReadString(csEmpty);
if Trim(FileName) > csEmpty then begin
FileNames.Add(FileName);
end;
finally
Registry.CloseKey;
end;
end;
end;
Также рекомендуется использовать метод OpenKeyReadOnly, который более явно указывает на то, что ключ открывается только для чтения, и автоматически пытается найти подходящие разрешения для доступа.
Альтернативный ответ и комментарии
В обсуждении пользователи отметили, что проверка строки на пустоту с использованием Trim(FileName) > csEmpty может быть неоправданно сложной, и предложили использовать <> для сравнения. Также было отмечено, что для лучшего отладки следует использовать логирование.
В ходе обсуждения выяснилось, что реальная проблема заключается в том, что переменная FileName не определена в подпроцедуре AddFileName, и изменяется свойство класса TLibLoader, что приводит к побочным эффектам.
Заключение
Правильная работа с реестром в Object Pascal требует внимательного отношения к деталям. Необходимо проверять результаты операций и правильно обрабатывать возможные исключения. Это позволит избежать ошибок, связанных с чтением из несуществующих ключей реестра, и обеспечит корректную работу серверов COM.
Пользователь столкнулся с проблемой, когда сервер COM не загружается из-за ошибок в проверке ключа реестра, необходимого для корректной работы с COM-объектами в Delphi, и требуется исправить код для правильной обработки результатов операций с реестром.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS