Delphi ошибка при обращении к реестру ole

Can anyone throw any light on an apparent partial incompatibility between TLibImp in Delphi 7and Win7 64-bit? Or suggest a less long-winded work-around than the one below?

I realise D7 is a bit long in the tooth, btw, but otherwise its IDE seems to behave faultlessly in Win7, which I suppose is a testament to MS’s efforts on backwards compatibility.

Looking into another SO question earlier, I tried to use it to import ActiveDS.Tlb from WindowsSysWOW64 using Project | Import Type library, but got an «Error accessing the OLE registry» error. I got the same error trying the copy in System32. Trying to import ActiveDS.Dll from both places I got «Error loading type library» instead.

I tried all the things which people say in the MS communities to try (Run Delphi as Administrator, Disable UAC, etc) and which David Heffernan told me (correctly) that I needn’t do when I ran into the «Error accessing the OLE registry» error when I mistakenly tried to import a type library into XE4 the wrong way.

Otoh, on Win7 64-bit, D7 imports the type library for Adobe Acrobat and many others without complaint.

I managed to work around the problem by importing the ActiveDS.Tlb using XE6 and editing out the unit namespace prefixes, fwiw.

Also, I seem to recall but can’t currently find a fix for one of the supplied units (ComObj maybe) for D5/D7
to avoid getting this error when a Delphi application started up which was caused by something like a problem in the way the COM object factory was initialized. But unfortunately, unlike some of the other Delphi utilities like TRegSvr, the source for TLibImp isn’t supplied

Вопрос по версии

Аватара пользователя

sannx

Администратор
Сообщения: 2306
Зарегистрирован: 02 ноя 2011, 14:00
Skype: sann-x
Контактная информация:

Re: Вопрос по версии

Сообщение

sannx » 25 дек 2015, 13:33

Там версия Delphi XE. Примеров под Д7 и VC нет. Для Делфи любой версии примеры подправить не сложно будет.

Dmitriy

Сообщения: 1
Зарегистрирован: 25 дек 2015, 15:32

Re: Вопрос по версии

Сообщение

Dmitriy » 25 дек 2015, 16:02

sannx писал(а):Там версия Delphi XE. Примеров под Д7 и VC нет. Для Делфи любой версии примеры подправить не сложно будет.

Ага, пример то я подправил. Проект билдится, но при запуске вылетает с EOleSysError ‘Ошибка при обращении к реестру OLE’.

Может кому пригодится:
Кажется, что проблема не в версии Delphi. Проект из Example подправленный и отбилденный на Delphi 7 под Windows 7 64bit — вылетает (на этой самой Win7) с ошибкой указанной выше.
Но, когда я взял exe-файл, полученный через Delphi7/Win7_64bit и запустил его на WinXP 32 bit, то этот exe-файл запустился без ошибок.
При этом, оригинальный exe-файл «ExamplesDelphiChannelClientChannelClient.exe» из скачанного http://www.sprecord.ru/files/downloads/sdk22.zip работает и под WinXP 32bit и под Win7 64bit :)

Вопрос:

Может ли кто-нибудь пролить свет на кажущуюся частичную несовместимость между TLibImp в Delphi 7 и Win7 64-бит? Или предложите менее продолжительный рабочий ход, чем тот, который приведен ниже?

Я понимаю, что D7 немного длинный в зубе, кстати, но в противном случае его IDE, кажется, ведет себя безупречно в Win7, что, я полагаю, является свидетельством усилий MS по обратной совместимости.

Изучая другой вопрос SO ранее, я попытался использовать его для импорта ActiveDS.Tlb из WindowsSysWOW64 с помощью Project | Импортировать библиотеку типов, но получил ошибку “Ошибка доступа к реестру OLE”. Я получил ту же ошибку при попытке копирования в System32. Пытаясь импортировать ActiveDS.Dll из обоих мест, я получил вместо этого “Ошибка загрузки библиотеки типов”.

Я пробовал все, что люди говорят в сообществах MS, чтобы попробовать (запустить Delphi как администратор, отключить UAC и т.д.), И Дэвид Хеффернан сказал мне (правильно), что мне не нужно делать, когда я столкнулся с “Ошибка доступа к OLE реестра “, когда я ошибочно попытался импортировать библиотеку типов в XE4 неправильно.

Otoh, на Win7 64-бит, D7 импортирует библиотеку типов для Adobe Acrobat и многих других без жалобы.

Мне удалось обойти проблему, импортировав ActiveDS.Tlb с помощью XE6 и отредактировав префикс пространства имен единиц, fwiw.

Кроме того, я, кажется, помню, но в настоящее время не могу найти исправление для одного из поставляемых модулей (возможно, ComObj) для D5/D7, чтобы избежать получения этой ошибки при запуске приложения Delphi, которое было вызвано чем-то вроде проблемы на пути фабрика COM-объектов была инициализирована. Но, к сожалению, в отличие от некоторых других утилит Delphi, таких как TRegSvr, источник для TLibImp не предоставляется

Лучший ответ:

