GKSHR Ответов: 1

Не могу открыть cfiledialog


Я получаю сообщение "необработанное исключение брошено: нарушение доступа на чтение. это был nullptr "в функции GetDlgItem в исходном файле“. winocc.cpp" из библиотеки МФЦ

CWnd* CWnd::GetDlgItem(int nID) const
{
	ASSERT(::IsWindow(m_hWnd));

	if (m_pCtrlCont == NULL)
		return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID));
	else
		return m_pCtrlCont->GetDlgItem(nID);
}



Эта функция вызывается из :
_AfxActivationWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
	WNDPROC oldWndProc = (WNDPROC)::GetProp(hWnd, _afxOldWndProc);
	ASSERT(oldWndProc != NULL);	

	LRESULT lResult = 0;
	TRY
	{
		BOOL bCallDefault = TRUE;
		switch (nMsg)
		{
		case WM_INITDIALOG:
			{
				DWORD dwStyle;
				CRect rectOld;
				CWnd* pWnd = CWnd::FromHandle(hWnd);
				_AfxPreInitDialog(pWnd, &rectOld, &dwStyle);
				bCallDefault = FALSE;
				lResult = CallWindowProc(oldWndProc, hWnd, nMsg, wParam, lParam);
				_AfxPostInitDialog(pWnd, rectOld, dwStyle);
			}
			break;


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

Я не могу смотреть на ценность m_pCtrlCont и значение "это" равно нулю

Richard MacCutchan

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

Richard MacCutchan

Мой предыдущий комментарий все еще применим. Ошибка находится в вашем коде, она поймана в библиотечных функциях. Единственный способ узнать, что происходит, - это использовать отладчик и отследить свой код.

1 Ответов

Рейтинг:
2

KarstenK

Если значение этот это NULL случается, когда вы сделали что-то очень плохое.

M_pCtrlCont используется для некоторого расширенного использования CFileDialog для улучшения диалога с помощью дополнительных окон.

Я предполагаю, что вы не создали экземпляр объекта CFileDialog, но использовали указатель, который является нулевым. Начните отладку с того места, где вы создаете диалоговое окно.

Взгляните на Документация Microsoft с примером.


GKSHR

Во-первых, спасибо за ваш ответ, я не думаю, что указатель действительно равен нулю, потому что когда я использую другую функцию для того же экземпляра (функция DWORD CWnd:: GetStyle() ) Я вижу, что указатель инициализирован.
Этот код преобразуется из Visual C++ 6.0 в Visual Studio 2015, знаете ли вы о разнице в классе CFileDialog ?