0

我正在尝试将旧项目从 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 的新手,我没有在网络上找到有用的提示,我不知道如何干预。

感谢所有为我花时间的人。

4

0 回答 0