Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.31;
Скачать: CL | DM;

Вниз

Путь операционной системы   Найти похожие ветки 

 
ss300   (2003-07-15 09:40) [0]

Господа мастера, подскажите мне как узнать путь ОС?
например, в одном компе C:\WINDOWS, а в другом D:\WINNT


 
Anatoly Podgoretsky   (2003-07-15 09:42) [1]

Не поверишь, но GetWindowsDirectory


 
Skier   (2003-07-15 09:43) [2]

API GetWindowsDir(...) ?


 
ss300   (2003-07-15 09:47) [3]

UINT GetWindowsDirectory(
LPTSTR lpBuffer,
UINT uSize );

в LPTSTR чё писать?


 
Skier   (2003-07-15 09:50) [4]

PChar


 
Anatoly Podgoretsky   (2003-07-15 09:51) [5]

Адрес твоего буфера


 
Е-Моё имя   (2003-07-15 09:58) [6]


> Путь операционной системы

ОСДО!
;))


 
ss300   (2003-07-15 10:32) [7]

в смысле, какой адрес? подскажи чайнику, я с АПИ фунциями не работал


 
Skier   (2003-07-15 10:37) [8]


function GetWindowsDir: string;
var
Buffer: array[0..1023] of Char;
begin
SetString(Result, Buffer, GetWindowsDirectory(Buffer, SizeOf(Buffer)));
end;


 
Anatoly Podgoretsky   (2003-07-15 10:58) [9]

Я бы с целью безопасности немного бы поправил

function GetWindowsDir Str: string;
var
Buffer: array[0.. MAX_PATH] of Char;



 
Skier   (2003-07-15 11:00) [10]

>Anatoly Podgoretsky © (15.07.03 10:58)
Угу.
А я бы ещё подправил : :)
Buffer: array[0.. MAX_PATH - 1] of Char;


 
Anatoly Podgoretsky   (2003-07-15 11:08) [11]

Я бы не стал так делать, длина должна быть MAX_PATH + 1


 
Skier   (2003-07-15 11:09) [12]

>Anatoly Podgoretsky © (15.07.03 11:08)
???


 
panov   (2003-07-15 11:11) [13]

Skier © (15.07.03 11:09)

MAX_PATH+1 - дополнительно для завершающего нуля.


 
Skier   (2003-07-15 11:15) [14]

>panov
А если посмотреть на код ExpandFileName в SysUtils.pas ? :)


 
Anatoly Podgoretsky   (2003-07-15 11:16) [15]

MAX_PATH это реальное количество символов которое может быть в пути и плюч завершающий нуль, как сказал Панов.
При том именно надо пользоваться именно этой константой, а не жестко прописывать длину (это константа уже трижды менялась), а имя изменил потому, что такое имя уже есть в АПИ, наряду с GetWindowsDirectory


 
Skier   (2003-07-15 11:17) [16]

Господа, где в VCL используется MAX_PATH + 1 ?
Ткните пальцем. :)


 
Anatoly Podgoretsky   (2003-07-15 11:22) [17]

Skier © (15.07.03 11:17)
Ткну Buffer: array[ 0..MAX_PATH] of Char;

Длина равна Hi+low+1 - это и есть MAX_PATH + 1


 
Skier   (2003-07-15 11:26) [18]

>Anatoly Podgoretsky
Это понятно.
Но в VCL есть и такая штука : array[0..MAX_PATH-1] of Char;
Как с этим быть ?


 
Anatoly Podgoretsky   (2003-07-15 11:31) [19]

А никак, отнеси это к ошибкам программиста (некритическим), просто везение, в VCL есть и другие ошибки, например при работае с FindFirst


 
Skier   (2003-07-15 11:32) [20]

>Anatoly Podgoretsky
OK


 
Юрий Зотов   (2003-07-15 11:39) [21]

> как узнать путь ОС?

Неисповедимы пути г ОСподни...


 
Anatoly Podgoretsky   (2003-07-15 11:54) [22]

Я ради интереса покопался в SDK - интересные вещи, там где говорят про MAX_PATH ничего не говорят про завершающий нуль, там где говорят про завершающий нуль, ничего не говорят про MAX_PATH, зато есть ряд функций где прямо сказано, что указанная длина буфера не включает в себя завершающий нуль.

Юрий Зотов © (15.07.03 11:39)
Именно неисповедимы, в том же SysUtil есть оба варианта, но по крайней мере [0..MAX_PATH] страхует от ошибки и по этой причине не стоит использовать sizeof(buf), а безопаснее или MAX_PATH или sizeof(buf) - 1

