Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как зарегистрировать порт, используемый сервером?  (Прочитано 5608 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mad Mike
Гость
« : 12-01-2005 18:53 » 

Имеется скажем некое приложение, которое использует по сети Interbase 5.x/6.x Надо для него сделать инсталл пакет. Всё бы ничего если бы не необходимость для работы Interbas-а прописывать порт сервера в файле Services для NT систем в %SystemRoot%\System32\drivers\etc\services для 9x в %WinDir%\services. Во всех известных мне Install мейкерах нет такой фичи. Собственно вопрос в чём... Как можно меньшей кровью выполнить нужную мне регистрацию. Может есть какие нибудь встроенные в ОС средства для этих целей? Чур не предлагать дописывать строчку в слепую.
Записан
Mad Mike
Гость
« Ответ #1 : 12-01-2005 20:21 » new

Вот кстати один из вариантов решения проблемы на Delphi.

program IB_reg;

uses
  Classes,
  Registry,
  Windows,
  SysUtils;

{$R *.RES}

Var
  reg:TRegistry;
  Services:String;
  Data:TStringList;

Function GetEnv(Const Name:String):String;
Var
  EnvVar:Array [0..255] Of Char;
Begin
  EnvVar:=#0;
  GetEnvironmentVariable(PChar(Name),EnvVar,SizeOf(EnvVar));
  Result:=EnvVar;
End;

Function ExtractEnvPath(S:String):String;
Var
  j1,j2:integer;
Begin
  //Поиск переменных окружения и составление
  //нормальных путей.
  j1:=Pos('%', S);
  While j1>0 Do
  Begin
    Delete(S,j1,1);
    j2:=Pos('%',S);
    if j2<>0 Then
    Begin
      Insert(GetEnv(Copy(S,j1,j2-j1)),S,j2+1);
      Delete(S,j1,1+j2-j1);
    End Else break;
    j1:=Pos('%', S);
  End;
  Result:=S;
End;

Procedure RegisterIBPort;
Var
  i:Integer;
Begin
  For i:=0 to Data.Count - 1 do
  Begin
    IF Pos('gds_db',Data.Strings)<>0 Then
    Begin
      Data.Strings:='gds_db          3050/tcp';
      Exit;
    End;
  End;
  Data.Add('gds_db          3050/tcp');
End;

Begin
  If Win32Platform=VER_PLATFORM_WIN32_NT Then
  Begin
    reg:=TRegistry.Create;
    reg.RootKey:=HKEY_LOCAL_MACHINE;
    //Узнаём где находиться файл 'services' в NT это выглядит так;
    if reg.OpenKeyReadOnly('\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters')Then
    Begin
      Services:=ExtractEnvPath(reg.ReadString('DataBasePath'));
      reg.CloseKey;
    End;
    reg.Free;
  //В 9x всё определено.
  End Else Services:=ExtractEnvPath('%WinDir%');
  Services:=Services+'\services';
  //Загружаем 'services' в память.
  Data:=TStringList.Create;
  Data.LoadFromFile(Services);
  //Регистрируем порт.
  RegisterIBPort;
  //Сохраняем результат.
  Data.SaveToFile(Services);
  Data.Free;
End.
« Последнее редактирование: 19-12-2007 21:18 от Алексей1153++ » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines