我正在尝试将旧项目从 VS2008 移植到 VS2015。这个项目使用 MFC,我有一个编译版本,但它在 InitInstance 方法期间抛出异常,更准确地说是在调用 UpdateWindow 时。例外是读取访问冲突类型。这里有详细信息(评论是意大利语):
BOOL CMyAppApp::InitInstance()
{
// InitCommonControlsEx() è necessario in Windows XP se nel manifesto
// di un'applicazione è specificato l'utilizzo di ComCtl32.dll versione 6 o successiva per attivare
// gli stili visuali. In caso contrario, non sarà possibile creare finestre.
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// Effettuare questa impostazione in modo da includere tutte le classi di controlli comuni da utilizzare
// nell'applicazione.
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinAppEx::InitInstance();
// Inizializzare le librerie OLE.
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
AfxEnableControlContainer();
// Inizializzazione standard
// Se non si utilizzano queste funzionalità e si desidera ridurre la dimensione
// dell'eseguibile finale, è necessario rimuovere dal seguente codice
// le specifiche routine di inizializzazione che non sono necessarie.
// Modificare la chiave del Registro di sistema in cui sono memorizzate le impostazioni
// TODO: è necessario modificare questa stringa in modo appropriato,
// inserendo ad esempio il nome della società o dell'organizzazione.
SetRegistryKey(_T("Applicazioni locali generate tramite la Creazione guidata applicazioni"));
LoadStdProfileSettings(0); // Caricare le opzioni del file INI standard (inclusa MRU).
InitContextMenuManager();
InitKeyboardManager();
InitTooltipManager();
CMFCToolTipInfo ttParams;
ttParams.m_bVislManagerTheme = TRUE;
theApp.GetTooltipManager()->SetTooltipParams(AFX_TOOLTIP_TYPE_ALL,
RUNTIME_CLASS(CMFCToolTipCtrl), &ttParams);
// Registrare i modelli di documenti dell'applicazione. I modelli di documenti
// funzionano da connessione tra documenti, finestre cornice e viste.
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyAppDoc),
RUNTIME_CLASS(CMainFrame), // finestra cornice SDI principale
RUNTIME_CLASS(CMyAppView));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
// Analizzare la riga di comando per i comandi shell standard, DDE, apri file
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Invia i comandi specificati nella riga di comando. Restituisce FALSE se
// l'applicazione è stata avviata con l'opzione /RegServer, /Register, /Unregserver o /Unregister.
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// L'unica e sola finestra è stata inizializzata, quindi è possibile visualizzarla e aggiornarla.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->SetWindowTextW(_T("MyApp"));
m_pMainWnd->UpdateWindow();
// richiamare DragAcceptFiles solo se è presente un suffisso.
// In un'applicazione SDI questo deve verificarsi dopo ProcessShellCommand.
return TRUE;
}
堆栈报告 mfc140ud.dll!CMFCToolBarImages::SmoothResize(double dblImageScale)处的违规,并显示消息:抛出异常:读取访问违规。pRowSrc2 是 0x6439008。
我已经直接在 VS2015 中使用 MFC 启动了一个新项目,以查看差异,之前CCommandLineInfo cmdInfo;
有这个:
// create main MDI Frame window
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
{
delete pMainFrame;
return FALSE;
}
m_pMainWnd = pMainFrame;
但即使我在 MyApp 中添加了它也不起作用。
如果我评论m_pMainWnd->UpdateWindow()
相同类型的读取访问冲突异常,则会抛出异常。堆栈在mfc140ud.dll!CMFCToolBarImages::SmoothResize(double dblImageScale)处停止
我在另外两台电脑上试过了。在一个我有同样的问题,在他另一个没有问题,所以我认为这是关于可再发行或其他类似的东西的东西。在工作机器上,安装的 vc++ 版本是 14.0.24215,而在我的机器上是 14.2930133,所以我已经删除了它并且我已经安装了 vc++ 的版本 14.23026,但这并没有解决问题。
我是 MFC 的新手,我没有在网络上找到有用的提示,我不知道如何干预。
感谢所有为我花时间的人。