【问题标题】:64 bit ATL Control does not work with VC++ Forms app64 位 ATL 控件不适用于 VC++ Forms 应用程序
【发布时间】:2011-10-21 09:52:43
【问题描述】:

我在 64 位非托管 dll 中创建了一个 ATL 控件。

我想在 VC++ WinForms 应用程序中使用这个控件。

当我运行应用程序时,我得到了 badimageformatexception。

然后我创建了一个 VB 应用程序和一个 C# 应用程序。在这两种情况下,它都可以正常工作。 然后我用微软提供的 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 位的。

你知道我做错了什么吗?

谢谢, 米海

【问题讨论】:

    标签: winforms visual-studio visual-c++ com atl


    【解决方案1】:

    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
    

    请注意,32BIT 标志已打开,kaboom 在那里。当您在 C++/CLI 项目中添加对类型库的引用时,这个问题就开始了。不幸的是,生成互操作库的工具(“Managed Wrapper Generator Tool”)正在创建一个仅 32 位的互操作库。除了错误之外,很难将其称为其他任何东西。我可以看到它是如何发生的,类型库确实也有一个(小)位依赖性。

    通过自己运行 Tlbimp.exe 而不是依赖 IDE 来解决此问题。顺便说一句,您已经有一个很好的互操作库,C# 项目中的那个是正确的,并且关闭了 32BIT 标志。顺便说一句,那个项目有点奇怪,互操作库卡在了 obj 目录中。不知道是怎么回事,没看过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      相关资源
      最近更新 更多