2011-08-06 51 views
1

我在64位非託管dll中創建了一個ATL控件。64位ATL控件不適用於VC++ Forms應用程序

我想在VC++ WinForms應用程序中使用此控件。

當我運行應用程序時,我得到了badimageformatexception。

然後我創建了一個VB應用程序和一個C#應用程序。在這兩種情況下,它沒有問題。 然後我用Microsoft提供的TstCon(MFC-64bit)測試了我的控件。控制被認爲沒有問題,我可以調用它的一些方法。

唯一不能使它工作的情況是VC++ Forms(我和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++項目不起作用。如果您嘗試運行它,您將得到badimageformatexception。當我按下設置屬性值的按鈕時,有時會出現錯誤。

全部都是64位。

你知道我做錯了什麼嗎?

感謝, 米哈伊

回答

2

的BadImageFormatException始終是你的程序使用了錯誤的位數DLL中的明確跡象。在你的情況下,麻煩製造者是在C++/CLI項目中爲ActiveX控件生成的互操作庫。這是你會看到你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 

注意,32位標記將被打開,KABOOM那裏。當您在C++/CLI項目中添加對類型庫的引用時,就會出現此問題。不幸的是,生成互操作庫的工具(「Managed Wrapper Generator Tool」)正在創建一個只有32位的互操作庫。很難打電話給別的,只是一個錯誤。我可以看到它是如何發生的,類型庫也具有(小)位元相關性。

通過自己運行Tlbimp.exe修復此問題,而不是依靠IDE來弄錯它。你已經有了一個互操作庫,這是很好的順便說一句,C#項目中的一個是正確的,並且關閉了32BIT標誌。這個項目有點奇怪,互操作庫被困在obj目錄中。不知道這是怎麼發生的,沒有看。

+0

非常感謝! – Mihai

相關問題