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];