Ole error 80040200

I've been trying to use the technique shown in the answer to this q Detect when the active element in a TWebBrowser document changes to implement a DIY version of MS Word's Automation events. A

This had me scratching my head for a while, I can tell you. Anyway, eventually the penny dropped
that the answer must lie in the difference between the way TEventObject is implemented
and TServerEventDispatch in OleServer.Pas.

The key is that TServerEventDispatch implements a custom QueryInterface

function TServerEventDispatch.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  if GetInterface(IID, Obj) then
  begin
    Result := S_OK;
    Exit;
  end;
  if IsEqualIID(IID, FServer.FServerData^.EventIID) then
  begin
    GetInterface(IDispatch, Obj);
    Result := S_OK;
    Exit;
  end;
  Result := E_NOINTERFACE;
end;

whereas TEventObject does not. Once I’d spotted that, it was straightforward to extend
TEventObject to do likewise, and voila! the error returned by «CP.Advise» went away.

For completeness, I’ve included the complete source
of the updated TEventObject below. It is the

if IsEquallIID then ... 

which makes the difference between

Res := CP.Advise(IEvt, Cookie);

returning the $800040200 error and zero for success. With the «if IsEquallIID then …»
commented out, the RefCount on IEvt is 48 (!) after «CP.Advise …» returns, by which time
TEventObject.QueryInterface has been called no less than 21 times.

I hadn’t realised
previously (because TEventObject didn’t previously have its own version to observe)
that when «CP.Advise …» is executed, the COM system calls «TEventObject.QueryInterface»
with a succession of different IIDs until it returns S_Ok on one of them. When I have some free time, maybe I’ll try to look up what these other IIDs are: as it is, the IID for IDispatch is quite a long way down the list of IIDs that are queried for, which seems strangely sub-optimal seeing as I’d have though that would be the one that IConnectionPoint.Advise would be trying to get.

Code for updated TEventObject is below. It includes a rather rough’n ready customization
of its Invoke() which is specific to handling Word’s DocumentOpen event.

