D_code_writer Ответов: 2

Проблема с CString с MFC на основе диалоговых окон, мигрирующих из VS 2008 32 бит против 64 бит 2017


Эй Ребята,

У меня есть интересный вопрос относительно переноса 32-битного проекта MFC на VS 2008 на 64-битный на VS 2017.

Проблема вращается вокруг следующего примера кода

CMyDialog *dlg;
CString myString;

dlg = new CMyDialog(NULL);
myString = _T("test");

dlg->m_dlg_string = myString;

if(dlg->DoModal() == IDOK)
{
     myString = dlg->m_dlg_string;
}

dlg->~CMyDialog()


Вот тут и есть заковыка. В 32-битном проекте MFC VS 2008 этот фрагмент кода является пуленепробиваемым. С 64-битным преобразованием в VS 2017 это бросает исключения повсюду.

Я понимаю, что это может быть вопрос о том, какой длины кусок веревки, но есть ли у кого-нибудь какие-нибудь идеи?

Я с нетерпением жду всех ответов и заранее благодарю вас.

P. S - Я использую VS 2017 15.9

Что я уже пробовал:

То, что я пытался сделать, чтобы решить эту проблему, заключается в следующем,
*Изменение порядка объявления CString. Это был прославленный пластырь
*Создание нового диалога в проекте VS 2017. Что меня потрясло, так это то, что он имел тот же результат, но то, что вызвало исключение, было назначением строки.

Richard MacCutchan

- разбрасывая повсюду исключения."
Извините, но мы не можем догадаться, что это значит. Какие исключения вы видите и какая строка кода их выбрасывает?

Richard MacCutchan

Почему вы делаете явный вызов деструктора, вместо того чтобы использовать delete оператор?

2 Ответов

Рейтинг:
2

Michael Haephrati

Я взял на себя смелость создать проект на основе диалогового окна MFC по умолчанию. Я использую Visual Studio 2017 Enterprise. Затем я вставил ваш код.
Вот как должен выглядеть ваш код (и, конечно же, вы не должны вызывать деструктор, а также ничего общего с x86 Vs. x64).

CString myString;

dlg = new CMyDialog(NULL);
myString = _T("test");

dlg.m_slg_string = myString;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
    myString = dlg->m_dlg_string;
    // 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, "Warning: dialog creation failed, so application is terminating unexpectedly.\n");
    TRACE(traceAppMsg, 0, "Warning: if you are using MFC controls on the dialog, you cannot #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS.\n");
}


Rick York

Зачем создавать диалоговое окно приложения в куче? Это означает, что это указатель, и вы должны использовать -> для доступа к нему везде, чего вы не делали в своем решении.

Это может быть простая, старая переменная стека так же легко, если не больше.

D_code_writer

Эй Ребята,

Большое спасибо за все это.

Исключение, которое он бросает, - это ntdll.dll dll.

Однако я попробую как этот пример, так и удалить код.

Большое спасибо

Michael Haephrati

В основном я использовал исходный код проекта на основе диалогового окна Microsoft по умолчанию, и именно так выглядит исходный код при создании нового проекта на основе диалогового окна MFC.

Рейтинг:
2

D_code_writer

Эй Ребята,

Я придумал обходной путь, который сработал.

Там, где он упал, было назначение в переменных. Получить их из диалога было прекрасно. Вот фрагмент кода,

CMyDialog dlg;
CString MyString;

MyString = _T("test");

dlg.SetState_m_dlg_string(MyString) // Write a void function internally that writes the variable

if(dlg.DoModal() == IDOK)
{
     MyString = dlg.m_dlg_string;
}


Довольно странно, я знаю, но победа есть победа, и я ее приму. Еще раз спасибо всем за помощь.