2012-03-07 12 views
2

Я занимаюсь разработкой приложения .NET, которое опирается на стареющий элемент управления OCX. Этот элемент управления обеспечивает интерфейс терминала, который позволяет пользователю взаимодействовать с системой бронирования авиабилетов. Он уже используется «успешно» в нескольких приложениях VB6, но в будущем нам нужно/нужно использовать его в .NET-приложениях.Старение 32-разрядного элемента управления OCX не загружается в .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

Я провел возрастов тралового сеть для любого вида раствора или схожие проблемы безрезультатно. Любые предложения приветствуются!

Update 1:

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

Update 2

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

Update 3

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

Windows 7 warnings

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

+0

Можете ли вы успешно использовать приложение VB6 с элементом управления OCX на машине Win7? BTW: вы можете загружать изображения в imageshack или аналогичный хостинг-провайдер и связывать их в свой вопрос. –

+0

Это не похоже на проблему регистрации, которая генерирует исключения. Это похоже на элемент управления VB6, который нельзя просто разместить в форме .NET. Не каждый сценарий поддерживается, он должен быть достаточно эффективным элементом управления ActiveX. Не может быть оконным, не может создать собственное окно верхнего уровня и т. Д. Работайте с владельцами этого контроля, чтобы двигаться вперед. –

+0

@ DanielHilgarth, это очень хороший вопрос. Раньше я не ездил по этому пути, потому что предыдущие приложения VB6 разработчика были очень бедными и требовали, чтобы он «настраивал» их установку! Но я отдам его! – snipey

ответ

1

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

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

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

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

1

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

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

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

Я чувствую немного путаницы вокруг 32 против 64 бит. На 64-битном Windwos есть только один реестр. Однако COM-компонент является либо 32-битным, либо 64-битным. Это означает, что в 64-битном реестре должна быть отдельная область для 32-битных регистраций, поэтому одна и та же регистрация может иметь две разные реализации (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).

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

Учетно-Free COM

Я рекомендую прочитать раздел Устранение в статье Registration-Free Activation of COM Components: A Walkthrough:

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

+0

Мартин, спасибо, что нашли время ответить!
В некотором смысле вы правы в связи с путаницей в 32/64 бит-реестрах; главным образом, из попыток расследовать эту проблему. Во многих случаях люди предлагали использовать regsvr32.exe, найденный в каталоге SysWow64. Я попытался понять в своем посте, что использовал обе версии regsvr32.exe; оба кажутся успешными без каких-либо проблем, подробно описанных в средстве просмотра событий, но все же ничего не работает! .... – snipey

+0

... Вы подтвердили свое понимание Wow6432Node, но я все еще немного смущен предупреждением, увиденным в Visual Studio. Я могу зарегистрировать компонент; найти запись в 'x64' regedit под 'HKCR \ Wow6432Node \ CLSID', а также непосредственно под' HKCR \ CLSID', если смотреть в 32-битном regedit, но Visual Studio не может это увидеть? ... – snipey

+0

. .. Я согласился сначала использовать регистрационный подход и тестировал различные вещи. Одна странная вещь, которую я заметил, это то, что я могу отменить регистрацию компонента и подтвердить отсутствие идентификатора класса в реестре. Тем не менее, пока DLL компонента находится в каталоге 'Windows \ SysWow64', работает тестовое приложение VB6 (созданное на компьютере XP с зарегистрированным компонентом)? – snipey