AfxMessageBox - нарушение доступа

Вот что происходит. Когда я пытаюсь запустить AfxMessageBox из моего класса расширения CDialog, я получаю ошибку (см. Ниже). Я погуглил в интернете, но не смог. Это единственное место, где происходит сбой окна сообщений, и я знаю, что остальная часть кода работает (я прошел через это).

Кто-нибудь знает, как это исправить?

Заранее спасибо!

Сообщение об ошибке при открытии AFXMESSAGEBOX:

Необработанное исключение в 0x014b4b70 в IsoPro.exe: 0xC0000005: Место чтения нарушения доступа 0x34333345.

Код для запуска AfxMessageBox, изнутри CDialog

LPTSTR temp;
mainPassword.GetWindowText((LPTSTR)temp,100);
CString cstr;
cstr.Format("mainPassword = %s",temp);
AfxMessageBox(cstr);

Код для отображения CDialog:

CEnterpriseManagementDialog* emd = new CEnterpriseManagementDialog();
emd->Create(IDD_ENTERPRISE_MANAGEMENT_DIALOG);
emd->ShowWindow(SW_SHOW);

2 ответа

Решение

Проблема в том, как вы используете GetWindowText:

LPTSTR temp;
mainPassword.GetWindowText((LPTSTR)temp,100);

Вы позволяете GetWindowText попытка записи в какую-то нераспределенную память с передачей неинициализированной temp указатель. Если вы действительно хотите использовать необработанный буфер вывода, вы должны выделить для него место перед передачей указателя на GetWindowTextНапример:

TCHAR temp[100];
mainPassword.GetWindowText(temp, _countof(temp));
// NOTE: No need to LPTSTR-cast

Но, поскольку вы используете C++, вы можете просто использовать строковый класс, такой как CStringвместо необработанных буферов, например:

CString password;
mainPassword.GetWindowText(password);

CString msg;
msg.Format(_T("mainPassword = %s"), password.GetString());
// or you can just concatenate CStrings using operator+ ... 
AfxMessageBox(msg);

Похоже, переменная temp является неинициализированным указателем ( определение LPTSTR - это char *).

Попробуйте вместо этого определить temp как массив:

TCHAR temp[64];
Другие вопросы по тегам