Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2020, 14:38   #1
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию Проблема с запуском диалогового приложения

Есть файл LunarMissionsOrbits.cpp для главного класса приложения и файл LunarMissionsOrbitsDlg.cpp для главного диалога приложения.
Вот эти файлы:

1) файл LunarMissionOrbits.h :

Код:
// LunarMissionOrbits.h : main header file for the PROJECT_NAME application
//

#pragma once

#ifndef __AFXWIN_H__
    #error "include 'stdafx.h' before including this file for PCH"
#endif

#include "resource.h"        // main symbols


// CLunarMissionsOrbitsApp:
// See LunarMissionsOrbits.cpp for the implementation of this class
//

class CLunarMissionsOrbitsApp : public CWinApp
{
public:
    CLunarMissionsOrbitsApp();

// Overrides
public:
    virtual BOOL InitInstance();

// Implementation

    DECLARE_MESSAGE_MAP()
};

extern CLunarMissionsOrbitsApp theApp;

2) файл LunarMissionOrbits.cpp :

Код:
// LunarMissionsOrbits.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "LunarMissionsOrbits.h"
#include "LunarMissionsOrbitsDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CLunarMissionOrbits2App

BEGIN_MESSAGE_MAP(CLunarMissionOrbits2App, CWinApp)
    ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()


// CLunarMissionsOrbitsApp construction

CLunarMissionsOrbitsApp::CLunarMissionsOrbitsApp()
{
    // support Restart Manager
    m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;

    // TODO: add construction code here,
    // Place all significant initialization in InitInstance
}


// The one and only CLunarMissionOrbits2App object

CLunarMissionsOrbitsApp theApp;


// CLunarMissionsOrbitsApp initialization

BOOL CLunarMissionsOrbitsApp::InitInstance()
{
    // InitCommonControlsEx() is required on Windows XP if an application
    // manifest specifies use of ComCtl32.dll version 6 or later to enable
    // visual styles.  Otherwise, any window creation will fail.
    INITCOMMONCONTROLSEX InitCtrls;
    InitCtrls.dwSize = sizeof(InitCtrls);
    // Set this to include all the common control classes you want to use
    // in your application.
    InitCtrls.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&InitCtrls);

    CWinApp::InitInstance();


    // Create the shell manager, in case the dialog contains
    // any shell tree view or shell list view controls.
    CShellManager *pShellManager = new CShellManager;

    // Standard initialization
    // If you are not using these features and wish to reduce the size
    // of your final executable, you should remove from the following
    // the specific initialization routines you do not need
    // Change the registry key under which our settings are stored
    // TODO: You should modify this string to be something appropriate
    // such as the name of your company or organization
    SetRegistryKey(_T("Local AppWizard-Generated Applications"));

    CLunarMissionsOrbitsDlg dlg;
    m_pMainWnd = &dlg;
    INT_PTR nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
        // TODO: Place code here to handle when the dialog is
        //  dismissed with OK
    }
    else if (nResponse == IDCANCEL)
    {
        // TODO: Place code here to handle when the dialog is
        //  dismissed with Cancel
    }
        else if (nResponse == -1)
    {
        TRACE(traceAppMsg, 0, "Предупреждение. Не удалось создать диалоговое окно, поэтому работа приложения неожиданно завершена.\n");
        TRACE(traceAppMsg, 0, "Предупреждение. При использовании элементов управления MFC для диалогового окна невозможно #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS.\n");
    }
    // Delete the shell manager created above.
    if (pShellManager != NULL)
    {
        delete pShellManager;
    }

    // Since the dialog has been closed, return FALSE so that we exit the
    //  application, rather than start the application's message pump.
    return FALSE;
}
erslgoeirjh вне форума Ответить с цитированием
Старый 04.06.2020, 14:42   #2
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

3) файл LunarMissionOrbitsDlg.h :

Код:
// LunarMissionOrbitsDlg.h : header file
//

#pragma once

#include "afxwin.h"
#include "afxbutton.h"
#include "Resource.h"
#include "stdafx.h"
#include "MyStatic.h"
#include "MyMFCButton.h"
#include "MyMFCButton2.h"

