Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение полного пути к файлу 
V
    Опции темы
Noman
Дата 8.6.2007, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 21.4.2007
Где: /mnt/Nowhere

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



 Доброго вечера.

Подскажите, как узнать полный путь к программе, если известны - дескриптор окна, название процесса и Pid процесса приложения.
 Я искал на форуме и в гугле, нашел несколько вариантов - GetModuleFileName() и ExtractFilePath().
Последний похоже находит только путь к самой программе, а вот с первым попробовал:
Код

void __fastcall TMain::Button1Click(TObject *Sender)
{
      char buff[0xFF];
      AnsiString ExeName; //имя ехе
      DWORD Pid = 0; // PID процесса
      ExeName = cpe;
      Pid = GetProcessByExeName(ExeName); // этой функцией получаю PID процесса по его имени exe
      HWND hWnd = GetMainWindowByPID(Pid);
      GetModuleFileName(GetModuleHandle("hWnd"), buff, sizeof (buff)+1);
      ShowMessage(buff);
}

А hWnd определял с помощью такой конструкции (еще раз спасибо dumb):
Код

HWND GetMainWindowByPID(DWORD PID)
{
  DWORD pID;
  HWND hWnd = FindWindow(0, 0);
  while (hWnd)
  {
    if (!GetParent(hWnd))
    {
      GetWindowThreadProcessId(hWnd, &pID);
      if (pID == PID) return hWnd;
    }
    hWnd = GetWindow(hWnd, GW_HWNDNEXT);
  }
return 0;
}

Но, конструкция GetModuleHandle("hWnd") равно, как и при использовании NULL выдает путь к самой программе.
 Подскажите, как можно эту проблему решить...
PM MAIL WWW ICQ   Вверх
Tectoder
Дата 8.6.2007, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 202
Регистрация: 13.3.2007

Репутация: 7
Всего: 8



Например, Module32First или что нибудь типа этого
GetModuleHandle("hWnd")  это +

Это сообщение отредактировал(а) Tectoder - 8.6.2007, 23:07
PM   Вверх
586
Дата 9.6.2007, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Noman @  8.6.2007,  23:50 Найти цитируемый пост)
Подскажите, как узнать полный путь к программе, если известны - дескриптор окна, название процесса и Pid процесса приложения

DWORD WINAPI GetModuleFileNameEx(
  HANDLE hProcess,         // =OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID );
  HMODULE hModule,       // =NULL;
  LPTSTR lpFilename,
  DWORD nSize
);

это?
PM   Вверх
EnergoHokum
Дата 9.6.2007, 07:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 6



Код

char moduleName[0xFF];//Путь к вызывающему exe-шнику
GetModuleFileName(NULL,moduleName,sizeof(moduleName)/sizeof(char));

У меня срабатывало, это API-шная функция, лежит, по моему, в windows.h
PM MAIL ICQ   Вверх
dumb
Дата 9.6.2007, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



EnergoHokum, это для своего процесса.

вопрос стоял иначе и правильный совет уже выдал 586.
PM MAIL   Вверх
Noman
Дата 9.6.2007, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 21.4.2007
Где: /mnt/Nowhere

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



Цитата(Tectoder @  8.6.2007,  23:06 Найти цитируемый пост)
GetModuleHandle("hWnd")  это +

Я это не сам придумал, написал по примеру Baa тут.
Цитата(EnergoHokum @  9.6.2007,  07:06 Найти цитируемый пост)
У меня срабатывало, это API-шная функция, лежит, по моему, в windows.h

 Как верно подметил dumb, данным способом можно вернуть путь только к самой программе.
Цитата(586 @  9.6.2007,  00:59 Найти цитируемый пост)
DWORD WINAPI GetModuleFileNameEx

 Да, похоже это то, что мне нужно. Спасибо.
PM MAIL WWW ICQ   Вверх
zkv
Дата 9.6.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Цитата(Noman @  9.6.2007,  21:58 Найти цитируемый пост)
Я это не сам придумал, написал по примеру Baa тут.

что то не нашел я там такой записи:
Цитата

GetModuleHandle("hWnd")

не надо на людей наговаривать smile
PM MAIL   Вверх
Noman
Дата 10.6.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 21.4.2007
Где: /mnt/Nowhere

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



zkv,  да я не наговариваю  smile 
 Скорее я сам просто не так понял его пост:
Цитата

char buff[0xFF];
GetModuleFileName ( GetModuleHandle(""), buff, sizeof (buff)+1);


 Ну да не важно  smile 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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