Здесь нечего сказать. Импортирование библиотеки типов – это повторяющаяся проблемная область. Иногда старые версии Delphi будут импортировать библиотеки, когда новые версии не будут. И иногда наоборот, как вы столкнулись. Импортер библиотеки типов имеет ошибки, которые длинны и коротки.

Ваш обходной путь является наиболее эффективным способом решения таких проблем. Нет смысла подавать отчет о контроле качества, поскольку проблема исправлена в последней версии.

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    !
    user posted image

    Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

    Соблюдайте общие правила форума

    Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
    1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
    2. Как «свернуть» программу в трей.
    3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
    4. Как запустить программу/файл? (и дождаться ее завершения)
    5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры — внедрение в удаленное адресное прстранство)
    … (продолжение следует) …


    Внимание:
    Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
    Повторная попытка — 60 дней. Последующие попытки — бан.
    Мат в разделе — бан на три месяца…


    Полезные ссылки:
    user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


    Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

    >
    Не регистрируется COM server

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    28.05.11, 07:16

      Delphi 2010. Win 7 x64.

      Создаю новый проект. Добавляю в него COM object. Все по дефолту, указываю только имя класса.
      Нажимаю Run -> Register ActiveX server. Компилится.
      Появляется окошко:
      Successfully registered ActiveX Server, ‘M:TZtestProject1.exe’

      и сразу же за ним еще одно с мессагой:
      Прекращена работа программы «Project1.exe»

      И потом появляется еще одно окно:

      Exception EOleSysError in module Project1.exe at 000A4C61.

      Ошибка при обращении к реестру OLE.

      Комп перезагружал. Avast отключал.

      Сервер в exeшнике.

      Делаю:
      Z:>com_srv.exe /RegServer

      В xp sp2 все ок.

      В семерке тоже самое. Ошибка при обращении к реестру OLE.

      Что за проблема? Кто-нибудь сталкивался?


      Gonarh



      Сообщ.
      #2

      ,
      28.05.11, 10:07

        Нужны права админа. Запускай регистрацию от админской учетки

        Сообщение отредактировано: Mr. Gonarh — 28.05.11, 10:09

        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

        0 пользователей:

        • Предыдущая тема
        • Delphi: Система, Windows API
        • Следующая тема

        Рейтинг@Mail.ru

        [ Script execution time: 0,0226 ]   [ 16 queries used ]   [ Generated: 21.06.23, 19:18 GMT ]  

        3 / 3 / 1

        Регистрация: 09.09.2013

        Сообщений: 116

        1

        12.10.2016, 16:41. Показов 4462. Ответов 9


        Студворк — интернет-сервис помощи студентам

        Ребят, как установить WMI? Очень много облазил, но вот установки не нашёл. Делал import library Windows/System32/wbem/файл.tlb. Пишет ошибку: Ошибка при обращении к реестру OLE. Как же всё таки установить магическую штуку WMI?



        0



        5157 / 4110 / 1031

        Регистрация: 29.08.2013

        Сообщений: 26,084

        Записей в блоге: 3

        12.10.2016, 17:01

        2



        0



        3 / 3 / 1

        Регистрация: 09.09.2013

        Сообщений: 116

        12.10.2016, 17:09

         [ТС]

        3

        Цитата
        Сообщение от qwertehok
        Посмотреть сообщение

        Как я понимаю, можно тупо к нему присоединиться ?



        0



        5157 / 4110 / 1031

        Регистрация: 29.08.2013

        Сообщений: 26,084

        Записей в блоге: 3

        12.10.2016, 17:17

        4

        Цитата
        Сообщение от alex2131
        Посмотреть сообщение

        Как я понимаю, можно тупо к нему присоединиться ?

        ДА!!



        0



        alex2131

        3 / 3 / 1

        Регистрация: 09.09.2013

        Сообщений: 116

        13.10.2016, 22:10

         [ТС]

        5

        Разобрался с подключением и классами, не могу найти реализацию через Delphi. Код есть, вот как-то у них не понятно написан, не могу разобраться, может кто помочь?

        Добавлено через 1 час 31 минуту

        Delphi
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        
        var objSWbemLocator, List, List2,list3 : Variant;
         i: integer;
        begin
        objSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
        if not (TVarData(objSWbemLocator).VType = varEmpty)
           then ShowMessage('OK');
           list:= objSWbemLocator.ConnectServer('.', 'rootCIMV2','', '', '', '') ;
           list2:= list.ExecQuery('SELECT * FROM Win32_Processor');
           i:= list2.Count;
           ShowMessage(IntToStr(i));
           for i := 0 to list2.Count - 1 do
             begin
              list3 := list2.Item[Name];
              ShowMessage(List3.Name) ;
             end;
        end;

        Пишет общий сбой, в чем проблема?



        0



        97 / 97 / 25

        Регистрация: 25.04.2016

        Сообщений: 525

        14.10.2016, 00:57

        6

        А так импортировать пробовали?
        Не знаю, что имел ввиду qwertehok, под «присоединиться». Т.к. его ссыль ведет на описание для WSH.
        Основной порядок начала работы обычно такой:

        Итак, начнём с того, что нам необходимо сделать перед тем, как непосредственно начать использовать мощь технологии WMI в своих программах:

        установить систему Windows 2000 или NT 4.0 SP4 и выше;
        установить Microsoft Internet Explorer (IE) 5.0 и выше;
        установить WMI SDK;

        После того, как вы установили WMI SDK, импортируйте следующие библиотеки типов:

        Active DS Type Library (Version 1.0)
        Microsoft WMI Scripting v1.1 Library (Version 1.1)

        Миниатюры

        Установка WMI
         

        Установка WMI
         



        0



        5157 / 4110 / 1031

        Регистрация: 29.08.2013

        Сообщений: 26,084

        Записей в блоге: 3

        14.10.2016, 08:41

        7

        Цитата
        Сообщение от MyEternity
        Посмотреть сообщение

        Основной порядок начала работы обычно такой:

        ни фига подобного

        Цитата
        Сообщение от alex2131
        Посмотреть сообщение

        Пишет общий сбой, в чем проблема?

        возьмите работающий пример



        0



        97 / 97 / 25

        Регистрация: 25.04.2016

        Сообщений: 525

        14.10.2016, 12:38

        8

        Цитата
        Сообщение от qwertehok
        Посмотреть сообщение

        возьмите работающий пример

        Приведите работающий пример, который не потребует ничего добавлять в Uses, и не потребует никаких дополнительный MagWmi и пр. компонент.

        Я спрашиваю для себя в том числе — т.к. самому стало интересно)



        0



        5157 / 4110 / 1031

        Регистрация: 29.08.2013

        Сообщений: 26,084

        Записей в блоге: 3

        14.10.2016, 12:56

        9

        Цитата
        Сообщение от MyEternity
        Посмотреть сообщение

        который не потребует ничего добавлять в Uses

        и который не требует писать код?

        Цитата
        Сообщение от MyEternity
        Посмотреть сообщение

        Приведите работающий пример

        воспользуйся поиском по форуму

        ЗЫ смотри сюда
        https://theroadtodelphi.com/wm… e-creator/



        0



        MyEternity

        97 / 97 / 25

        Регистрация: 25.04.2016

        Сообщений: 525

        14.10.2016, 13:48

        10

        Лучший ответ Сообщение было отмечено alex2131 как решение

        Решение

        Цитата
        Сообщение от qwertehok
        Посмотреть сообщение

        и зачем WMI устанавливать?
        http://www.script-coding.com/WMI.html

        Цитата
        Сообщение от qwertehok
        Посмотреть сообщение

        >>Как я понимаю, можно тупо к нему присоединиться ?
        >>ДА!!

        Мой вопрос был связан с этими постами. Ответа на вопрос я так и не получил.
        Спасибо и на этом

        Добавлено через 17 минут
        ТС, qwertehok, был прав. Можно и без импорта обойтись.
        Только что покопался по https://github.com/RRUZ/wmi-delphi-code-creator, нашел там пример:

        Delphi
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        
        {$APPTYPE CONSOLE}
         
        uses
          SysUtils,
          ActiveX,
          ComObj,
          Variants;
         
         
         
        // The Win32_DiskDrive class represents a physical disk drive as seen by a computer running the Win32 operating system. Any interface to a Win32 physical disk drive is a descendent (or member) of this class. The features of the disk drive seen through this object correspond to the logical and management characteristics of the drive. In some cases, this may not reflect the actual physical characteristics of the device. Any object based on another logical device would not be a member of this class.
        // Example: IDE Fixed Disk.
         
        procedure  GetWin32_DiskDriveInfo;
        const
          WbemUser            ='';
          WbemPassword        ='';
          WbemComputer        ='localhost';
          wbemFlagForwardOnly = $00000020;
        var
          FSWbemLocator : OLEVariant;
          FWMIService   : OLEVariant;
          FWbemObjectSet: OLEVariant;
          FWbemObject   : OLEVariant;
          oEnum         : IEnumvariant;
          iValue        : LongWord;
        begin;
          FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
          FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'rootCIMV2', WbemUser, WbemPassword);
          FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive','WQL',wbemFlagForwardOnly);
          oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
          while oEnum.Next(1, FWbemObject, iValue) = 0 do
          begin
            Writeln(Format('DeviceID    %s',[String(FWbemObject.DeviceID)]));// String
         
            Writeln('');
            FWbemObject:=Unassigned;
          end;
        end;
         
         
        begin
         try
            CoInitialize(nil);
            try
              GetWin32_DiskDriveInfo;
            finally
              CoUninitialize;
            end;
         except
            on E:EOleException do
                Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
            on E:Exception do
                Writeln(E.Classname, ':', E.Message);
         end;
         Writeln('Press Enter to exit');
         Readln;      
        end.



        1



        IT_Exp

        Эксперт

        87844 / 49110 / 22898

        Регистрация: 17.06.2006

        Сообщений: 92,604

        14.10.2016, 13:48

        10

      • Delphi ошибка unsatisfied forward or external declaration
      • Delphi ошибка stack overflow
      • Delphi ошибка list index out of bounds 0
      • Delphi ошибка for loop control variable must be simple local variable
      • Delphi ошибка e2033 types of actual and formal var parameters must be identical