// CLunarMissionOrbitsDlg dialog
class CLunarMissionsOrbitsDlg : public CDialogEx
{
// Construction
public:
    CLunarMissionsOrbitsDlg(CWnd* pParent = NULL);    // standard constructor

// Dialog Data
    enum { IDD = IDD_LUNARMISSIONORBITS_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support


// Implementation
protected:
    HICON m_hIcon;

    // Generated message map functions
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
        afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
public:
    HBRUSH  m_brush;
    CButton m_IDOK;
    //CMFCButton m_IDC_MFCBUTTON1;
    CMyMFCButton m_IDC_MFCBUTTON1;
    CMyMFCButton2 m_IDC_MFCBUTTON2;
    CMFCButton m_IDC_MFCBUTTON3;
    //CStatic m_IDC_STATIC1;
    //CStatic m_IDC_STATIC2;
    CMyStatic m_IDC_STATIC1;
    CMyStatic m_IDC_STATIC2;
    void  RedrawMFCButton(int i);
    afx_msg void OnBnClickedMfcbutton1();
    afx_msg void OnBnClickedMfcbutton2();
    afx_msg void OnBnClickedOk();
};
erslgoeirjh вне форума Ответить с цитированием
Старый 04.06.2020, 14:45   #3
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

4) файл LunarMissionOrbitsDlg.cpp :

[CODE]// LunarMissionOrbits2Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "LunarMissionOrbits2.h"
#include "LunarMissionOrbits2Dlg.h"
#include "afxdialogex.h"
#include "Satellite.h"
#include "MyMFCButton.h"
#include "MyMFCButton2.h"
#include "FlightToMoonDlg.h"
#include "FlightAroundMoonDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#pragma warning(disable : 4996)

// Диалоговое окно CAboutDlg используется для описания сведений о приложении

NewSatInit st;
Satellite *sat;

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();

// Dialog Data
enum { IDD = IDD_ABOUTBOX };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

// Implementation
protected:
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExch ange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CLunarMissionOrbits2Dlg dialog




CLunarMissionsOrbitsDlg::CLunarMiss ionsOrbitsDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CLunarMissionsOrbitsDlg:: IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CLunarMissionsOrbitsDlg::DoDataExch ange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDOK, m_IDOK);
DDX_Control(pDX, IDC_MFCBUTTON1, m_IDC_MFCBUTTON1);
DDX_Control(pDX, IDC_MFCBUTTON2, m_IDC_MFCBUTTON2);
DDX_Control(pDX, IDC_MFCBUTTON3, m_IDC_MFCBUTTON3);
DDX_Control(pDX, IDC_STATIC1, m_IDC_STATIC1);
DDX_Control(pDX, IDC_STATIC2, m_IDC_STATIC2);
}

BEGIN_MESSAGE_MAP(CLunarMissionsOrb itsDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDC_MFCBUTTON1, &CLunarMissionsOrbitsDlg::OnBnClick edMfcbutton1)
ON_BN_CLICKED(IDC_MFCBUTTON2, &CLunarMissionsOrbitsDlg::OnBnClick edMfcbutton2)
ON_BN_CLICKED(IDOK, &CLunarMissionsOrbitsDlg::OnBnClick edOk)
END_MESSAGE_MAP()
erslgoeirjh вне форума Ответить с цитированием
Старый 04.06.2020, 14:48   #4
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

5) файл LunarMissionOrbitsDlg.cpp (окончание):

Код:
// CLunarMissionOrbits2Dlg message handlers

