OCX AfxOleRegisterTypeLib завершается с ошибкой 0x80040200 - PullRequest
1 голос
/ 21 сентября 2019

Я обновил библиотеку OCX с VS2010 / Win7 до VS2019 / Win10.Сборка проекта, однако, когда я пытаюсь использовать RegSvr32.exe из командной строки с повышенными правами, я получаю сообщение об ошибке 0x0040200.Я сделал немного отладки, и оскорбительный вызов - это вызов AfxOleRegisterTypeLib.

RegSvr32.exe OCX error 0x80040200

Да, я видел это ТАК статья, в которой говорится, что "отсутствие файла tlb рядом с dll".Другие состояния поиска запускаются из командной строки администратора.

У меня нет TLB рядом с элементом управления OCX.Если я пытаюсь создать его, используя tlbexp.exe, я получаю следующую ошибку:

TlbExp: ошибка TX0000: не удалось загрузить файл или сборку 'file: /// C: \ pathto.ocx'или одна из его зависимостей.Предполагалось, что модуль будет содержать манифест сборки.

Командная строка TlbExp (используется Запуск от имени администратора для всех cmd.exe):

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\x64\tlbexp.exe" /VERBOSE "<path to OCX file>" /out:"<path to .tlb output file>"

Я скачал Resource Tuner, и этопоказывает манифест красиво.В манифесте нет информации TLB.

Manifest for OCX file

Я думаю, что, возможно, манифесту OCX нужно нечто большее, что поможет TlbExp получить информациючто он хочет, просто мысль.

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity version="1.0.0.0" name="DriveOps.ocx"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!-- Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
      <!-- Windows 8 -->
      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />
      <!-- Windows 8.1 -->
      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />
      <!-- Windows 10 -->
      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
    </application>
  </compatibility>
  <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
    </windowsSettings>
  </application>
</assembly>

Я использовал Depends64 (он же Dependency Walker 64-bit) и нет отсутствующих компонентов DLL.Он находит все их хорошо, как и RegSvr32.exe.

Dependency Walker 64 output of 64-bit OCX (debug version)

Размещение файла OCX в C: \ Windows \ System32 не помогает.

Для тех, кто смотрит на DLL, те же самые DLL прекрасно работают на Win7 box.Вот еще немного информации о библиотеках, отличных от Windows

  • PlxApi720_x64.dll: PLX v7.2 API (Чип Broadcom PLX - это коммутатор PCIe (представьте себе USB / сетевой коммутатор, только с линиями PCIe))
  • LSIDirectAccess.dll: LSI API - это автономная библиотека DLL, которая позволяет программному обеспечению взаимодействовать с адаптером LSI HBA RAID
  • Ipp * .dll: префикс Ipp - этоБиблиотеки DLL, используемые файлами перераспределения (x64) для Intel Code Composer Studio, здесь версия 2011, более старая, которую необходимо обновить до последней и самой лучшей, не говоря уже о бесплатной версии API. Все они находятся в папке System32.

Вот код:

// DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void)
{
    AFX_MANAGE_STATE(_afxModuleAddrThis);

    if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
        return ResultFromScode(SELFREG_E_TYPELIB);           // <- failure line, through debugging

    if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
        return ResultFromScode(SELFREG_E_CLASS);

    return NOERROR;
}

Файлы Intel Code Composer Studio 2011 находятся в каталоге C:\Windows\System32, как и в окне Win7.

Для чегоэто стоит того, что TlbExp дает сбой и на коробке Win7, просто он регистрируется, поэтому, вероятно, пользовательский интерфейс может добавить элемент управления. Насколько я помню, я однажды заменил OCX на проекте Win7, и VS2010 автоматически создал TLB и добавил префиксТопор впереди, но это был переворотПрошло много лет, так что моя память, возможно, не самая точная.Попытка добавить OCX в пользовательский интерфейс (.Net WinForms) терпит неудачу и просто говорит, что не может быть добавлена.

