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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2010, 17:28   #1
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию Как из 32бит проги узнать имя 64бит процесса по дескриптору окна?

Код:
if (wnd)
	{
		DWORD processId;
		GetWindowThreadProcessId(wnd, &processId);

		HANDLE process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processId);
		if (process)
		{
			HMODULE mod;
			DWORD needed;

			if (EnumProcessModules(process, &mod, sizeof(mod), &needed))
			{
				wchar_t processName[MAX_PATH];
				GetModuleBaseNameW(process, mod, processName, sizeof(processName)/sizeof(wchar_t));

				CloseHandle(process);
				return std::wstring(processName);
			}
			else
			{
				DWORD errorCode = GetLastError();
			}
		}

		CloseHandle(process);
	}
Для 32бит процессов все хорошо. Но для 64бит функция EnumProcessModules не работает
Цитата:
msdn:If this function is called from a 32-bit application running on WOW64, it can only enumerate the modules of a 32-bit process. If the process is a 64-bit process, this function fails and the last error code is ERROR_PARTIAL_COPY (299).
Существует функция EnumProcessModulesEx по ее последнему параметру dwFilterFlag, который может быть установлен в LIST_MODULES_32BIT, LIST_MODULES_64BIT, LIST_MODULES_ALL, LIST_MODULES_DEFAULT сделал вывод, что "наверное прокатит". Но получил fail. Из ее описания
Цитата:
msdn: This function is intended primarily for 64-bit applications. If the function is called by a 32-bit application running under WOW64, the dwFilterFlag option is ignored and the function provides the same results as the EnumProcessModules function.
Как из 32 разрядного приложения, имея дескриптор окна, узнать какому 64 разрядному процессу данное окно принадлежит?

Последний раз редактировалось Diego__; 07.12.2010 в 17:31.
Diego__ вне форума Ответить с цитированием
Старый 07.12.2010, 18:19   #2
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Казалось, без форума не обойтись, но... вот решение, не подвязанное на разрядность (при процессе WINWORD.EXE)
Код:
void IsWordWindow(HWND wnd)
{
	if (wnd)
	{
		std::wstring processName;
		DWORD id = 0;

		WTS_PROCESS_INFO *ppinfo;
		DWORD count;

		WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0, 1, &ppinfo, &count);
		for(DWORD i = 0; i < count; i++)
		{
			processName = ppinfo[i].pProcessName;
			id = ppinfo[i].ProcessId;
			if (processName == L"WINWORD.EXE")
				break;
		}
		WTSFreeMemory(ppinfo);

		if (!processName.empty())
		{
			DWORD processId;
			GetWindowThreadProcessId(wnd, &processId);

			if (processId == id)
			{
				std::wcout<< L"sucess!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<< std::endl;
			}
		}

		std::wcout<< L"fail"<< std::endl;
	}

	std::wcout<< L"end";
	int n;
	std::cin>>n; 
}
Diego__ вне форума Ответить с цитированием
Старый 07.12.2010, 20:38   #3
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

http://msdn.microsoft.com/en-us/libr...84(VS.85).aspx
http://msdn.microsoft.com/en-us/libr...37(VS.85).aspx
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать имя юзера Betty Общие вопросы Delphi 4 07.01.2010 10:50
Как узнать имя button BuT@JL Общие вопросы Delphi 7 19.08.2009 10:42
Как узнать имя кнопки? LeGAl Microsoft Office Excel 1 10.03.2009 00:04
Нужно получить все компоненты чужого окна по дескриптору 3lander Win Api 12 28.11.2007 20:41
Как узнать имя файла??? Shurik Hacker Работа с сетью в Delphi 3 20.11.2007 17:06