BOOL CLunarMissionsOrbitsDlg::OnInitDialog()
{
        CFont  *pfont1, *pfont2, *pfont3, *pfont4, *pfont5, *pfont6;
    LOGFONT  lf1, lf2, lf3;

    CDialogEx::OnInitDialog();

    // Add "About..." menu item to system menu.

    // IDM_ABOUTBOX must be in the system command range.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    // TODO: Add extra initialization here
            //m_IDC_MFCBUTTON1.pMFCButton2 = &m_IDC_MFCBUTTON2;
    //m_IDC_MFCBUTTON2.pMFCButton = &m_IDC_MFCBUTTON1;
    //m_IDC_MFCBUTTON1.pDialog = this;
    //m_IDC_MFCBUTTON2.pDialog = this;
    memset(&lf1,0,sizeof(lf1));
    lf1.lfHeight = 40;
    lf1.lfWidth = 10;
    lf1.lfWeight = FW_BOLD;
    lf1.lfCharSet = ANSI_CHARSET;
    lf1.lfOutPrecision = OUT_DEFAULT_PRECIS;
    lf1.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    lf1.lfQuality = PROOF_QUALITY;
    lf1.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN;
    //strcpy(lf1.lfFaceName,"MS Sans Serif");
    wcscpy(lf1.lfFaceName,L"MS Sans Serif");
    pfont1 = new CFont();
    pfont1->CreateFontIndirect(&lf1);
    pfont2 = new CFont();
    pfont2->CreateFontIndirect(&lf1);
    m_IDC_STATIC1.SetFont(pfont1);
    m_IDC_STATIC2.SetFont(pfont2); 
    memset(&lf2,0,sizeof(lf2));
    lf2.lfHeight = 25;
    lf2.lfWidth = 10;
    lf2.lfWeight = FW_BOLD;
    lf2.lfCharSet = ANSI_CHARSET;
    lf2.lfOutPrecision = OUT_DEFAULT_PRECIS;
    lf2.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    lf2.lfQuality = PROOF_QUALITY;
    lf2.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN;
    //strcpy(lf2.lfFaceName,"MS Sans Serif");
    wcscpy(lf2.lfFaceName,L"MS Sans Serif");
    pfont3 = new CFont();
    pfont3->CreateFontIndirect(&lf2);
    pfont4 = new CFont();
    pfont4->CreateFontIndirect(&lf2);
    pfont5 = new CFont();
    pfont5->CreateFontIndirect(&lf2);
    m_IDC_MFCBUTTON1.SetFont(pfont3);
    m_IDC_MFCBUTTON2.SetFont(pfont4);
    m_IDC_MFCBUTTON3.SetFont(pfont5);
    memset(&lf3,0,sizeof(lf3));
    lf3.lfHeight = 16;
    lf3.lfWidth = 6;
    lf3.lfWeight = FW_NORMAL;
    lf3.lfCharSet = ANSI_CHARSET;
    lf3.lfOutPrecision = OUT_DEFAULT_PRECIS;
    lf3.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    lf3.lfQuality = PROOF_QUALITY;
    lf3.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN;
    //strcpy(lf3.lfFaceName,"MS Shell Dlg");
    wcscpy(lf3.lfFaceName,L"MS Shell Dlg");
    pfont6 = new CFont();
    pfont6->CreateFontIndirect(&lf3);
    m_IDOK.SetFont(pfont6);
    m_IDC_STATIC1.RedrawWindow();
    //m_IDC_STATIC1.UpdateWindow();
    m_IDC_STATIC2.RedrawWindow();
    //m_IDC_STATIC2.UpdateWindow();
    //m_IDC_MFCBUTTON1.RedrawWindow();
    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CLunarMissionsOrbitsDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialogEx::OnSysCommand(nID, lParam);
    }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CLunarMissionsOrbitsDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CLunarMissionsOrbitsDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}

HBRUSH CLunarMissionsOrbitsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH  hbr = CDialogEx::OnCtlColor(pDC,pWnd,nCtlColor);

    if ((pWnd->GetDlgCtrlID()==IDC_STATIC1)||(pWnd->GetDlgCtrlID()==IDC_STATIC2))
    {
        //pDC->SetTextColor(RGB(255,0,0));
        pDC->SetTextColor(RGB(162,21,10));
        pDC->SetBkMode(TRANSPARENT);
    }
    //if (pWnd->GetDlgCtrlID()==IDC_MFCBUTTON1)
    //{
        //hbr = CreateSolidBrush(RGB(12,149,210));
        //pDC->SelectObject(hbr);
        //pDC->SetBkColor(RGB(12,149,210));
        //pDC->SetBkMode(TRANSPARENT);
    //}
    //if (pWnd->GetDlgCtrlID()==IDC_MFCBUTTON3)
    //{
        //
    //}
    return  hbr;
}

void CLunarMissionsOrbitsDlg::OnBnClickedMfcbutton1()
// если была нажата кнопка "Участок перелёта Земля - Луна"
{
    // TODO: добавьте свой код обработчика уведомлений
    //CFlightToMoonDlg  flightToMoonDlg(this);
    CFlightToMoonDlg  flightToMoonDlg(NULL);
    flightToMoonDlg.DoModal();
}