OCX действительно использует последний набор инструментов платформы (Visual Studio 2019 (v142)).

OCX property page

Комментарий для новичков разработчиков, regasm.exe - для сборок .Net.RegSvr32.exe для ActiveX Controls (OCX/DLL), что у меня есть.RegSvr32 предназначен для динамически загружаемых модулей, следовательно, точка входа DllRegister.

Мысли?

Примечания из дальнейшего тестирования

  1. (суббота, 21.09.2009Когда я обновлялся, я создал пустой C ++ DLL-проект, а затем добавил все файлы, изменив целевое расширение на OCX, пройдя через настройки старого проекта и, когда это целесообразно, сопоставив их с новым файлом проекта, желая сохранить то же самое.Я хотел сделать тест и посмотреть, что происходит с новым проектом OCX.Я видел, что существует такая вещь, как «Управление MFC ActiveX» для типа проекта в VS2019.Я создал это и увидел, что я получил разные базовые файлы, но что более важно, RegSvr32.exe работает.Это означает, что либо ошибка была исходным файлом проекта, поэтому мне нужно импортировать в чистый проект или импортировать по частям, если это возможно, и посмотреть, где что-то сломалось.

  2. (21.09.2009, суббота) Новый тестовый проект не поставляется с файлом манифеста, и TlbExp.exe завершился неудачно с тем же сообщением об ошибке, что и мой настоящий проект.Я пошел, чтобы добавить новый пункт и увидел "Манифест пакета".Этот файл манифеста, хотя и по-прежнему выдает ту же ошибку TlbExp.exe, выглядит совсем не так, как файл манифеста приложения выше.Я создал еще один новый проект MFC ActiveX Control и добавил в манифест сверху только изменение имен и увидел, что проект отказался создавать метание 1) Ошибка c1010001 Значения атрибута "level" не равны в разных фрагментах манифеста.и 2) сбой LNK1327 во время работы mt.exe.Это говорит мне о том, что исходный проект Win7 и мои файлы проекта Win10, вероятно, содержат некоторые ошибки, в противном случае VS должен был выбросить эти ошибки мне.Это не отвечает, почему даже на тестовом проекте TlbExp.exe не удается.Возможно, некоторые атрибуты в манифесте обязательны.Я просто оставил значения по умолчанию.

Манифест пакета (Впервые я увидел один из них. Я всегда видел вид app.manifest.)

<?xml version="1.0" encoding="utf-8"?>
<!-- TODO: Make sure to set the Package attributes -->
<Package xmlns="urn:Microsoft.WindowsPhone/PackageSchema.v8.00"
  Owner=""
  OwnerType="OEM"
  Platform=""
  Component=""
  SubComponent="Package"
  ReleaseType="Test" >

  <Components>
    <Driver InfSource="$(_RELEASEDIR)$(TARGETNAME).inf">
      <Reference Source="$(_RELEASEDIR)$(TARGETNAME)$(TARGETEXT)" />
      <Files>
        <!-- For kernel mode drivers, $(DRIVER_DEST) evaluates to "drivers" by default -->
        <!-- For user mode drivers, $(DRIVER_DEST) evaluates to "drivers\umdf" by default -->
        <File Source="$(_RELEASEDIR)$(TARGETNAME)$(TARGETEXT)" DestinationDir="$(runtime.system32)\$(DRIVER_DEST)" />
      </Files>
    </Driver>

  </Components>
</Package>
Эта статья имеет интересный подход, а именно: создайте C ++ DLL, а затем вызовите LoadLibrary(dll) и после этого GetProcAddress(module, "DllRegisterServer"), чтобы увидеть, какая из них не удалась.Ну, в моем случае обе функции успешны.Это означает, что автор пропустил еще одну ветку сбоев, и эти два вызова API - не единственное, что делает RegSvr32.exe.
...