Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Смена текущей папки консоли 
:(
    Опции темы
AlphaStream
Дата 24.5.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Возникла необходимость написать консольное приложение на Delphi, которое бы могло менять текущую папку консоли, из-под которой оно запущено.
например, exe'шник лежит в c:\temp, мы запускаем cmd.exe, переходим в нём в c:\temp, запускаем нашу прогу, после _её завершения_ текущей папкой консоли становится, скажем, c:\temp\folder.
Применение SetCurrentDirectory и SetCurrentDir приводит к тому, что текущая папка меняется лишь на время выполнения этой программы...
По сути, мне нужно написать "свою" команду "cd" smile
Заранее благодарен за любую помощь.
PM MAIL   Вверх
Yanis
Дата 25.5.2007, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(MSDN)
The SetCurrentDirectory function changes the current directory for the current process.

Цитата(MSDN)
The GetCurrentDirectory function retrieves the current directory for the current process.




--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
AlphaStream
Дата 25.5.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я понимаю.. А существуют ли способы сменить текущую папку для "родительской" консоли, а не для текущего процесса?
PM MAIL   Вверх
Snowy
Дата 25.5.2007, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Если ты дочерний процесс, то не тебе решать, что делать родительскому.
Вот наоборот - без проблем...
PM MAIL   Вверх
Rouse_
Дата 29.5.2007, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



И не наоборот в принципе без проблем (будет работать начиная с Windows 2000):

Код

////////////////////////////////////////////////////////////////////////////////
//
//  ****************************************************************************
//  * Unit Name : ChangeConsoleDir
//  * Purpose   : Демо изменения текущей директории у консоли
//  * Author    : Александр (Rouse_) Багель
//  * Copyright : © Fangorn Wizards Lab 1998 - 2007.
//  * Version   : 1.00
//  * Home Page : http://rouse.drkb.ru
//  ****************************************************************************
//

program ChangeConsoleDir;

{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils;

  function GetConsoleWindow: DWORD; external 'kernel32.dll';

var
  dwProcessID, dwBytesWriten, dwThreadId: DWORD;
  hProcessHandle, hThread: HWND;
  szNewDirPath: PChar;
  lpRemoteBuffer: Pointer;
  lpFuncAddr: FARPROC;
begin
  GetWindowThreadProcessId(GetConsoleWindow, dwProcessID);
  hProcessHandle := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or
    PROCESS_VM_WRITE, True, dwProcessID);
  try
    szNewDirPath := 'C:\';
    lpRemoteBuffer := VirtualAllocEx(hProcessHandle, nil, Length(szNewDirPath),
      MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
    if lpRemoteBuffer <> nil then
    try
      if not WriteProcessMemory(hProcessHandle, lpRemoteBuffer, szNewDirPath,
        Length(szNewDirPath), dwBytesWriten) then
          RaiseLastOSError;
      if dwBytesWriten <> Length(szNewDirPath) then
        RaiseLastOSError;
      lpFuncAddr := GetProcAddress(GetModuleHandle(kernel32),
        'SetCurrentDirectoryA');
      if lpFuncAddr = nil then Exit;
      hThread := CreateRemoteThread(hProcessHandle, nil, 0, lpFuncAddr,
        lpRemoteBuffer, 0, dwThreadId);
      if hThread <> 0 then
      try
        WaitForSingleObject(hThread, INFINITE);
      finally
        CloseHandle(hThread);
      end;
    finally
      VirtualFreeEx(hProcessHandle, lpRemoteBuffer, 0, MEM_RELEASE);
    end;
  finally
    CloseHandle(hProcessHandle);
  end;
end.



--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

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


 




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


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

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