void CLunarMissionsOrbitsDlg::OnBnClickedMfcbutton2()
{
    // TODO: добавьте свой код обработчика уведомлений
    //m_IDC_MFCBUTTON1.ispaint = true;
    //m_IDC_MFCBUTTON1.RedrawWindow();
    //CFlightAroundMoonDlg  flightAroundMoonDlg(this);
    CFlightAroundMoonDlg  flightAroundMoonDlg(NULL);
    flightAroundMoonDlg.DoModal();
}

void  CLunarMissionsOrbitsDlg::RedrawMFCButton(int i)
{
    if (i==1)
    {
        m_IDC_MFCBUTTON1.ispaint = true;
        //m_IDC_MFCBUTTON1.RedrawWindow();
        //m_IDC_MFCBUTTON1.UpdateWindow();
        m_IDC_MFCBUTTON1.UpdateData();
    }
    if (i==2)
    {
        m_IDC_MFCBUTTON2.ispaint = true;
        //m_IDC_MFCBUTTON2.RedrawWindow();
        //m_IDC_MFCBUTTON2.UpdateWindow();
        m_IDC_MFCBUTTON2.UpdateData();
    }
}


void CLunarMissionsOrbitsDlg::OnBnClickedOk()
{
    // TODO: добавьте свой код обработчика уведомлений
    /* m_IDC_MFCBUTTON1.ispaint = true;
    m_IDC_MFCBUTTON1.UpdateData();
    m_IDC_MFCBUTTON2.ispaint = true;
    m_IDC_MFCBUTTON2.UpdateData(); */
    CDialogEx::OnOK();
}
И при запуске программы в файле LunarMissionOrbits.cpp на строке

Код:
INT_PTR nResponse = dlg.DoModal();
значение nResponse становится равным -1, после чего отладчик попадает на

Код:
else if (nResponse == -1)
    {
        TRACE(traceAppMsg, 0, "Предупреждение. Не удалось создать диалоговое окно, поэтому работа приложения неожиданно завершена.\n");
        TRACE(traceAppMsg, 0, "Предупреждение. При использовании элементов управления MFC для диалогового окна невозможно #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS.\n");
    }
и выскакивает сообщение

Цитата:
Необработанное исключение по адресу 0x53A0D62C (mfc110ud.dll) в LunarMissionOrbits.exe:
0xC0000005: нарушение прав доступа при чтении по адресу 0xFEFEFF66 .
Что это означает? Как исправить эту ошибку?
(Проект был перенесён с другого компьютера, на котором стоит Visual Studio 2010--там всё нормально работает, а на этой машине Visual Studio 2012--и вот такие проблемы).
erslgoeirjh вне форума Ответить с цитированием
Старый 05.06.2020, 14:12   #5
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 942
По умолчанию

erslgoeirjh,

Видимо, фреймворк не может создать диалог из ресурса. Скорее всего это из-за наличия на нём каких-то контролов с не инициализированными для работы классами (обычно для этого нужно вызвать один раз какую-нибудь Afx* функцию в начале InitInstance)

Как это проверить - сделай тестовую ветку проекта, в ней удали все контролы с диалога. Добейся удачной компиляции (нужно будет закомментировать все упоминания контролов-промоушенов (они перечислены у тебя в DoDataExchange ) )

после этого диалог должен начать создаваться (хотя, будет падать из-за отсутствия контролов с нужными IDC_* , но это уже к делу не относится)

далее нужно будет выяснить, какой именно контрол вредничает - откатить ветку, затем удалять по одному подозрительному контролу и пытаться запускать

------------------
прикрепи проект в zip, никто не будет копаться в этой рассыпухе.

Только удали
Release
Debug
*.ncb
*.aps
*.exe
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сериализация диалогового приложения ninja2 Visual C++ 1 22.08.2015 11:23
Проблема с запуском приложения -Jack- Общие вопросы Delphi 11 27.01.2014 11:03
Проблема с запуском приложения Oberok Qt и кроссплатформенное программирование С/С++ 2 04.03.2012 12:21
Проверка на существование БД перед запуском приложения Fantom БД в Delphi 7 08.09.2008 23:09