Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.49 MB
Время: 0.012 c
1-100789
cjiohobaji
2003-07-17 07:20
2003.07.31
таймер


1-100809
Alexxxx
2003-07-16 16:23
2003.07.31
прозрачный WebBrowser


1-100721
Дома
2003-07-18 16:54
2003.07.31
GetCaretPos из user32.dll


1-100737
alois
2003-07-16 18:56
2003.07.31
Ассоциирование файлов с программой


1-100670
Salvator
2003-07-17 22:38
2003.07.31
Работа с Dll





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский