Запуск 32-разрядного приложения с использованием 32-разрядного com на 64-разрядном компьютере с Windows

StackOverflow https://stackoverflow.com/questions/972305

  •  13-09-2019
  •  | 
  •  

Вопрос

У меня есть приложение на C #, использующее COM-объект C ++, оба построены на 32-разрядной машине.Теперь я должен запустить их на 64-битной машине.Я зарегистрировал COM-объект.Соответствующая запись была создана в реестре в разделе computer\□\wow6432node\clsid{xxx}.Однако, когда я пытаюсь запустить приложение, оно сообщает, что |"Не удалось получить фабрику COM-класса для компонента с CLSID {xxx} из-за следующей ошибки:80040154.".Как я понимаю, код ошибки означает, что класс не зарегистрирован.Пожалуйста, помогите!!!Спасибо

Это было полезно?

Решение

Первый ответ выше - это правильный ответ.Вы не сможете запустить процессор ЛЮБОГО целевого приложения в 64-разрядной Windows, если вы ссылаетесь на 32-разрядный COM-компонент.Он не будет загружаться.

Что происходит, так это то, что JIT видит CPU ANY и переводит ваше приложение на 64-разрядную версию.Но нет 64-разрядной версии com-элемента управления, и, следовательно, вы получаете ошибку not registered.

Это большая проблема для людей, которые используют Microsoft Access для своей базы данных.64-разрядной версии Access не существует, поэтому, когда они видят ошибку, они думают, что им нужна 64-разрядная среда выполнения (не существует).Вы должны пометить свое приложение как 32-разрядное только для того, чтобы использовать среду выполнения Access.

Это плохой выбор (ИМХО) - найдите лучший компонент с 64-разрядной версией или используйте 100% управляемый код.

Мне не нравится помечать все приложения как 32-разрядные только в том случае, если им это ДЕЙСТВИТЕЛЬНО не нужно.

Другие советы

Приложение C #, возможно, было скомпилировано с любым целевым процессором, который будет работать как в 64-разрядном режиме на компьютере x64.64-разрядные процессы не могут получить доступ к 32-разрядным процессам.

В Visual Studio вы можете принудительно скомпилировать его как 32-разрядное приложение.Это находится в раскрывающемся списке Свойства проекта, вкладка Сборка, Целевая платформа.Установите его на x86.

Могут быть и другие способы заставить его работать как 32-разрядное приложение, но я с ними не знаком.

Среда выполнения .NET автоматически запускает приложение как 64-разрядное, и оно больше не может загружать 32-разрядный COM-компонент в свой процесс.

Это очень легко обойти, если COM-компонент имеет интерфейс, совместимый с автоматизацией.Создайте приложение COM+ (Панель управления-> Административные инструменты-> Службы компонентов) и добавьте в него компонент.Таким образом, вы принудительно создадите компонент в отдельном процессе, и вам больше не будет важно, чтобы ваше клиентское приложение работало как 64-разрядное.

Я не думаю, что вы можете запустить 32-разрядное приложение изначально на 64-разрядной машине.Вам нужно скомпилировать свое приложение в виде 64-битного двоичного файла или запустить его под эмулятором (например, WOW64 в Windows).Если ваше приложение (построенное в 64-битном двоичном формате) использует какие-либо внешние библиотеки dll, вам также понадобится 64-битная версия всех этих библиотек DLL.

Вот хорошая ссылка:

http://searchwindowsserver.techtarget.com/tip/0 ,289483,sid68_gci1220022,00.html

Редактировать:

Если вы перейдете в Свойства вашего проекта -> Сборка, измените целевую платформу с "Любой процессор" на X86.Посмотрим, поможет ли это.

Или вам нужно зарегистрировать свои библиотеки dll: http://riteshk.blogspot.com/2007/05/retrieving-com-class-factory-failed-due.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top