Windows 8不支持Visual C ++ 6.0,但我们还有一些遗留应用仍然需要使用Visual C ++ 6.0进行编译。 : - (
可以通过取消选中数据访问 - >在Windows 8上安装Visual C ++ 6.0。更改选项 - > ADO,RDS和OLE DB提供程序。请参阅this SU-question和this 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,显然有办法实现。关于差异可能是什么想法?
答案 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上工作。基本步骤如下:
在\ Windows中创建一个名为msjava.dll的虚拟文件。 (例如,“echo> msjava.dll”)如果没有这一步,VS 6安装程序就无法走得太远。
安装VS 6和SP 6.
将MSDEV.EXE重命名为其他名称,例如MSDEVQ.EXE。
为MSDEVQ创建一个兼容性数据库,该数据库排除容错堆填充程序。如果没有这一步骤,调试大量使用HeapAlloc等的程序就会非常缓慢。
要进行调试,请确保在发生对OLE32的任何调用之前跳过断点。我在主程序的早期包含以下标题,或者(对于MFC应用程序)包含InitInstance函数:
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
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文件并检查它是否有帮助。
单击“开始”,在“开始搜索”中键入cmd。
右键单击cmd,然后单击以管理员身份运行。
在命令提示符下,键入以下命令并按Enter 在每个命令之后。
takeown / f ole32.dll
regsvr32 ole32.dll
- 醇>
运行上述两个命令后关闭命令提示符。
尝试运行应用程序并检查问题是否仍然存在。