我正在尝试将一个旧项目从 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 新手,我在网上没有找到有用的提示,我不知道如何干预。
感谢所有花时间陪伴我的人。
碰巧我也遇到了同样的问题。不同机器上的不同结果可能是由于崩溃的机器具有全局桌面分辨率缩放活动,而不崩溃的是 100% 桌面缩放。 仅当工具栏尝试缩放包含的图像以匹配全局缩放时,才会调用有问题的库函数(并崩溃)。但我还没有找到根本原因。然而,在我的例子中,并不是每个 AfxToolbar 都会发生这种情况,所以这个问题很可能可以通过某种方式避免。