Windows 8上的Visual C ++ 6.0

时间:2013-01-24 19:12:41

标签: visual-c++ windows-8 vc6

Windows 8不支持Visual C ++ 6.0,但我们还有一些遗留应用仍然需要使用Visual C ++ 6.0进行编译。 : - (

可以通过取消选中数据访问 - >在Windows 8上安装Visual C ++ 6.0。更改选项 - > ADO,RDS和OLE DB提供程序。请参阅this SU-questionthis thread。您还需要在之后安装SP6。

Visual C ++ 6.0在一台计算机上运行完美,但另外两台计算机无法使用调试器。相同的硬件,相同版本的Windows,同一个人在做安装,同一个项目。必须有一些区别......

在有问题的计算机上,您可以设置断点,调试器将进入IDE,但是当您尝试执行步骤时,步入或运行代码将因EXENAME.EXE中的未处理的异常而崩溃( OLE32.DLL):0xC0000005:访问冲突

Walter Oney报告exact same problem on MSDN forums,但他们没有解决方案,因为VC ++ 6.0不受支持。

由于我们在一台Win8计算机上运行Visual C ++ 6.0,显然有办法实现。关于差异可能是什么想法?

5 个答案:

答案 0 :(得分:5)

关闭OLE RPC调试(工具/选项/调试)对我有用(Windows 8 Pro 64位,带有SP6的Visual C ++ 6.0)。在上述MSDN论坛帖子中(稍后)建议了这个解决方案。

答案 1 :(得分:1)

一个皱纹 - 我在Windows 8.1上遇到与Visual C ++ 6.0调试器完全相同的问题。但是我找不到上面答案中描述的Tools / Options / Debug选项下的RPC调试选项。相反,我不得不进入注册表编辑器并删除上面引用的相同MSDN线程中提到的RPC Debug键(可能是因为我在安装6.0之前已经安装了更高版本的Microsoft Visual Studio)。调试器现在运行得很好,感谢之前的海报!

答案 2 :(得分:0)

我最终能够让VS 6在Win 8和Win 10上工作。基本步骤如下:

  1. 在\ Windows中创建一个名为msjava.dll的虚拟文件。 (例如,“echo> msjava.dll”)如果没有这一步,VS 6安装程序就无法走得太远。

  2. 安装VS 6和SP 6.

  3. 将MSDEV.EXE重命名为其他名称,例如MSDEVQ.EXE。

  4. 为MSDEVQ创建一个兼容性数据库,该数据库排除容错堆填充程序。如果没有这一步骤,调试大量使用HeapAlloc等的程序就会非常缓慢。

  5. 要进行调试,请确保在发生对OLE32的任何调用之前跳过断点。我在主程序的早期包含以下标题,或者(对于MFC应用程序)包含InitInstance函数:

  6. X64DebugHack.h:

    #ifdef _DEBUG
    // In order to be able to debug this application on x64, we need to single
    // step across at least one statement before ole32.dll gets loaded. So
    // always leave this breakpoint in place.
    
    requiredbreakpoint:
        int junkola = 42;
    
        // Check to see that there was a breakpoint...
    
        PUCHAR pjunk;
        _asm lea eax, requiredbreakpoint
        _asm mov pjunk, eax
    
        if (*pjunk != 0xCC)
            AfxMessageBox("Required breakpoint was not set prior to loading OLE32.DLL -- single stepping will not be possible during this debugging session.", MB_OK | MB_ICONHAND, 0);
    
        LoadLibrary("OLE32");
    #endif
    
    1. 编写一个提供“停止调试”按钮的扩展DLL。扩展必须搜索和销毁调试句柄,它们在Win64中具有与Win32中不同的句柄类型。编写扩展的机制超出了本论坛的范围,但实际工作的代码在这里:
    2. CCommands :: HelpAssistantKill:

      typedef LONG NTSTATUS;
      #define NT_SUCCESS(Status)  (((NTSTATUS)(Status)) >= 0)
      #define STATUS_INFO_LENGTH_MISMATCH      ((NTSTATUS)0xC0000004L)
      
      enum SYSTEM_INFORMATION_CLASS {
          SystemHandleInformation = 16,
          };
      
      typedef NTSTATUS(NTAPI *PNTQUERYSYSTEMINFORMATION)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
      
      typedef struct _SYSTEM_HANDLE_INFORMATION {
          ULONG ProcessId;
          UCHAR ObjectTypeNumber;
          UCHAR Flags;
          USHORT Handle;
          PVOID Object;
          ACCESS_MASK GrantedAccess;
          } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
      
      typedef struct _SYSTEM_HANDLE_INFORMATION_DATA {
          ULONG HandleCount;
          SYSTEM_HANDLE_INFORMATION HandleInformation[1];
          } SYSTEM_HANDLE_INFORMATION_DATA, *PSYSTEM_HANDLE_INFORMATION_DATA;
      
      #define HANDLE_TYPE_DEBUG_OBJECT 11     // correct value for Win8 x64
      
      STDMETHODIMP CCommands::HelpAssistantKill()
          {                           // CCommands::HelpAssistantKill
          AFX_MANAGE_STATE(AfxGetStaticModuleState());
      
          BOOL didit = FALSE;
          HMODULE hDll = NULL;
          PSYSTEM_HANDLE_INFORMATION_DATA phi = NULL;
      
          do  {                       // do once
              HRESULT hr;
      
              // Locate NtQuerySystemInformation within NTDLL.DLL
      
              hDll = LoadLibrary("NTDLL");
              if (!hDll)
                  break;
      
              PNTQUERYSYSTEMINFORMATION NtQuerySystemInformation = (PNTQUERYSYSTEMINFORMATION) GetProcAddress(hDll, "NtQuerySystemInformation");
              if (!NtQuerySystemInformation)
                  break;
      
              // Do an initial query to get the number of handles presently open in the system.
              // This is a large number. The returned length value is meaningless for this query.
      
              SYSTEM_HANDLE_INFORMATION_DATA hid;
              DWORD junk;
              NTSTATUS status = (*NtQuerySystemInformation)(SystemHandleInformation, &hid, sizeof(hid), &junk);
              if (!NT_SUCCESS(status) && status != STATUS_INFO_LENGTH_MISMATCH)
                  break;
      
              ULONG length = sizeof(SYSTEM_HANDLE_INFORMATION_DATA) + (hid.HandleCount - 1) * sizeof(SYSTEM_HANDLE_INFORMATION);
              phi = (PSYSTEM_HANDLE_INFORMATION_DATA) new UCHAR[length];
              if (!phi)
                  break;
      
              // Get a list of all handles open in the system
      
              status = (*NtQuerySystemInformation)(SystemHandleInformation, phi, length, &junk);
              if (!NT_SUCCESS(status))
                  break;
      
              // Find and close any debug objects that are open in this instance of Visual Studio.
      
              DWORD pid = GetCurrentProcessId();
              ULONG ihandle;
              for (ihandle = 0; ihandle < hid.HandleCount; ++ihandle)
                  {                   // for each open handle
                  PSYSTEM_HANDLE_INFORMATION p = phi->HandleInformation + ihandle;
                  if (p->ProcessId != pid || p->ObjectTypeNumber != HANDLE_TYPE_DEBUG_OBJECT)
                      continue;
      
                  if (CloseHandle((HANDLE) p->Handle))
                      didit = TRUE;           
                  }                   // for each open handle
      
              // Instruct DevStudio to stop
      
              BSTR bsStopDebugging = SysAllocString(L"DebugStopDebugging");
              if (!bsStopDebugging)
                  break;
      
              hr = m_pApplication->ExecuteCommand(bsStopDebugging);
              SysFreeString(bsStopDebugging);
              if (hr != 0)
                  break;
              }                       // do once
          while (FALSE);
      
          if (phi)
              delete[] phi;
      
          if (hDll)
              FreeLibrary(hDll);
      
          if (!didit)
              {                       // didn't do anything
              MessageBox(NULL, "Unable to find and close any debug object handles", "HelpAssistant", MB_OK | MB_ICONINFORMATION);
              }                       // didn't do anything
      
          return S_OK;
          }                           // CCommands::HelpAssistantKill
      

      这感觉就像一个非常英勇的努力,但我有大约一百万行代码构建在VS 6上,我必须继续工作。现在我已经为VS 2015构建了一个可行的宏处理器,我可以对这个应用程序进行转换。

答案 3 :(得分:0)

问题是由于不兼容的“ADO,RDS和OLE DB提供程序”随Visual C ++ 6.0一起提供。

请按照下面提到的步骤禁用ADO,RDS和OLE DB提供程序并安装Visual C ++ 6.0 -

1)照常开始安装。

2)当安装程序询问安装类型时,单击自定义安装。

3)单击可用项目的数据访问,然后单击“更改选项”。

4)在新窗口中取消选择“ADO,RDS和OLE DB提供程序”,然后单击“确定”(忽略警告)。

5)单击继续以继续安装。

6)安装程序在“更新组件”期间不会冻结,并且会成功安装。

7)现在安装Service Pack“Vs6sp6”,它也将成功安装。

答案 4 :(得分:0)

以上答案不适合我。

来自this site的解决方案解决了我的问题。

  

重新注册ole32.dll文件并检查它是否有帮助。

     
      
  1. 单击“开始”,在“开始搜索”中键入cmd。

  2.   
  3. 右键单击cmd,然后单击以管理员身份运行。

  4.   
  5. 在命令提示符下,键入以下命令并按Enter   在每个命令之后。

         

    takeown / f ole32.dll

         

    regsvr32 ole32.dll

  6.   
  7. 运行上述两个命令后关闭命令提示符。

  8.         

    尝试运行应用程序并检查问题是否仍然存在。