Форум: "Система";
Текущий архив: 2003.07.31;
Скачать: [xml.tar.bz2];
Внизфайл Services - как работать? Найти похожие ветки
← →
Romkin (2003-05-15 13:23) [0]Возникла тут у меня задача, записать в этот файл строку gds_db 3050/tcp :-)
Вот и интересно: во-первых, есть ли системные функции, работающие с этим файлом, во-вторых, как его найти, на разных ОС он лежит в разных местах, неужели по отличию NT - non NT определять?
← →
Anatoly Podgoretsky (2003-05-15 14:21) [1]Функций конечно нет.
Найти, ну для начала попробовать определить ОС, и далее взависимости от резульата, ну и конечно можно сделать поиск по диску, начиная от {WinDir}.
Кроме того он может и отсутствовать.
В общем чисто эмпирические методы, но пункт с ОС достаточно надежен.
Ну и после того как найден, то самый удобнsй путь будет работа через TStringList
← →
Digitman (2003-05-16 10:27) [2]вот фрагмент текста из модуля scktcomp.pas
function TCustomWinSocket.LookupService(const Service: string): Integer;
var
ServEnt: PServEnt;
begin
ServEnt := getservbyname(PChar(Service), "tcp");
if ServEnt <> nil then
Result := ntohs(ServEnt.s_port)
else Result := 0;
end;
Метод фактически осуществляет сканирование файла services, открываемого системой в режиме чтения, на предмет поиска в нем записи с именем службы Service: string и протоколом "tcp". При нахождении возвращает номер порта, ассоциированного с именем службы.
Как видно из примера, не делается никаких предположений отн-но местонахождения файла - об этом заботится система в ходе исполнения вызова getservbyname()
Это - образец работы с указанным файлом по чтению.
А для работы по записи - не вижу проблем, открыв файл по записи, модифицировать (добавить/изменить/удалить) строчку "gds_db 3050/tcp" любым удобным способом.
Штатное местонахождение файла - это кореневая системная директория; путь к системной директории всегда можно взять либо из реестра либо получить как результат вызова GetWindowsDirectory().
p.s.
Указанная строка "gds_db 3050/tcp" автоматом добавляется в файл services при штатной инсталляции IB.
← →
Digitman (2003-05-16 10:29) [3]вот фрагмент текста из модуля scktcomp.pas
function TCustomWinSocket.LookupService(const Service: string): Integer;
var
ServEnt: PServEnt;
begin
ServEnt := getservbyname(PChar(Service), "tcp");
if ServEnt <> nil then
Result := ntohs(ServEnt.s_port)
else Result := 0;
end;
Метод фактически осуществляет сканирование файла services, открываемого системой в режиме чтения, на предмет поиска в нем строковой записи (установленого формата) с именем службы Service: string и протоколом "tcp". При нахождении возвращает номер порта, ассоциированного с именем службы.
Как видно из примера, не делается никаких предположений отн-но местонахождения файла - об этом заботится система в ходе исполнения вызова getservbyname()
Это - образец работы с указанным файлом по чтению.
А для работы по записи - не вижу проблем, открыв файл по записи, модифицировать (добавить/изменить/удалить) строчку "gds_db 3050/tcp" любым удобным способом.
Штатное местонахождение файла - это кореневая системная директория; путь к системной директории всегда можно взять либо из реестра либо получить как результат вызова GetWindowsDirectory().
p.s.
Указанная строка "gds_db 3050/tcp" автоматом добавляется в файл services при штатной инсталляции IB.
← →
Anatoly Podgoretsky (2003-05-16 10:47) [4]Интересно, еще бы системе не знать где у нее этот файл, а вот жалко что нету функции Set
← →
Digitman (2003-05-16 11:02) [5]
> Anatoly Podgoretsky
А зачем ? Каков смысл менять местоположение файла ? imho, никакого.
← →
Verg (2003-05-16 11:10) [6]
> Штатное местонахождение файла - это кореневая системная
> директория; путь к системной директории всегда можно взять
Ну, ну! На Nt-ях-то где лежит srvices?
system32\drivers\etc
← →
Anatoly Podgoretsky (2003-05-16 11:49) [7]Конечно смысла менять нету, но вопрос то о том, как определить где этот файл, конечно для инсталляции Interbase это лишнее, штатный инсталлятор сам это сделает, но могут быть другие условия, например поменять порт после инсталляции или что ни будь еще. Лично я исходил из этой позиции.
У меня нет информации по всем системам, но думаю что вряд ли это выходит за рамки Windows и Windows\system32\drivers\etc, поэтому вполне достаточно определить платформу и затем проверить существование этого файла, можно и без определения платформы, сразу проверить эти два каталога и если не найдено, то вот тогда и думать как быть.
← →
Digitman (2003-05-16 11:51) [8]
> Verg
а на то есть
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DataBasePath = "%SystemRoot%\System32\drivers\etc"
думаю, и в Маздае параметр такой фигурирует (правда, уточнить надо, под рукой у меня нет Маздая)
в случае с Маздаем, вероятно, будет просто
"%SystemRoot%"
← →
Digitman (2003-05-16 11:55) [9]Самый лучший (самый надежный) вариант - оттрассировать вызов getservbyname() да посмотреть, откуда системой "выковыривается" путь к файлу)
← →
Romkin (2003-05-16 11:58) [10]Вот спасибо! Все проблемы снялись :-)
Но ветку реестра я на 98х проверю...
Скорее всего, ее там просто нет
← →
Romkin (2003-05-16 12:08) [11]Проверил. Нет такой ветки в win98 :-)
Значит, алгоритм поиска файла такой: проверяем значение
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DataBasePath
Если его нет, берем SystemRoot
Все должно пройти. А трассировать я не собираюсь :-)
← →
Digitman (2003-05-16 12:24) [12]
> Romkin
такой, может, и нет, но - пошарь таки на предмет на хождения моделей поиска
Services\Tcpip\Parameters\DataBasePath
или
Tcpip\Parameters\DataBasePath
или
Parameters\DataBasePath
или
DataBasePath
что-то же должно быть ?) где-то же драйвер протокола хранит свою конфигурацию на эту тему !)
← →
Anatoly Podgoretsky (2003-05-16 12:38) [13]Digitman © (16.05.03 11:51)
Digitman © (16.05.03 12:24)
И то и другое отсутствует, даже ни одного ключа с именем DataBasePath, там по умолчанию предполается, что это находится в SystemRoot, не могу сказать про ME
← →
Digitman (2003-05-16 12:55) [14]
> Anatoly Podgoretsky
ну да фиг с ним, с DataBasePath... но ведь и другие параметры протокола есть ! где-то же есть ключ "tcpip") .. может, там и следует пошарить в поисках аналогичных по назначению параметров..
← →
iva (2003-05-16 13:17) [15]Кто - то давно подарил
/////////////////////////////
procedure addriver;
var f: text;
p: pchar;
x: integer;
s: string;
filename: tfilename;
found: boolean;
const
NTFileName: string = "\system32\drivers\etc\Services";
WinFileName: string = "\Services";
begin
found:= false;
p := StrAlloc(128);
GetWindowsDirectory(p, 128);
if Win32Platform = ver_platform_win32_nt then filename := p + NTFileName
else filename := p + WinFileName;
StrDispose(p);
if fileexists(filename) then begin
Assign(f, filename);
Reset(f);
while not eof(f) do begin
readln(f, s);
if ansiPos("GDS_DB", AnsiUpperCase(s)) > 0 then found := true;
if found then break;
end;
if not found then begin
close(f);
try
append(f);
WriteLn(f, #13#10"gds_db 3050/tcp");
finally
end;
end;
end else begin
try
Assign(f, filename);
ReWrite(f);
WriteLn(f, "gds_db 3050/tcp");
finally
end;
end;
Flush(f);
close(f);
end;
/////////////////////////////
← →
Romkin (2003-05-20 12:53) [16]Спасибо всем, все прошло
function WriteServString(const ServString: string): boolean;
var
ServFile: textFile;
reg: TRegistry;
ServPath: string;
PathStr: array [0..MAX_PATH] of char;
begin
Result := false;
//Путь
if GetWindowsDirectory(PathStr, MAX_PATH) = 0 then
RaiseLastOSError;
ServPath := IncludeTrailingPathDelimiter(PathStr);
Reg := TRegistry.Create(KEY_READ);
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKeyReadOnly(ServiceKey) then
begin
ServPath := reg.ReadString("DataBasePath");
ExpandEnvironmentStrings(PChar(ServPath),PathStr, MAX_PATH);
ServPath := IncludeTrailingPathDelimiter(PathStr);
end;
finally
reg.CloseKey;
reg.Free;
end;
assignFile(ServFile, ServPath + "Services");
append(ServFile);
try
Writeln(ServFile, Sgds);
Result := true;
finally
CloseFile(ServFile);
end;
end;
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.07.31;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.01 c