Что нового

[Процессы] Получение рабочего каталога для внешнего процесса

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 232
Репутация
2 344
Мне так нигде и не удалось найти решение задачи - как получить рабочий каталог (WorkingDir) внешнего процесса?

Есть API-функция GetCurrentDirectory, но это для текущего процесса, а как быть если нужно получить для другого процесса?
 

r35p3ct

Продвинутый
Сообщения
226
Репутация
60
Код:
DWORD WINAPI GetModuleFileNameEx(
  __in      HANDLE hProcess,
  __in_opt  HMODULE hModule,
  __out     LPTSTR lpFilename,
  __in      DWORD nSize
);
Код:
function GetAppFileName(hWnd: THandle) :string;
var
  dPID: dWord;
  hHandle: THandle;
begin
  GetWindowThreadProcessId(hWnd, @dPID);
  SetLength (Result, MAX_PATH);
  hHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, True, dPID);
  if GetModuleFileNameEx (hHandle, 0, PChar (Result), MAX_PATH) > 0 then
    SetLength (Result, StrLen (PChar (Result)));
end;
функция вроде должна выводить путь.

PS Yashied, просто пример функции показал, не знал, что она уже есть в WinAPI.au3
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 232
Репутация
2 344

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
_WinAPI_GetModuleFileNameEx()

Возвращает полный путь по PID'у процесса (есть пример).

:smile:



Добавлено:
Сообщение автоматически объединено:

r35p3ct

Если я не ошибаюсь, то мы в этой теме обсуждаем AutoIt, а не Delphi...
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 232
Репутация
2 344
Yashied [?]
Возвращает полный путь по PID'у процесса (есть пример).
Но мне нужен рабочий каталог, а не полный путь процесса :smile:


Добавлено:
Сообщение автоматически объединено:

P.S
Я предварительно обыскал всё, что было доступно для меня (все примеры у меня на компе (включая WinAPIEx), поиск на оф. форуме, в гугле, яндексе... везде!).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Но он не "постоянный". Например, FileOpenDialog() его меняет.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 232
Репутация
2 344
Yashied [?]
Например, FileOpenDialog() его меняет
Вот именно, мне то и нужно получить текущий рабочий каталог! :smile:

@WorkingDir это делает для скрипта, в принципе тоже самое делает и _WinAPI_GetCurrentDirectory, а мне нужен аналог этого, но для внешнего процесса.

Оно осуществимо?
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
CreatoR
Я хочу показать, что решение наверняка существует...
Модуль "Список процессов" в Far Manager имеет размер 48 КБ...
Он выводит для каждого процесса рабочий каталог...
Думаю, если это не одна функция WINAPI, то комбинация из пары-тройки функций...

Решения пока нет, но надежда есть... :smile:
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
CreatoR
Кое-что полезное есть на этой страничке, а точнее блок параметров функции...
И еще предположение: а что, если рабочая директория хранится в какой-нибудь переменной окружения, и ее можно считать вот этой или вот этой функцией?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 232
Репутация
2 344
snoitaleR
Спасибо, но это всё не то, тут нужен более глубокий подход...
 

SyDr

Сидра
Сообщения
651
Репутация
158
Максимум, что могу предложить:
http://stackoverflow.com/questions/217951/get-the-current-working-directory-for-cmd-exe

Ну или обратиться к Марку Руссиновичу :smile: Его программы умеют это делать.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 232
Репутация
2 344
SyDr [?]
Максимум, что могу предложить
Спасибо, это мне помогло осознать, что на самом деле мне нужно немного другое - нужен не рабочий каталог процесса, а последний каталог сохранени (используя стандартный диалог сохранения). Мне сбивал с толку тот факт, что в AutoIt после использования FileSaveDialog рабочий каталог меняется, но в других приложениях оно не так.
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
CreatoR
Я думаю, стандартный диалог сохранения вызывается любым приложением через WINAPI с указанием параметра текущей папки для сохранения...
Однако этот параметр вряд ли входит в какой-либо стандартный набор параметров процесса, а, возможно, и не хранится постоянно в оперативной памяти, а где-нибудь в реестре или в файле конфигурации...
 

SyDr

Сидра
Сообщения
651
Репутация
158
CreatoR [?]
Спасибо, это мне помогло осознать, что на самом деле мне нужно немного другое - нужен не рабочий каталог процесса, а последний каталог сохранени (используя стандартный диалог сохранения).
А тут уже полностью зависит от приложения. Для какого приложения нужно это узнать?
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
CreatoR
Опера.10 хранит эту информацию в файле конфигурации operaprefs.ini в секции Saved Settings под ключами Open Dir и Save Dir
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 232
Репутация
2 344
snoitaleR [?]
Опера.10 хранит эту информацию в файле конфигурации operaprefs.ini в секции Saved Settings под ключами Open Dir и Save Dir
Где, что и зачем Opera пишет и хранит я знаю очень хорошо ;)
Я также знаю что после сохранения этот файл не обновляется :( - Иначе не стал бы вовсе создавать данную тему.
 
Верх