Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Получение полного пути к файлу


Автор: Noman 8.6.2007, 22:50
 Доброго вечера.

Подскажите, как узнать полный путь к программе, если известны - дескриптор окна, название процесса и 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 выдает путь к самой программе.
 Подскажите, как можно эту проблему решить...

Автор: Tectoder 8.6.2007, 23:06
Например, Module32First или что нибудь типа этого
GetModuleHandle("hWnd")  это +

Автор: 586 9.6.2007, 00:59
Цитата(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
);

это?

Автор: EnergoHokum 9.6.2007, 07:06
Код

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

У меня срабатывало, это API-шная функция, лежит, по моему, в windows.h

Автор: dumb 9.6.2007, 12:35
EnergoHokum, это для своего процесса.

вопрос стоял иначе и правильный совет уже выдал 586.

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

Я это не сам придумал, написал по примеру http://vingrad.ru/@Baa http://forum.vingrad.ru/index.php?showtopic=1033&view=findpost&p=4915.
Цитата(EnergoHokum @  9.6.2007,  07:06 Найти цитируемый пост)
У меня срабатывало, это API-шная функция, лежит, по моему, в windows.h

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

 Да, похоже это то, что мне нужно. Спасибо.

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

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

GetModuleHandle("hWnd")

не надо на людей наговаривать smile

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

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


 Ну да не важно  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)