type
   TInvokeEvent = procedure(Sender : TObject; const Doc : _Document) of object;

  TEventObject = class(TInterfacedObject, IUnknown, IDispatch)
  private
    FOnEvent: TInvokeEvent;
    FEventIID: TGuid;
  protected
    function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
    function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
    function GetIDsOfNames(const IID: TGUID; Names: Pointer;
      NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
    function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
      Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
  public
    constructor Create(const AnEvent : TInvokeEvent);
    property OnEvent: TInvokeEvent read FOnEvent write FOnEvent;
    property EventIID : TGuid read FEventIID;
  end;

constructor TEventObject.Create(const AnEvent: TInvokeEvent);
begin
  inherited Create;
  FEventIID := DIID_ApplicationEvents2;
  FOnEvent := AnEvent;
end;

function TEventObject.GetIDsOfNames(const IID: TGUID; Names: Pointer;
  NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;
begin
  Result := E_NOTIMPL;
end;

function TEventObject.GetTypeInfo(Index, LocaleID: Integer;
  out TypeInfo): HResult;
begin
  Pointer(TypeInfo) := nil;
  Result := E_NOTIMPL;
end;

function TEventObject.GetTypeInfoCount(out Count: Integer): HResult;
begin
  Count := 0;
  Result := E_NOTIMPL;
end;

function TEventObject.Invoke(DispID: Integer; const IID: TGUID;
  LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo,
  ArgErr: Pointer): HResult;
var
  vPDispParams: PDispParams;
  tagV : TagVariant;
  V : OleVariant;
  Doc : _Document;
begin
  vPDispParams := PDispParams(@Params);
  if (vPDispParams <> Nil) and (vPDispParams^.rgvarg <> Nil) then begin
    tagV := vPDispParams^.rgvarg^[0];
    V := OleVariant(tagV);
    Doc := IDispatch(V) as _Document;
    //  the DispID for DocumentOpen of Word's ApplicationEvents2 interface is 4
    if (DispID = 4) and Assigned(FOnEvent) then
      FOnEvent(Self, Doc);
    end;
  Result := S_OK;
end;

function TEventObject.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  if GetInterface(IID, Obj) then
  begin
    Result := S_OK;
    Exit;
  end;
  if IsEqualIID(IID, EventIID) then
  begin
    GetInterface(IDispatch, Obj);
    Result := S_OK;
    Exit;
  end;
  Result := E_NOINTERFACE;
end;

При регистрации DLL-файла или установке приложения, которое пытается это сделать автоматически, процесс может прерваться сообщением «Не удалось выполнить вызов DllRegisterServer с кодом ошибки 0x80040200». В большинстве случаев ее причиной является проблема с разрешениями. Чтобы ее обойти, попробуйте зарегистрировать библиотеку с доступом администратора.

Но если сбой возникает при инсталляции приложения, нужно повторно зарегистрировать DLL. В случае, когда ошибка связана с OCX-файлом, переместите его в папку System32 перед повторной попыткой установить программу.

Содержание

  • 1 Отмена регистрации DLL-файла
  • 2 Перерегистрация файла
  • 3 Запуск OCX-файла из каталога System32

Отмена регистрации DLL-файла

Если сталкиваетесь с ошибкой 0x80040200 при попытке отменить регистрацию DLL-библиотеки вручную, скорее всего, для выполнения этой операции нет достаточных разрешений. В этом случае запустите «regsvr32» в командной строке с повышенными правами.

Выведите на экран окно поиска Windows и наберите «командная строка». Щелкните правой кнопкой на найденный результат и выберите вариант запуска от имени администратора.

В консоли выполните команду для отмены регистрации библиотеки:
regsvr32 /u *.dll

Вместо звездочки укажите имя проблемного DLL-файла.
При успешном завершении операции перезагрузите компьютер. Затем выполните установку, которая прерывалась кодом 0x80040200.

Перерегистрация файла

Если ошибка возникает в ходе установки программы, скорее всего, она возникает из-за некоторых зависимостей, которые не могут загрузиться должным образом. Для ее решения запустите установщик с повышенными правами, затем отмените регистрацию библиотеки и зарегистрируйте проблемную зависимость вручную.

Откройте Проводник (Win +E) и перейдите в папку установщика, который не удается запустить. Кликните по нему правой кнопкой мыши и выберите в меню пункт запуска от имени администратора.

Следуйте инструкциям до завершения процесса. Если видите сообщение с кодом 0x80040200 – закройте окно и перейдите к следующему шагу.

Откройте командную строку с правами администратора через окно системного поиска.

В консоли запустите по очереди следующие команды, подтверждая выполнение каждой на Enter, чтобы сначала отменить регистрацию, а затем повторно зарегистрировать зависимость:

  • *.ocx /UNREGISTER
  • *.ocx /REGSERVER

Примечание: Вместо звездочки укажите наименование файла.

После успешного окончания, перезагрузите ПК и посмотрите, устранена ли проблема.

Запуск OCX-файла из каталога System32

Если видите, что не удается выполнить вызов DllRegisterServer при работе с файлом *.ocx, ошибка указывает на проблемы с разрешениями. Попробуйте переместить OCX в папку System32 и запустить оттуда для проверки, что он имеет требуемый доступ.
В Проводнике перейдите в локацию с OCX-файлом. Кликните по нему правой кнопкой и выберите пункт «Вырезать».

Перейдите по пути C:WindowsSystem32 и вставьте файл, который только что скопировали в буфер обмена.

После этого повторите установку приложения еще раз и посмотрите, прерывается ли она сообщением 0x80040200.

Обновлено февраль 2023: остановите эти сообщения об ошибках и устраните распространенные проблемы с помощью этого инструмента. Получить сейчас в эту ссылку

  1. Скачайте и установите программного обеспечения.
  2. Он просканирует ваш компьютер на наличие проблем.
  3. Затем инструмент исправить проблемы которые были найдены.

Когда вы пытаетесь вручную зарегистрировать элемент управления из командной строки с помощью утилиты RegSvr32.exe, появляется сообщение об ошибке, указывающее, что элемент управления ActiveX был загружен, но вызов DllRegisterServer завершился неудачно с кодом ошибки 0x80040200.

Эта ошибка может возникать в системах Windows с включенным контролем учетных записей пользователей. Поскольку для реестра требуется доступ к ограниченной области реестра, его следует использовать с повышенными привилегиями через административную командную строку. Для этого щелкните правой кнопкой мыши значок командной строки и выберите «Запуск от имени администратора» или в Widows 8.1 или Windows 10 щелкните правой кнопкой мыши значок Windows в строке состояния системы и выберите «Командная строка (администратор)».

Если вы используете 64-разрядную версию Windows, вам также следует убедиться, что вы зарегистрировали правильную версию элемента управления. В 32-битных версиях Windows ActiveX SocketTools устанавливаются в C:WindowsSystem32. В 64-битной Windows 32-битные элементы управления ActiveX устанавливаются в C:WindowsSyswow64, а 64-битные элементы ActiveX устанавливаются в C:WindowsSystem32. Чтобы зарегистрировать 32-битный элемент управления в 64-битной системе Windows, команда должна выглядеть так:

%windir%syswow64regsvr32%windir%syswow64control.ocx

Где элемент управления — это имя файла элемента управления ActiveX, который вы хотите зарегистрировать. При ручном копировании элемента управления из одной системы в другую следует также помнить, что сохранение элемента управления отличается от предоставления лицензии. Чтобы развернуть приложение, использующее элемент управления ActiveX SocketTools, его необходимо скомпилировать в системе с лицензией на разработку SocketTools. Сохраненный элемент управления всегда будет генерировать ошибку лицензии во время выполнения, если приложение не лицензировано должным образом для распространения.

Запустите командную строку в режиме повышенных привилегий

ERR_NAME_NOT_RESOLVED - Use Command Prompt - Step 1

Вы пытались запустить командную строку в режиме повышенных привилегий (администратор), чтобы отменить регистрацию файла DLL?

Если нет, запустите командную строку в режиме администратора и посмотрите, сможете ли вы успешно отменить регистрацию файла.

  • Конечно. Щелкните Пуск. Введите cmd в поле поиска при запуске.
  • Щелкните правой кнопкой мыши cmd.exe и выберите, хотите ли вы работать от имени администратора.
  • Против. regsvr32 / у cdo32.dll
  • ре. Проверьте, была ли регистрация успешно отменена.

Обновите свою систему

ERR_NAME_NOT_RESOLVED - Update your drivers

Это лучший и самый простой способ решить проблему. Если у вас возникла техническая проблема, первое, что вы должны сделать, это обновить свою систему. Этот шаг может решить мелкие или серьезные проблемы.

Перезагрузка вашей системы обновит вашу сеть, что автоматически решит большинство проблем путем перенаправления конфигурации. Если вы использовали этот метод раньше, вы можете использовать следующий метод, чтобы исправить эту ошибку.

Запустите файл OCX (расширение управления OLE) из папки System32.

Шаг 1: Откройте проводник и перейдите к папке с файлом .OCX.

Шаг 2: Щелкните правой кнопкой мыши файл .OCX и выберите «Вырезать» в контекстном меню.

Шаг 3: Перейдите в папку C:WindowsSystem32 и вставьте файл .OCX.

Шаг 4: Повторите установку.

Сохраните файл еще раз после установки программы

What is the purpose of Windows Update

Шаг 1. Откройте проводник и перейдите к месту установки, вызвавшему эту ошибку.

Шаг 2: Щелкните правой кнопкой мыши программу установки и выберите «Запуск от имени администратора» в контекстном меню.

Шаг 3. Следуйте инструкциям на экране, чтобы завершить установку. Если вы видите такое же сообщение об ошибке 0x80040200, нажмите «ОК» и перейдите к следующему шагу.

Шаг 4: Нажмите клавиши Windows + R, чтобы открыть окно запуска.

Шаг 5: Введите cmd и нажмите Ctrl + Shift + Enter, чтобы открыть командную строку с повышенными правами CMD. Нажмите «Да», чтобы предоставить права администратора по запросу системы контроля учетных записей (UAC).

Шаг 6: Введите следующие команды и нажимайте Enter после каждой команды, чтобы отменить регистрацию и повторно зарегистрировать зависимость OCX.
spr32x30.ocx / ОТМЕНИТЬ РЕГИСТРАЦИЮ
spr32x30.ocx / РЕГИСТРАЦИЯ

Шаг 7: перезагрузите компьютер.

ОДОБРЕННЫЙ: Чтобы исправить ошибки Windows, нажмите здесь.

Сообщение Просмотров: 87

Некоторые пользователи Windows сталкиваются с ошибкой DllUnregisterServer с кодом ошибки 0x80040200 при попытке регистрации или отмены регистрации файла DLL или при попытке установить приложение, которое пытается зарегистрировать файл DLL автоматически. Сообщается, что эта проблема возникает в Windows 7, Windows 8.1 и Windows 10.

Ошибка DllUnregisterServer с кодом ошибки 0x80040200

Самая распространенная причина, которая приведет к возникновению этой конкретной ошибки, — это проблема с разрешениями. Чтобы позаботиться об этом, вам нужно будет попытаться зарегистрировать или отменить регистрацию DLL-файла с правами администратора.

Однако, если проблема возникает при попытке установить программу, вам может потребоваться перерегистрировать файл после сбоя установки. Если вы столкнулись с проблемой зависимости OCX, попробуйте переместить файл в папку System32, прежде чем пытаться выполнить установку снова.

Метод 1: Отмена регистрации файла DLL с правами администратора

Если вы видите эту ошибку при попытке отменить регистрацию DLL-файла вручную, вы, скорее всего, в конечном итоге увидите 0x80040200, потому что у вас недостаточно прав. Если этот сценарий применим, вы сможете полностью избежать этого сообщения об ошибке, используя команду «regsvr32» в командной строке с повышенными привилегиями.

Если вы еще не пробовали это, следуйте приведенным ниже инструкциям, чтобы попытаться отменить регистрацию DLL-файла вручную из командной строки с повышенными привилегиями CMD:

  1. Нажмите клавишу Windows + R, чтобы открыть диалоговое окно «Выполнить». Затем введите «cmd» в текстовом поле и нажмите Ctrl + Shift + Enter, чтобы открыть окно CMD с повышенными правами. Когда вы увидите UAC (Контроль учетных записей), нажмите Да, чтобы предоставить административные привилегии.Запуск командной строки
  2. Как только вы окажетесь в командной строке с повышенными привилегиями CMD, введите следующую команду и нажмите Enter, чтобы вручную отменить регистрацию файла .DLL: regsvr32 / u * DLL File *

    Примечание: имейте в виду, что * DLL файл * является просто заполнителем. Вам нужно будет заменить его на имя + расширение файла DLL, который вы пытаетесь отменить. Например, нам нужно было отменить регистрацию файла cdo32.dll, поэтому мы использовали команду regsvr32 / u cdo32.dll.

  3. В случае успешного завершения операции без кода ошибки 0x80040200 перезагрузите компьютер, а затем завершите установку, которая ранее вызывала проблему.

Если та же проблема все еще возникает или эта операция не применима, перейдите к следующему потенциальному исправлению ниже.

Способ 2: перерегистрация файла после установки программы

Если вы видите эту ошибку при попытке установить приложение, вы, вероятно, видите эту ошибку из-за некоторых зависимостей, которые загружаются неправильно. В этом случае вы, вероятно, сможете обойти эту проблему, запустив установщик с правами администратора, а затем вручную отменив регистрацию и зарегистрируя ошибочную зависимость.

Примечание. Часто сообщается, что это исправление эффективно в Windows 7.

В случае, если этот сценарий применим, следуйте приведенным ниже инструкциям, чтобы запустить установку с правами администратора, а затем заново зарегистрируйте ошибочную зависимость:

  1. Откройте проводник и перейдите к месту установки, которое в конечном итоге вызывает ошибку.
  2. Щелкните правой кнопкой мыши по нему и выберите «Запуск от имени администратора» из появившегося контекстного меню.Запуск установщика с правами администратора
  3. Следуйте инструкциям на экране для завершения установки. Не против, если вы видите ту же самую ошибку 0x80040200 — просто закройте окно ошибки и перейдите к следующему шагу.
  4. Откройте диалоговое окно «Выполнить», нажав клавишу Windows + R. Затем введите «cmd» в текстовом поле и нажмите Ctrl + Shift + Enter, чтобы открыть окно CMD с повышенными привилегиями.Запуск командной строки
  5. Когда вы находитесь в терминале командной строки, введите следующие команды по порядку и нажмите Enter после каждой команды, чтобы отменить регистрацию, а затем заново зарегистрировать зависимость OCX: spr32x30.ocx / UNREGISTER
    spr32x30.ocx / REGSERVER
  6. Перезагрузите компьютер и посмотрите, будет ли проблема решена при следующем запуске компьютера.

Если проблема сохраняется, перейдите к следующему потенциальному решению ниже.

Способ 3: запуск файла OCX из папки System32

В случае, если вы столкнулись с этой конкретной проблемой при работе с файлом .ocx (расширение управления OLE), вы, скорее всего, проблема с разрешениями. Несколько затронутых пользователей подтвердили, что им удалось решить эту проблему, переместив файл .OCX в папку System32 и запустив его оттуда, чтобы убедиться, что он имеет необходимый доступ.

ВАЖНО: Делайте это только в том случае, если вы на 100% уверены, что файл .OCX не представляет угрозы безопасности.

Если вы действительно сталкиваетесь с кодом ошибки 0x80040200 с этим типом файла, следуйте приведенным ниже инструкциям, чтобы переместить файл в папку System32, прежде чем открывать его:

  1. Откройте проводник, перейдите к местоположению файла .OCX, щелкните его правой кнопкой мыши и выберите «Вырезать» в контекстном меню.Резка файла
  2. Затем перейдите к C: Windows System32 и вставьте только что скопированный файл в буфер обмена.
  3. Как только файл находится в папке System32, повторите установку еще раз и посмотрите, не возникает ли еще та же ошибка 0x80040200.

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Ole error 800401f3 wine
  • Ole error 80040152 wine
  • Ole error 80030050
  • Ole error 80004001 wine
  • Ole error 0x80020005

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии