Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> winapi CreateProcess ID, Нужно узнать ID приложения родителя 
V
    Опции темы
Veve
Дата 17.10.2009, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 1.1.2005
Где: Латвия, Рига

Репутация: нет
Всего: 13



Привет.
подскажите, пожалуйста, как узнать уникальный идентификатор приложения?

В приложение я создаю процесс, которые запускает другое приложение. Как узнать уникальный идентификатор приложения родителя в приложение потомке?

PM MAIL ICQ Skype MSN   Вверх
586
Дата 17.10.2009, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



PM   Вверх
Veve
Дата 17.10.2009, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 1.1.2005
Где: Латвия, Рига

Репутация: нет
Всего: 13



Спасибо большое! 
PM MAIL ICQ Skype MSN   Вверх
Veve
Дата 17.10.2009, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 1.1.2005
Где: Латвия, Рига

Репутация: нет
Всего: 13



В продолжение вопроса:
Код

pid =  procentry.th32ParentProcessID;

Когда запускаю из родительского приложения, всё отлично! PID совпадают. Но почему pid, есть даже тогда когда приложение запускается само по себе? Как это отследить? 

PM MAIL ICQ Skype MSN   Вверх
586
Дата 17.10.2009, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Цитата(Veve @  17.10.2009,  12:15 Найти цитируемый пост)
Но почему pid, есть даже тогда когда приложение запускается само по себе? 

Если оно запущено из explorer'а, то там будет PID explorer'а.

Цитата(Veve @  17.10.2009,  12:15 Найти цитируемый пост)
Как это отследить? 

Вызвать GetModuleFileNameEx(hParentProcess, NULL, ...), и определить, кто создал процесс.

Это сообщение отредактировал(а) 586 - 17.10.2009, 11:34
PM   Вверх
EvilsInterrupt
Дата 17.10.2009, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



Цитата

В приложение я создаю процесс, которые запускает другое приложение. Как узнать уникальный идентификатор приложения родителя в приложение потомке?


Любой объект ядра полученный через GetCurrentProcess, CreateProcess(???) это Процессо-зависимый ИД!!! Его привести к уникальному можно через юзание DublicateHandle, более того по-моему даже Рихтер сторонник этой ф-ции ;)
PM MAIL WWW ICQ Jabber   Вверх
Veve
Дата 17.10.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 1.1.2005
Где: Латвия, Рига

Репутация: нет
Всего: 13



Извините за тугодумство, но и за чего могут быть такие ошибки? 

Error    1    error LNK2001: unresolved external symbol _GetModuleBaseNameA@16    
Error    2    error LNK2001: unresolved external symbol _EnumProcessModules@16    
Error    3    fatal error LNK1120: 2 unresolved externals    


Код

pid =  procentry.th32ParentProcessID;
                
TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
BOOL bRC = FALSE;
                    
// Get a handle to the process.
HANDLE hProcessParent = OpenProcess( PROCESS_QUERY_INFORMATION |
                                   PROCESS_VM_READ,
                                   FALSE, pid );
                 
// Get the process name.
             
if (NULL != hProcessParent )
{
        HMODULE hMod;
    DWORD cbNeeded;
                 
    if ( EnumProcessModules( hProcessParent, &hMod, sizeof(hMod), &cbNeeded) )
    {
        GetModuleBaseName( hProcessParent, hMod, szProcessName,   sizeof(szProcessName)/sizeof(TCHAR) );
    }
                        
}

// Print the process name and identifier.

_tprintf( TEXT("%s  (PID: %u)\n"), szProcessName, pid );

CloseHandle( hProcessParent );



PM MAIL ICQ Skype MSN   Вверх
586
Дата 17.10.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Цитата(EvilsInterrupt @  17.10.2009,  13:06 Найти цитируемый пост)
Любой объект ядра полученный через GetCurrentProcess, CreateProcess(???) это Процессо-зависимый ИД!!!

не путай с хендлами (HANDLE). PID - это глобальный идентификатор.

Цитата(Veve @  17.10.2009,  13:08 Найти цитируемый пост)
Error    1    error LNK2001: unresolved external symbol _GetModuleBaseNameA@16    
Error    2    error LNK2001: unresolved external symbol _EnumProcessModules@16    

Код
#pragma comment (lib, "psapi.lib")

PM   Вверх
EvilsInterrupt
Дата 17.10.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



586, не проснулся еще ))

Вобщем, по-моему наиболее простое решение это:
1) сделать снапшот
2) получить ИД процесса родителя у которого ищут
3) В PROCESSENTRY32 Structure есть   DWORD     th32ParentProcessID;

Добавлено через 8 минут и 53 секунды
статья на rsdn.ru

Это сообщение отредактировал(а) EvilsInterrupt - 17.10.2009, 12:25
PM MAIL WWW ICQ Jabber   Вверх
Veve
Дата 17.10.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 1.1.2005
Где: Латвия, Рига

Репутация: нет
Всего: 13



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

 EnumProcessModules( hProcessParent, &hMod, sizeof(hMod), 
                             &cbNeeded)

= false, ну и соответственно имя <unknown>

 smile 
PM MAIL ICQ Skype MSN   Вверх
586
Дата 17.10.2009, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Цитата(Veve @  17.10.2009,  13:36 Найти цитируемый пост)
теперь всё нормально определяет имя, но если я запускаю из своей родительской программы, 
Код
 EnumProcessModules( hProcessParent, &hMod, sizeof(hMod), 
                             &cbNeeded)


= false, ну и соответственно имя <unknown>

GetLastError в помощь
PM   Вверх
Veve
Дата 17.10.2009, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 1.1.2005
Где: Латвия, Рига

Репутация: нет
Всего: 13



GetLastError() возвращает 0.
        
PM MAIL ICQ Skype MSN   Вверх
Veve
Дата 17.10.2009, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 1.1.2005
Где: Латвия, Рига

Репутация: нет
Всего: 13



А нет я ступил. =87

Код

HANDLE hProcessParent = OpenProcess( PROCESS_QUERY_INFORMATION |
                                                   PROCESS_VM_READ,
                                                   FALSE, pid );


Не может Handle создать!

Какие параметры нужно туда передать? Если нужно чтобы обе программы работали одновременно? 

Это сообщение отредактировал(а) Veve - 17.10.2009, 14:17
PM MAIL ICQ Skype MSN   Вверх
586
Дата 17.10.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Цитата(Veve @  17.10.2009,  15:09 Найти цитируемый пост)
А нет я ступил. =87

Этот код означает: "Параметр задан неверно."

Цитата(Veve @  17.10.2009,  15:09 Найти цитируемый пост)
Не может Handle создать!

Если проблема в OpenProcess, то попробуй вместо тех флагов указать флаг PROCESS_ALL_ACCESS. И ещё: проверь с помощью диспетчера задач, может PID не тот.
PM   Вверх
Veve
Дата 17.10.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 1.1.2005
Где: Латвия, Рига

Репутация: нет
Всего: 13



Спасибо!

Дело в том, что я запускал родительскую программу из VisualStudio: ctrl+f5 окно оставалось, ну а процесс заканчивался. Соответственно с таким PID больше процесса не оставалось! 

Это сообщение отредактировал(а) Veve - 17.10.2009, 15:38
PM MAIL ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0932 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.