Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Поиск Каталога


Автор: Volkogriz 19.4.2008, 19:27
Доброе время суток!
помогите плиз!
Дело в том что, Программа должна устанавливать дополнительные модули игры!
Но эта игра не устанавливается стандартным способом а просто идёт в архиве и каждый распаковав суёт её куда захочет!
в общем постоянного место жительства папки нет!
Возможно ли такое при запуски программы начинался поиск папки на диске после поиска когда папка найдена начиналось копирование файлов в эту папку с игрой но только если папка нашлась а ни создавать её!?
И ещё игра не регистрируется в реестре!

Автор: SneG0K 19.4.2008, 21:22
Цитата(Volkogriz @  19.4.2008,  18:27 Найти цитируемый пост)
И ещё игра не регистрируется в реестре! 

А что ты сделал для того, чтобы прописать в реестре данные?
Цитата(Volkogriz @  19.4.2008,  18:27 Найти цитируемый пост)
Возможно ли такое при запуски программы начинался поиск папки на диске

Возможно... FindFirst(), FindNext()

Автор: Volkogriz 19.4.2008, 23:12
благодарю за ответ!
Вы непоняли я плохо объяснил! 
Игра не моя !
Это онлайн игра Lineage II!
Так что она сама туда не прописывается!
А может я и не прав!

Автор: SneG0K 19.4.2008, 23:19
Цитата(Volkogriz @  19.4.2008,  22:12 Найти цитируемый пост)
Так что она сама туда не прописуеться!

Так, а с чего ты тогда взял, что она вообще должна где-то прописываться?

Автор: Volkogriz 19.4.2008, 23:25
Я не об этом я просто к тому что поросто по риестру не найти путь к папки!
Не мне в принципе не это нужно а просто вычислить тоесть найти папку и установить файлы туда!
Огромное спасиба за проявленое внимание к маему вопросу!
А пападробний мона?)

Автор: Volkogriz 20.4.2008, 15:18
Всем доброго времени суток!
Я сейчас вам попытаюсь объяснить суть проблемы!
Это сетевая игра Lineage II многие с ней знакомы наверняка!
Суть проблемы такая!
Я пробовал писать обновления в InnoSetup я её более или менее знаю!
Но люди играют в эту игру разного возраста и начиная от 30 лет мне пишут что ани немогут установить обновления так как каму племянник
каму сын установил игру и ани незнают где находиться папка с игрой а запускают саму игру с ярлычка!
Я уже пытался описывать поиск с ярлычка но люди среднего возраста у которых интересы другие всё равно не понимают!
Вот мне и пришла в голову идея написать программку которая будит искать папку с игрой находить в ней для сравнения указанные файлы и только после того как она убедилась что эта именно та папка устанавливать дополнительные или исправленные компоненты игры!
Мне кажется это не так сложно осуществить!
Но у меня не фига не выходит и я решил оборотиться к вам за помощью!
помогите пожалуйста и если нетрудно маленький примерчик который будит манипулировать с одним фай-ликам чтоб мне разобраться!
Заранее благодарен!
С уважением Volkogriz!

Автор: THandle 20.4.2008, 21:07
Volkogriz, название папки известно? Или хотя бы названия файлов?

Запускаешь поиск по всему диску(очень длительный).

1 способ. Ищешь по имени папки. Если найдена папк с таким именем, то копируешь в нее.
2 способ. Если название папки может быть любым, то ты в каждой папке ищешь пару файлов, если это файлы от игры, то копируешь в ту папку где они были найдены.

Вот пример поиска: http://forum.vingrad.ru/sources/topic-205111.html

Автор: Qu1nt 20.4.2008, 21:22
Пусть пользователь указывает путь к ярлычку. Анализируешь его и получаешь необходимый путь к папке с игрой.

Автор: Poseidon 21.4.2008, 08:46
Цитата(Qu1nt @  20.4.2008,  21:22 Найти цитируемый пост)
Пусть пользователь указывает путь к ярлычку. Анализируешь его и получаешь необходимый путь к папке с игрой.
Да пусть пользователь при запуске указывает папку с игрой и все. Многие программы так делают, особенно патчи всякие. Искать по всему винчестеру можно, но может занять слишком много времени. Не всякий пользователь будет ждать.

Автор: Qu1nt 21.4.2008, 10:03
Poseidon, я исходил из этого:
Цитата(Volkogriz @  20.4.2008,  14:18 Найти цитируемый пост)
каму сын установил игру и ани незнают где находиться папка с игрой а запускают саму игру с ярлычка!

Поиск, действительно, может оказаться очень длительным. Тем более, возможны ситуации, когда существует несколько папок с игрой: "Lineage II Server 1", "Lineage II Server 2"... и такому пользователю определить нужную не так уж и просто. 
Можно реализовать что-нибудь такое:
Пользователь запускает твою программу => потом запускает игру => твоя программа находит путь к игре, например, по имени процесса => после этого "убивает" процесс и выполняет необходимые действия. Чтобы не повторять все эти действия каждый раз, сохраняем полученный путь в файле/реестре.

Автор: Volkogriz 21.4.2008, 11:51
Спасибо всем огромное!
Цитата(Qu1nt @  21.4.2008,  10:03 Найти цитируемый пост)
Можно реализовать что-нибудь такое:
Пользователь запускает твою программу => потом запускает игру => твоя программа находит путь к игре, например, по имени процесса => 

Можно малинький примерчик плиз smile 
Ну просто савсем простинький! А? smile 


Автор: Qu1nt 21.4.2008, 18:19
Наваял что-то:
Код

uses
  PsAPI;

function IsRunning(const ProcessName: string; var ProcessPath: string): Boolean;
var
  Processes: array[0..1023] of DWORD;
  cbNeeded, cbProcesses, hProcess, hMod: DWORD;
  ProcessFileName: array [0..MAX_PATH - 1] of Char;
  i: Integer;
begin
  Result := False;
  if not EnumProcesses(@Processes, SizeOf(Processes), cbNeeded) then
    Exit;
  cbProcesses := cbNeeded div SizeOf(cbProcesses);
  for i := 0 to cbProcesses - 1 do
  begin
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, Processes[i]);
    if hProcess <> 0 then
    begin
      if EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cbNeeded) then
        GetModuleFileNameEx(hProcess, hMod, ProcessFileName, SizeOf(ProcessFileName));
      CloseHandle(hProcess);
      if AnsiSameText(ExtractFileName(ProcessFileName), ProcessName) then
      begin
        ProcessPath := ExtractFilePath(ProcessFileName);
        Result := True;
        Break;
      end;
    end;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Path : string;
begin
  if IsRunning('notepad.exe', Path) then
  begin
    Self.Caption := Path;
    Timer1.Enabled := False;
  end;
end;

Примечание: Не работает под Win9x.

Автор: Volkogriz 22.4.2008, 09:52
Огромное спасиба! smile  smile 
С уважением Volkogriz!

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