Не удается загрузить устаревший 32-битный элемент управления OCX в .NET - PullRequest
2 голосов
/ 07 марта 2012

Я нахожусь в процессе разработки приложения .NET, которое опирается на устаревший элемент управления OCX. Этот элемент управления обеспечивает интерфейс терминала, позволяющий пользователю взаимодействовать с системой бронирования авиабилетов. Он уже успешно использовался в нескольких приложениях VB6, но в дальнейшем нам нужно / нужно использовать его в приложениях .NET.

Итак, для Windows XP (x86) с использованием .NET 4 и Visual Studio 2010 я создал приложения Winforms и WPF, которые используют элемент управления, который был правильно зарегистрирован. Я внедрил Reg Free COM и, используя XCOPY и Click-Once, оба проекта могут быть успешно развернуты на компьютерах с Windows XP (x86), и оба работают как положено, без необходимости регистрировать элемент управления. К сожалению, этого нельзя сказать о развертывании в Vista (x86) и Windows 7 (x64), где приложение запускается, но элемент управления не отображается.

В попытке понять проблему я попытался зарегистрировать элемент управления в моей среде разработки Windows 7 (x64). Я пробовал оба:

  • регистрация элемента управления с использованием обычного regsvr32 (реестр x64)
  • регистрация элемента управления, размещенного в каталоге SysWOW64, с использованием SysWOW64-версии regsvr32 (реестр x86)

В обоих случаях элемент управления, похоже, успешно зарегистрирован, и в новом проекте Winforms я могу добавить элемент управления на панель инструментов (появляются значки и т. Д.). Однако, как только я перетаскиваю элемент управления в форму, он появляется в виде крошечного прямоугольника в углу формы (а не в окне терминала, как в XP), даже файлы Interop генерируются так же, как в XP?!

Управление как в XP

Control in XP

Элемент управления, как видно в Windows 7 при выборе

Control in Windows 7

Я потратил целую вечность, пытаясь найти решение или подобные проблемы, но безрезультатно. Любые предложения приветствуются!

Обновление 1:

В соответствии с предложением @DanielHilgarth, я создал базовое приложение в VB6, используя элемент управления, и запустил его в Windows 7 (x64), и, к сожалению, он принимает зарегистрированный COM-компонент и работает, как ожидается, даже если приложение или проект .NET может быть запущен рядом и никакого контроля не видно!?

Обновление 2

Если я создаю базовое приложение Winforms на моем компьютере с XP, используя элемент управления (но требующий регистрации элемента управления, то есть не рег). Когда это выполняется на моем компьютере с Windows 7 (x64), if не сможет запуститься (как ожидалось) без регистрации элемента управления. Для приложения не имеет значения, зарегистрирован ли элемент управления в реестре x86 / x64, в любом случае он запустится, но элемент управления не виден!?

Обновление 3

Я заметил, что если я запустил проект Winforms (созданный в XP и COM бесплатно) в моей среде Windows 7, то конструктор форм завершится ошибкой, если элемент управления, зарегистрированный (как и ожидалось), снова не будет заботиться о том, какой реестр компонент зарегистрирован. После регистрации дизайнер формы будет виден (без контроля), а при сборке будут видны следующие предупреждения:

Windows 7 warnings

Исследование этого предупреждения было бесполезным, похоже, оно указывает на то, что Visual Studio ищет неправильный путь в реестре, но я не могу найти способ решить эту проблему?

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Ну, похоже, проблема была в DEP (Data Execution Prevention). Я предполагаю, что OCX делает вещи, которые не разрешены!?

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

Чтобы исправить ситуацию, я отредактировал пост пост в соответствии с этим блогом . Теперь это означает, что я могу отлаживать и видеть элемент управления, а при публикации через ClickOnce элемент управления теперь отображается на всех ОС, то есть XP / Vista / Windows 7.

К сожалению, элемент управления все еще не виден во время разработки, однако я могу жить с этим!

1 голос
/ 10 марта 2012

Я не думаю, что смогу дать ответ на ваш вопрос, но, возможно, я могу дать вам несколько советов по устранению неполадок.

Я просто догадываюсь, что источником вашей проблемы может быть 32проблемы с регистрацией битов в 64-битной Windows или, возможно, проблемы с разрешениями, потому что вы используете UAC.Для устранения неполадок в последней части вы можете отключить UAC и посмотреть, поможет ли это.

32-битный COM на 64-битной Windows

Я чувствую некоторую путаницу вокруг 32 против64 битаСуществует только один реестр на 64-битных Windwos.Тем не менее, COM-компонент является либо 32-разрядным, либо 64-разрядным.Это означает, что должна быть отдельная область для 32-битных регистраций в 64-битном реестре, чтобы одна и та же регистрация могла иметь две разные реализации (Wow6432Node).

Теперь важная часть заключается в том, что 32-битный процессувидит измененную версию реестра , не зная об этом .Когда COM-компонент регистрирует CLSID, он использует путь HKCR\CLSID, не зная, что он сопоставлен с HKCR\Wow6432Node\CLSID.С другой стороны, если вы хотите проверить 32-битную регистрацию с помощью 64-битного Regedit, вам нужно поискать там.Однако зачастую проще устранить неполадки в 32-битной регистрации в 64-битной среде с помощью 32-битного Regedit в %systemroot%\syswow64\regedit.exe, где вы видите реестр так, как его видит 32-битный процесс.

Элемент управления, который вы хотите использовать,родной 32-битный элемент управления и не будет загружаться или работать в 64-битном процессе.Вы пишете, что «регистрируете элемент управления с помощью обычного regsvr32 (реестр x64)», но это невозможно.Вы должны убедиться, что и элемент управления, и все его зависимости зарегистрированы правильно с 32-битной точки зрения.Если вы посмотрите на регистрацию с 64-битной точки зрения, вам нужно полностью понять, как Windows переназначает реестр на 32-битный (или просто переключиться на 32-битный Regedit).

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

COM-Free-Registration

Я бы порекомендовал прочитать раздел Устранение неполадок в статье Активация компонентов COM без регистрации: пошаговое руководство :

При устранении неполадок с проблемами COM без регистрации программа просмотра событий [...] твой друг

...