64-битное управление ATL не работает с приложением VC ++ Forms - PullRequest
1 голос
/ 06 августа 2011

Я создал элемент управления ATL в 64-битной неуправляемой dll.

Я хочу использовать этот элемент управления в приложении VC ++ WinForms.

Когда я запускаю приложение, я получаю badimageformatexception.

Затем я создал приложение VB и приложение C #.В обоих случаях это работает без проблем.Затем я проверил свой контроль с помощью TstCon (MFC-64bit), предоставленной Microsoft.Элемент управления был распознан без проблем, и я смог вызвать некоторые из его методов.

Единственный случай, когда я НЕ смог заставить его работать, - это формы VC ++ (я работаю с VS 2010 pro).

Я создал небольшой тестовый пример.

Загрузите его отсюда:

https://rapidshare.com/files/2799321813/atl.zip

Элемент управления ATL находится в папке atl_project_64.Это простой элемент управления с 1 свойством (Number) и одним событием (OnChange).Здесь я выполнил все шаги: http://msdn.microsoft.com/en-us/library/599w5e7x.aspx

Скомпилируйте проект.

Затем я создал 2 приложения WinForms для тестирования элемента управления.C # работает без проблем.Не забудьте добавить ссылку на Atl_project_64Lib.Если вы не можете найти его в списке объектов Com, вы можете перейти к папке, в которой создана dll.

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

Все они являются 64-битными.

Вы хоть понимаете, что я сделал неправильно?

спасибо, михай

1 Ответ

2 голосов
/ 06 августа 2011

BadImageFormatException всегда является верным признаком того, что ваша программа использует DLL с неправильной разрядностью.Проблемой в вашем случае является библиотека взаимодействия, созданная для элемента управления ActiveX в вашем проекте C ++ / CLI.Вот что вы увидите, что вы запускаете на нем corflags.exe:

C:\projects\atl\test_atl - VC++\x64\Debug>corflags Interop.atl_project_64Lib.1.0
.dll
Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  4.0.30319.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Version   : v4.0.30319
CLR Header: 2.5
PE        : PE32
CorFlags  : 3
ILONLY    : 1
32BIT     : 1
Signed    : 0

Обратите внимание, что флаг 32BIT включен, kaboom там.Эта проблема началась, когда вы добавили ссылку на библиотеку типов в ваш проект C ++ / CLI.К сожалению, инструмент, который генерирует библиотеку взаимодействия («Managed Wrapper Generator Tool»), создает библиотеку взаимодействия, которая является только 32-битной.Трудно назвать это чем-то еще, кроме ошибки.Я могу видеть, как это произошло, но библиотеки типов тоже имеют (небольшую) зависимость от битности.

Исправьте эту проблему, запустив Tlbimp.exe самостоятельно, вместо того, чтобы полагаться на IDE, чтобы ошибиться.У вас уже есть библиотека взаимодействия, которая хороша между прочим, библиотека в проекте C # правильная и с выключенным флагом 32BIT.Что-то странное с этим проектом, кстати, библиотека взаимодействия застряла в каталоге obj.Не уверен, как это случилось, не выглядело.

...