Из полемик в борландовских группах пришли именно к такому варианту.


 
Юрий Федоров   (2003-07-15 11:57) [23]

Вообще это страшное дело. Я один раз искал ошибку неделю (валилось на строке Panel.caption:="123"). Оказалось, что дело именно в этом - совершенно в другом месте программы забыли выделить память под завершающий ноль. Такую ошибку можно было и вообще не найти, тем более что ее следствие то появлялось, то изчезало :-(, Так что мне крупно повезло


 
Skier   (2003-07-15 11:58) [24]

>Anatoly Podgoretsky © (15.07.03 11:54)
Очень познавательно. Спасибо.


 
Anatoly Podgoretsky   (2003-07-15 12:02) [25]

Юрий Федоров © (15.07.03 11:57)
Правильнее их не допускать вообще. Зачем тратить время на отладку.


 
KSergey   (2003-07-15 12:05) [26]

Интересное обсуждение получилось...

А вот по поводу буферов как раз хотелоь бы спросить: ф-ция GetDlgItemText
Про последний параметр в SDK написано: "maximum size of string" и "Specifies the maximum length, in TCHARs, of the string to be copied to the buffer pointed to by lpString. If the length of the string exceeds the limit, the string is truncated."

И вот не понятно: это макс. длина строки без завершающего нуля, или общая длина буфера, за котороую Win не вылезет?
Может кто подскажет?


 
Юрий Федоров   (2003-07-15 12:06) [27]

>>Anatoly Podgoretsky © (15.07.03 12:02)
Правильнее, это верно, но человеку, как известно, свойственно...
Впрочем, это не я был. А тот товарищ своевременно уволился :-)


 
Anatoly Podgoretsky   (2003-07-15 12:31) [28]

KSergey © (15.07.03 12:05)
Здесь как раз понятно, в символах без нуля, а вот в других местах не понятно, часто не оговорено и в разных местах по разному, но если буфер будет на единицу больше то проблемы не возникнет и кроме того большинство функций если не хватает места возвращают необходимый размер буфера с учетом нуля, но если не рисковать, то назначать на единицу больше, чтобы была гарантия от ошибок в описании.


 
KSergey   (2003-07-15 14:00) [29]

Anatoly Podgoretsky © (15.07.03 12:31)
Вам понятно, Вам хорошо ;) А мне нет.
Я так и не понял. Давайте на цифрах, ага? т.е. если я указал длину 5, то фактически максимум, что мне запихнет винда - будет 6 байт (строка из 5 символов+нулевой символ) или все же 5 (т.е. максимум 4-х символьная строка+нуль)?


 
Anatoly Podgoretsky   (2003-07-15 14:10) [30]

Может 6 а может 5, разбираться с каждой отдельной функцией, хорошо если это будет сказано. Но как правило 6.


 
KSergey   (2003-07-15 14:46) [31]

Anatoly Podgoretsky © (15.07.03 14:10)

Почему Вы уходите от ответа? ;) Я понимаю, что Вы не обязаны отвечать, но ведь я упомянул конкретнуу функцию, SDK у Вас есть (я уверен). Могли бы вы высказаться именно по этой функции на основании того, что написано в SDK и сказать точный ответ, указав те слова с SDK, на основании которых этот ответ построен? Просто лично мне по информации в SDK не удается получить точный ответ.

Буду очень признателен.


 
Anatoly Podgoretsky   (2003-07-15 14:48) [32]

Я дал абсолютно точный ответ и выше тоже.


 
Толик   (2003-07-15 14:53) [33]

to KSergey © (15.07.03 14:46)
Стандартная справка из поставки Delphi:
"GetDlgItemText ... See Also ... WM_GETTEXT "
смотрим WM_GETTEXT:
"cchTextMax
Value of wParam. Specifies the maximum number of characters to be copied, including the terminating null character. "
Это ответ?


 
Anatoly Podgoretsky   (2003-07-15 15:32) [34]

В вот здесь иначе и так по каждой функции

