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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2010, 12:24   #1
_Lamer
Новичок
Джуниор
 
Аватар для _Lamer
 
Регистрация: 03.08.2010
Сообщений: 2
По умолчанию

Доброго времени суток. Пишу на С++ (MS Visual Studio 2008). Коротко о самой задаче, затем о проблеме.
***Задача***:
пишется EXE-ник, который запускает проги на новом рабочем столе, это не терминал, а просто новый рабочий стол на той же станции (HWINSTA). Так же нужно переключение между рабочими столами.
***Реализация***:
написан EXE-ник (RunApp.exe), который запускает проги на новом рабочем столе.
написан EXE-ник (DesktopInit.exe), который подгружает HOOK.DLL и устанавливает ловушку на клавиатуру.
написана DLL (HOOK.DLL), в которой реализована процедура "LRESULT CALLBACK KeyboardProc(...".
запуск в следующем порядке:
Сначала RunApp.exe подгружает HOOK.DLL и устанавливает ловушку на клавиатуру на основном Desktope,
Затем RunApp.exe запускает на новом DESKTOP-e процесс DesktopInit.exe, который подгружает HOOK.DLL и устанавливает ловушку на клавиатуру на новом DESKTOPe.
Затем RunApp.exe запускает на новом DESKTOPe любые приложения (согласно пареметрам коммандной строки RunApp.exe).
Подгружать HOKK.DLL на обоих DESKTOP-ах нужно потому что все процессы при запуске привязаны к одному рабочему столу параметром lpDesktop структуры STARTUPINFO и ловушки срабатывают так же с привязкой к DESKTOP-у.

***ПРОБЛЕМА***
на новом DESKTOPе можно запустить процесс (например notepad.exe) от имени другого пользователя, и при нажатии на клавиатуру все работатет. Нажмем условную комбинацию клавиш и переключемся на основной DESKTOP, А ТУТ ЗАСАДА, если запустить процес от имени другого юзера (на важно Admin или нет) то процес работает пока не нажмешь клавишу на кавиатуре(фокус клавиатуры на этом процессе). как тока нажал — ПРОЦЕСС ВИСНЕТ и все. А процессы запущенные от того же юзера — работают без нариканий, и по той же комбинации можно опять переключится на новый DESKTOP.
Если RunApp.exe не запускает ни один процесс на новом Desktope, или запускает процессы на основном рабочем столе, и подгружает HOOK.DLL и устанавливает ловушку на клавиатуру, то на основном (единственном) рабочем столе ничего не виснет, под любым юзером, все красиво отрабатывается.

***ВОПРОС***:
почему виснет и как избежать зависания !!!
помогите разобраться, плиз.

Запуск на новом раб. столе:
код RunApp.exe:
Код:
hWinstaSave = GetProcessWindowStation();
if ( !hWinstaSave ) 
	return bResult;

hWinsta = OpenWindowStation(WinSta, false, READ_CONTROL | WRITE_DAC);
if ( !hWinsta ) 
	return bResult;

if (!SetProcessWindowStation(hWinsta))
	return bResult;

hDesk = OpenDesktop(Desktop, 0, false, dwAccessFlags);
if (hDesk == 0) 
{
	hDesk = CreateDesktop(Desktop, NULL, NULL, DF_ALLOWOTHERACCOUNTHOOK, dwAccessFlags, NULL);
	if (hDesk == 0) return bResult;
}

if (!SetProcessWindowStation(hWinstaSave))
	return bResult;

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);

TCHAR  m_strTmp[1024];
_sntprintf_s(m_strTmp, 1023, _tcslen(WinSta) + _tcslen(Desktop) + 1, _T("%s\\%s"), WinSta, Desktop);
si.lpDesktop = m_strTmp;

ZeroMemory(&pi, sizeof(pi));
pi.hThread = pi.hProcess = INVALID_HANDLE_VALUE;

bResult = CreateProcess(NULL, lpCommandLine, lpp, lpt, bi, NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE,
						Env, CurDir, &si, &pi);
.....
в DLL:
Код:
HINSTANCE gl_hInst;
BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved) {
	switch (ul_reason_for_call)
	{
	case DLL_THREAD_ATTACH:
		break;
	case DLL_THREAD_DETACH:
		break;
	case DLL_PROCESS_DETACH:
		break;
	case DLL_PROCESS_ATTACH:
		gl_hInst=(HINSTANCE)hModule;
    return TRUE;
}
Установка ловушки
hKeyHook = SetWindowsHookEx(WH_KEYBOARD, &KeyboardProc, gl_hInst, 0);
Виснет даже при такой реализации
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK KeyboardProc (int code, WPARAM wParam, LPARAM lParam) {
return CallNextHookEx(hKeyHook, code, wParam, lParam);
}

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

Последний раз редактировалось Stilet; 22.11.2010 в 10:09.
_Lamer вне форума Ответить с цитированием
Старый 21.11.2010, 17:24   #2
|{ot
Форумчанин
 
Аватар для |{ot
 
Регистрация: 09.03.2008
Сообщений: 127
По умолчанию

Пробуй отладить процесс, который подвисает, установи свой отладчит системы по-умолчанию и посмотри в каком именно месте подвис процесс, посмотри стек вызовов, и там думаю все поймешь и сам...
|{ot вне форума Ответить с цитированием
Старый 22.11.2010, 10:01   #3
_Lamer
Новичок
Джуниор
 
Аватар для _Lamer
 
Регистрация: 03.08.2010
Сообщений: 2
По умолчанию

Засада гдето в RunApp
Если RunApp.exe не запускает ни один процесс на новом Desktope, или запускает процессы на основном рабочем столе, и подгружает HOOK.DLL и устанавливает ловушку на клавиатуру, то на основном (единственном) рабочем столе ничего не виснет, под любым юзером, все красиво отрабатывается.

я создал еще один тестовый прект по умолчанию Win32 (создает окно, процедуру обраб. сообщ. окна ...)
запустил его из под VS под друзим юзером, нажал на клаву и процесс повис, я в отладчик жму на паузу
а мне сообщение: "Процесс, по-видимому заблокирован (или не в состоянии выполнять код пользовательского режима). Все потоки остановлены."
остановился на строке
Код:
while (GetMessage(&msg, NULL, 0, 0))
и в какойто системной DLL бесконечный цикл.
_Lamer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск программы от имени другого пользователя... EraM Общие вопросы Delphi 3 12.05.2011 11:07
Определение имени пользователя из сервиса Garacio_cain Общие вопросы Delphi 2 10.12.2009 17:17
Событие при нажатии на клавиатуру BuT@JL Общие вопросы Delphi 8 26.06.2009 11:27
Прочесс без имени пользователя delphin100 Общие вопросы Delphi 0 29.10.2008 06:45
Получение прав другого пользователя Квэнди Win Api 14 28.07.2008 14:49