Что нового

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

CreatoR

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

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

r35p3ct

Продвинутый
Сообщения
228
Репутация
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
 

Yashied

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

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

:smile:



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

r35p3ct

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

CreatoR

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


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

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

Yashied

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,463
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,670
Репутация
2,463
snoitaleR
Спасибо, но это всё не то, тут нужен более глубокий подход...
 

SyDr

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

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

CreatoR

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