Я обновил библиотеку OCX с VS2010 / Win7 до VS2019 / Win10.Сборка проекта, однако, когда я пытаюсь использовать RegSvr32.exe
из командной строки с повышенными правами, я получаю сообщение об ошибке 0x0040200.Я сделал немного отладки, и оскорбительный вызов - это вызов AfxOleRegisterTypeLib
.
Да, я видел это ТАК статья, в которой говорится, что "отсутствие файла 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.
Я думаю, что, возможно, манифесту 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.
Размещение файла 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)
).
Комментарий для новичков разработчиков, regasm.exe
- для сборок .Net.RegSvr32.exe
для ActiveX Controls (OCX/DLL)
, что у меня есть.RegSvr32 предназначен для динамически загружаемых модулей, следовательно, точка входа DllRegister.
Мысли?
Примечания из дальнейшего тестирования
(суббота, 21.09.2009Когда я обновлялся, я создал пустой C ++ DLL-проект, а затем добавил все файлы, изменив целевое расширение на OCX, пройдя через настройки старого проекта и, когда это целесообразно, сопоставив их с новым файлом проекта, желая сохранить то же самое.Я хотел сделать тест и посмотреть, что происходит с новым проектом OCX.Я видел, что существует такая вещь, как «Управление MFC ActiveX» для типа проекта в VS2019.Я создал это и увидел, что я получил разные базовые файлы, но что более важно, RegSvr32.exe работает.Это означает, что либо ошибка была исходным файлом проекта, поэтому мне нужно импортировать в чистый проект или импортировать по частям, если это возможно, и посмотреть, где что-то сломалось.
(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
.