C ++应用程序在64位版本的Windows中崩溃,但在32位窗口上工作正常

时间:2015-06-03 21:16:56

标签: c++ .net com

所以我有一个Visual C ++应用程序,在我的代码中我使用CoCreateInstance函数,该函数用于创建COM对象并从对象获取接口:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms686615(v=vs.85).aspx

此功能:

hr = CoCreateInstance(CLSID_CppCmnBL, NULL, CLSCTX_INPROC_SERVER, 
         IID_ICppCmnBL, reinterpret_cast<void**>(&m_pBL)); 

在32位版本的Windows上运行良好,但在64位版本的Windows上运行失败。

我看了很多,似乎在64位系统上注册32位对象时存在问题。

相关问题:

https://social.msdn.microsoft.com/Forums/en-US/3841717c-a736-46d0-b214-0b047efcd16c/32-bit-app-cocreateinstance-failed-on-64-bit-windows-with-error-0x80090006-invalid-signature?forum=vclanguage

http://forums.codeguru.com/showthread.php?400956-32-bit-app-CoCreateInstance-fails-on-64-bit

我得到的异常是:System.AccessViolationException

1 个答案:

答案 0 :(得分:0)

请这样做:

  1. 澄清所涉及的#/二进制文件。
  2. 我假设您有一个.exe(一个调用CoCreateInstance())和一个.dll(您尝试实例化的Com / ActiveX对象)。这是对的吗?

    1. 请在您的二进制文件上运行dumpbin /all并发布结果。
    2. 请在所有相关二进制文件上运行dumpbin; 特别是 COM / ActiveX类。

      Win32 .dll应该喜欢这样的东西:

      FILE HEADER VALUES
                   14C machine (x86)
                     3 number of sections
              5355B2AD time date stamp Mon Apr 21 17:07:09 2014
                     0 file pointer to symbol table
                     0 number of symbols
                    E0 size of optional header
                  2102 characteristics
                         Executable
                         32 bit word machine
                         DLL
      
      OPTIONAL HEADER VALUES
                   10B magic # (PE32)
      
      1. 请说明您尝试使用您的二进制文件重建哪些二进制文件 MSVS 6编译器。
      2. MSVS 6不能与.Net合作; MSVS 6不会构建C ++ 11代码......但是如果您尝试做的只是让遗留应用程序正常工作,那应该没问题。再说一遍,我假设只有一个.exe和一个.dll在混合中。

        我假设.exe可以编译为32位Win32 .exe( .Net .exe),而.dll是Win32,COM / ActiveX类。两者都应该有#34; PE32&#34; dumpbin中的标头。如果不是,请告知。

        我假设您可以控制,并且可以重建和调试此应用的相关源代码的所有。如果不是,请告知。

        1. 您应该可以使用regsvr32注册COM / ActiveX .dll。
        2. 如果你不能,那可能表明某些事情是错的&#34;,我会把你的故障排除工作集中在那里。

          我希望有所帮助!