M@gelearn Ответов: 2

Почему мое дочернее создание окна терпит неудачу?


У меня есть созданный MDI, и он работает до тех пор, пока я не нажму на меню новый файл и не получу это сообщение об ошибке, которое я написал в окне сообщения.. что создание нового дочернего MDI не удалось это та часть, где компилятор говорит Local mcs. szClass "не может получить доступ к памяти по адресу 0xcdbaabcd"

HWND CreateNewMDIChild(HWND hMDIClient)
{
    MDICREATESTRUCT mcs;
    HWND hChild;

    mcs.szTitle     = "Act 1";
    mcs.szClass     = ChildClass;
    mcs.hOwner      = GetModuleHandle(NULL);
    mcs.x = mcs.cx  = CW_USEDEFAULT;
    mcs.y = mcs.cy  = CW_USEDEFAULT;
    mcs.style       = MDIS_ALLCHILDSTYLES;

    hChild = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, (LONG)&mcs);
    if(!hChild)
    {
        MessageBox(hMDIClient, "Act 1 MDI child creation failed !", "Error", MB_ICONERROR | MB_OK);
    }
    return hChild;
}



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

Я ничего не пробовал, потому что компилятор не дает мне никаких ошибок ..
и если весь код нужен, я могу загрузить его прямо сейчас...

Ну я действительно спросил кого то и сказал мне что это будет проблемой:
hChild = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, (LONG)&mcs);


Это значит, что я сделал плохой бросок...?!
Как это будет выглядеть?

hChild = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, reinterpret_cast<LPARAM>(&mcs));

Richard MacCutchan

"компилятор говорит, что Local mcs. szClass "не может получить доступ к памяти по адресу 0xcdbaabcd""
Это не сообщение компилятора, а исключение среды выполнения. Где именно это происходит и что такое "детский класс"?

2 Ответов

Рейтинг:
4

M@gelearn

но эй.. тот, кого я упомянул, решил мою проблему.
Я просто даю ему код дыры.. ну, в плохих словах я не зарегистрировал дочернее окно MDI в WM_CREATE.. и ofc. окно не может появиться.. но проблема была в том, что компилятор не дал мне никаких ошибок .. это была настоящая проблема, так что.. я просто забыл поставить это ..

// registering MDI after client window is made here!
       SetUpMDIChildWindowClass(GetModuleHandleA(NULL)


здесь

<pre>case WM_CREATE:
	{
		/// Create MDI client ///////////////////////////////////

		////////// Find window menu where children will be listed
		CLIENTCREATESTRUCT ccs;

		ccs.hWindowMenu = GetSubMenu(GetMenu(hwnd), 2);
		ccs.idFirstChild = ID_MDI_FIRSTCHILD;

		hMDIClientWindow = CreateWindowEx(WS_EX_CLIENTEDGE, "mdiclient", NULL,
			WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL,
			CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
			hwnd, (HMENU)IDC_MAIN_MDI, GetModuleHandle(NULL), (LPVOID)&ccs);

		if (hMDIClientWindow == NULL)
		{
			MessageBox(hwnd, "Could not create MDI client !", "Error", MB_ICONERROR | MB_OK);
		}

		// Create Status bar
		HWND hStatus;
		int statwidths[] = { 140, 300, -1 };

		hStatus = CreateWindowEx(0, STATUSCLASSNAME, NULL,
			WS_VISIBLE | WS_CHILD | SBARS_SIZEGRIP,
			0, 0, 0, 0, hwnd, (HMENU)IDC_MAIN_STATUS, GetModuleHandle(NULL), NULL);

		SendMessage(hStatus, SB_SETPARTS, sizeof(statwidths) / sizeof(int), (LPARAM)statwidths);

		SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)" Author:      Me");
		SendMessage(hStatus, SB_SETTEXT, 1, (LPARAM)"                 - MDI2 - ");
		SendMessage(hStatus, SB_SETTEXT, 2, (LPARAM)"                  May 2020");


                // registering MDI after client window is made here!
		SetUpMDIChildWindowClass(GetModuleHandleA(NULL));

	}


Однако спасибо всем ... овации


Richard MacCutchan

Конечно, компилятор не выдал вам ошибку. Компилятор может только анализировать и преобразовывать исходный код, который вы предоставляете, он не может угадать, делаете ли вы вещи в правильном порядке, или вы пропустили шаг.

M@gelearn

да..

Richard MacCutchan

Вместо того чтобы публиковать общее сообщение об ошибке, которое ничего вам не говорит, Вы должны использовать GetLastError чтобы найти причину, почему это не удалось.

Рейтинг:
0

KarstenK

Этот кто - то прав, что LONG усекает значение, и поэтому достаточно простого приведения к LPARAM.

Так что это должно сработать, когда ваш hMDIClient является хорошим гражданином.


M@gelearn

Ну, я действительно изменил это, и это ничего не меняет.. дочернее окно отказываются создавать.. :(

Richard MacCutchan

LONG и LPARAM оба имеют одинаковый размер. Ой - только в 32 битах.

M@gelearn

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

hChild = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, (LPARAM)&MCS);