Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2012, 11:39   #1
maxgold
Новичок
Джуниор
 
Регистрация: 24.02.2012
Сообщений: 4
По умолчанию Создание окна во внедряемой dll

Во внедренной длл хочу создать окно. Создаю, оно всплывает, но когда DllMain() завершается окно уничтожается. Как сделать чтобы не уничтожалось?
Функция создает окно:
Код:
HWND __stdcall CreateMessageWindow(HANDLE hModule, WNDCLASSEX wnd)
{
	wnd.cbSize = sizeof(wnd);
	wnd.cbClsExtra = 0;
	wnd.cbWndExtra = 0;
	wnd.hbrBackground=CreateSolidBrush(RGB(135,163,187));
	wnd.hCursor=LoadCursor(0,IDC_ARROW); // Определяем курсор мыши
	wnd.hIcon=NULL; // Иконка
	wnd.hIconSm=NULL; // Маленькая иконка
	wnd.hInstance=(HINSTANCE)wndHandle/*hModule*/; // Хэндл экземпляра приложения
	wnd.lpfnWndProc=WndProc; // Имя оконной процедуры
	wnd.lpszClassName=szClassName; // Имя оконного класса
	wnd.lpszMenuName=NULL; // Имя меню
	wnd.style=CS_GLOBALCLASS | CS_HREDRAW | CS_VREDRAW; // Стиль
	if(!RegisterClassEx(&wnd))
	{
		LPVOID lpMsgBuf;
		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, 
GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf,	0, NULL);
		MessageBox( NULL, (LPCSTR)lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );
		MessageBox(NULL, "Ошибка", TEXT("RegisterClassEx ошибка"), MB_OK);
	}
	hwndInfoWnd = CreateWindowEx(WS_EX_RIGHTSCROLLBAR, "PokerClientInfo", "Данные из покер-клиента",
 WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, wndHandle, 
NULL, (HINSTANCE)wndHandle/*hModule*/, NULL);
	if(!hwndInfoWnd)
	{
		LPVOID lpMsgBuf;
		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, 
GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf,	0, NULL);
		MessageBox( NULL, (LPCSTR)lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );
		MessageBox(NULL, "CreateWindowEx ошибка", TEXT("Ошибка"), MB_OK);
	}
	ShowWindow(hwndInfoWnd, SW_SHOW);
	UpdateWindow(hwndInfoWnd);
	return hwndInfoWnd;
}
В DLL_PROCESS_ATTACH вызывю функцию создающую окно:
Код:
case DLL_PROCESS_ATTACH:
		{
			hwndInfoWnd = CreateMessageWindow(hModule, wnd);
		}

Последний раз редактировалось rpy3uH; 24.02.2012 в 11:50.
maxgold вне форума Ответить с цитированием
Старый 24.02.2012, 14:21   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Сообщение от maxgold Посмотреть сообщение
Создаю, оно всплывает, но когда DllMain() завершается окно уничтожается.
Ну наверно это потому, что ваша длл выгружается из памяти.
counter вне форума Ответить с цитированием
Старый 24.02.2012, 14:52   #3
maxgold
Новичок
Джуниор
 
Регистрация: 24.02.2012
Сообщений: 4
По умолчанию

С длл все в порядке, как сидела так и сидит в процессе.
maxgold вне форума Ответить с цитированием
Старый 24.02.2012, 15:01   #4
maxgold
Новичок
Джуниор
 
Регистрация: 24.02.2012
Сообщений: 4
По умолчанию

Кстати не подскажете функцию winapi которая транслирует msg в соответствующий числу текст ("WM_CLOSE" например и т.п.).?

P.S. Обработчик тоже присутствует:
Код:
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	return DefWindowProc(hWnd,msg,wParam,lParam);
}
Я, если честно, не проверял окно убивается или просто скрытым становится. Вроде как скрываться ему не от чего...
maxgold вне форума Ответить с цитированием
Старый 24.02.2012, 16:15   #5
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
С длл все в порядке, как сидела так и сидит в процессе.
Вы все-таки проверьте в DLL_PROCESS_DETACH

И еще, что такое wndHandle?
Если это хендл родительского(хозяйского) окна, то что переменная делает в
wnd.hInstance=(HINSTANCE)wndHandle,
если это все же хендл модуля то ему не место в девятом параметре CreateWindowEx
Может у Вас еще есть похожие чудеса в непредставленной WndProc.

Добавлю.
Видимо завершается поток ответственный за внедрение в процесс, с ним уничтожается и окно.
Попробуйте после ShowWindow
Код:
	MSG msg;
	while (GetMessage(&msg,0,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

Последний раз редактировалось EUGY; 24.02.2012 в 16:42.
EUGY вне форума Ответить с цитированием
Старый 24.02.2012, 16:41   #6
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Предполагается, наверное, что сообщения каким то мистическим образом сами из очереди попадут в WndProc без цикла приема сообщений, не так ли?
GetMessage/TranslateMessage/DispatchMessage/etc
Окно не уничтожается. Оно создано, но, собственно, очередь сообщений никто не обрабатывает.
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 24.02.2012, 17:08   #7
Rock-n-Rolla
Форумчанин
 
Регистрация: 11.01.2012
Сообщений: 177
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Попробуйте после ShowWindow
Код:
	MSG msg;
	while (GetMessage(&msg,0,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
так не проканает, так как программа зависнет при загрузке DLL. цикл нужно в другом месте, например, в отдельном потоке.
progromore.i2p - первый русскоязычный портал программистов в скрытосети
Rock-n-Rolla вне форума Ответить с цитированием
Старый 24.02.2012, 17:18   #8
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Ну, в отдельный поток надо выносить не цикл, а саму CreateMessageWindow
EUGY вне форума Ответить с цитированием
Старый 24.02.2012, 17:36   #9
Rock-n-Rolla
Форумчанин
 
Регистрация: 11.01.2012
Сообщений: 177
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Ну, в отдельный поток надо выносить не цикл, а саму CreateMessageWindow
ну да, так будет намного более логичнее
progromore.i2p - первый русскоязычный портал программистов в скрытосети
Rock-n-Rolla вне форума Ответить с цитированием
Старый 24.02.2012, 18:50   #10
maxgold
Новичок
Джуниор
 
Регистрация: 24.02.2012
Сообщений: 4
По умолчанию

Все заработало. Спасибо большое всем откликнувшимся
maxgold вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание окна CreateWindowEx _PROGRAMM_ Win Api 10 21.02.2012 14:16
Создание дочернего окна ARt44 Win Api 6 01.10.2011 00:50
Создание второго окна zotox Win Api 0 30.12.2010 17:09
Создание окна в DLL Iron Lappu Visual C++ 1 25.12.2010 00:50
Создание окна Stas96 Win Api 1 29.10.2010 21:58