DWORD GetCurrentDirectory(
DWORD nBufferLength, // size, in characters, of directory buffer
Return Values

If the function succeeds, the return value specifies the number of characters written to the buffer, not including the terminating null character

А вот GetEnvironmentVariable
If the buffer pointed to by lpBuffer is not large enough, the return value is the buffer size, in characters, required to hold the value string and its terminating null character.

Так что в системе при указании размера буфера и требуемого размера встречаются оба случая и не всегда это описано. Первый вариант (not including the terminating null character) встречается чаще.

Это означает, что всегда надо быть осторожныи и всегда проверять описание и если есть сомнение выделать на единицу/две больше


 
Тфьу   (2003-07-15 15:37) [35]

MAX_PATH - длина строки без нуля, но массив [0..MAX_PATH] имеет длину MAX_PATH+1 из-за того, что начинается с 0. Вот вам место для завершающего символа.


 
KSergey   (2003-07-16 08:36) [36]

Толик © (15.07.03 14:53)
Стандартная справка из поставки Delphi:
"GetDlgItemText ... See Also ... WM_GETTEXT "
смотрим WM_GETTEXT:
"cchTextMax
Value of wParam. Specifies the maximum number of characters to be copied, including the terminating null character. "
Это ответ?


Это безусловно ответ. Причем точный и конкретный. Вот только это ответ по поводу работы сообщения WM_GETTEXT. Ведь, на сколько я понимаю, See Also лишь дает ссылки на родственные темы, но никак не на темы, описание в которых стоит воспринимать как расшифровку и уточнение к изначально рассматриваемому разделу (надеюсь всем понятно что я тут завернул ;) Можно, конечно, прикинуть, что GetDlgItemText посылает WM_GETTEXT, следовательно данное уточнение можно применить и непосредственно к GetDlgItemText, однако же, согласитесь, это не явное указание.

Anatoly Podgoretsky © (15.07.03 15:32)

Да дело в том, что я не пытался выяснить за все функции разом. Там где это явно написано - это здорово и понятно, но в данном случае мне не удалось найти явного описания. Вот и возникли подозрения, что я, возможно, не верно что-то понимаю.

Однако всем спасибо, я понял, что для данной ф-ции явного указания в ее описании действительно нет (надеюсь, что понял верно).


 
Anatoly Podgoretsky   (2003-07-16 09:26) [37]

KSergey © (16.07.03 08:36)
На все функции нельзя, нет единства в отечестве. Хуже когда это еще не будет и описано. Все время я пытаюсь довести до тебя эту мысль. Главное всегда смотри описание функции на передачу параметра и на возвращаемое значение. Даже в этом случае может отличаться - передача в символах, возврат в размере буфера.


 
KSergey   (2003-07-16 09:50) [38]

Anatoly Podgoretsky © (16.07.03 09:26)
KSergey © (16.07.03 08:36)
На все функции нельзя, нет единства в отечестве. Хуже когда это еще не будет и описано. Все время я пытаюсь довести до тебя эту мысль.


Вся штука в том, что эту мысль я давно понял, просто, вероятно, забыл об этом упомянуть ;)

Упорно же пытался получить лишь один КОНРЕТНЫЙ ответ: из описания в SDK именно к ф-ции GetDlgItemText можно сделать однозначный вывод или нет. И никак не могу получить этот самый конкретный ответ (да/нет). Вроде как есть намеки, что нет, но явно никто еще не ответил...


 
Юрий Зотов   (2003-07-16 10:06) [39]

> KSergey © (16.07.03 09:50)

Попробую дать этот однозначный ответ. Чтобы не мучиться с конкретным разбирательством по каждой функции, я просто ВСЕГДА предусматриваю место под завершающий ноль. Если оно этой функции нужно - то все будет ОК, а если не нужно - значит, этот ноль будет прописан ею не в последнем, а в предпоследнем байте, только и всего. Никаких отрицательных последствий это не даст.


 
Anatoly Podgoretsky   (2003-07-16 10:11) [40]

Юрий Зотов © (16.07.03 10:06)
Тоже самое советовал выше, но лучше размер на два символа больше, чем передаваемый параметр, тогда уж точно не будет ошибки.



Страницы: 1 2 вся ветка

Текущий архив: 2003.07.31;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.008 c
1-100718
vic_774N
2003-07-16 00:16
2003.07.31
Маленькая проблемка с MSWord


8-100835
XmPL
2003-04-09 13:44
2003.07.31
Как перевести 32-, 24-, 16/15-битное изображение


3-100618
АТ
2003-07-10 04:35
2003.07.31
Криво работает SQL- запрос :-(


14-100942
Князь Мышкин
2003-07-15 12:13
2003.07.31
Как на Делфи написать свою внеплатформенную операционную систему?


1-100720
Man
2003-07-18 12:59
2003.07.31
отличия процессов для дочернего и модального окон





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский