Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать в консольном приложении имя машины [D7]


Страницы:   1 2

Андрей Пл ©   (2007-09-03 11:51:00) 

Возникла проблема:
функция GetComputerName() не работает для консольного приложения!!!
Как узнать в консольном приложения имя машины???

заранее спасибо.


Anatoly Podgoretsky   (2007-09-03 16:40:00) [1]


> Там есть куча функций, в которое по томуже MSDN'у требуется
> передать NULL, и при этом в описании юнита стоит var.

Это и есть пример плохого перевода функций АПИ и это не самое страшное, что там есть. Некоторые ошибки они испраляют в новых версиях Дельфи, а некоторые годами, начиная с 1995 года кочуют из версии в версию. Несколько месяцев назад кто то делал тему с разбором ошибок в Windows.pas
Можно годами работать с функцией и не попасть на ошибку, но стоит например только один раз попробовать передать NULL как она выплавет, а по описанию в MS SDK явно видно, что это не должен быть var параметр.

Во всем виноват Черчиль.


DiamondShark   (2007-09-03 15:12:00) [2]


> @!!ex ©   (03.09.07 14:57) [26]

Мне пофиг, что написано в юнитах.
Бредятина -- это критиковать языковую конструкцию на том основании, что кто-то коряво описал импорты.


@!!ex   (2007-09-03 14:57:00) [3]

> [22] DiamondShark ©   (03.09.07 14:07)

Ты сам о чем говоришь - не знаешь.
Че лезешь тогда?
В заголовках функций написано далеко не все. Это раз.
Ты сам не пишешь видимо на дельфе раз такую бредятину говоришь. Там есть куча функций, в которое по томуже MSDN'у требуется передать NULL, и при этом в описании юнита стоит var. ПРимеры привести, или всетаи сам залезешь и посмотришь?


DiamondShark   (2007-09-03 14:49:00) [4]


> Сергей М. ©   (03.09.07 14:21) [23]

Обошлось, не обошлось -- дело шестнадцатое.

Тип PChar в язык введён именно для работы с символьными массивами (всё-таки, хоть он формально и ^Char, но тип-ссылка на одиночный символ явно малополезен, во всяком случае, не настолько, чтоб вводить его аж в system со всякой поддержкой в языке).
Так что обзывать упрощение синтаксиса обращения к символьным массивам дурью -- это несколько максималистично. А каким боком тут батонокидательство -- вообще трансцендентная метафизика.


Anatoly Podgoretsky   (2007-09-03 14:27:00) [5]


> > Во всякмо случае меня периодически путает, что передавать
>
> > надо, указатель или непосредственно переменную.
>
> В заголовке функции написано.

Мешает то, что прототип находится в справке по MS SDK, а реальный в windows.pas
Надо проверять генофонд, что бы определить. Кроме того данный генофонд грешит и ошибками и непоследовательностью.


Сергей М.   (2007-09-03 14:21:00) [6]


> DiamondShark ©   (03.09.07 14:07) [22]


> тебя спросить забыли.


Ну а уж без консультаций с тобой дело у Борланда никак не обошлось, злой ты наш)


DiamondShark   (2007-09-03 14:07:00) [7]


> Что, imho, есть дурь и потакание батонокидателям.

тебя спросить забыли.


> ИМХО var - зло...

Обратитесь в Лигу Наций.


> Во всякмо случае меня периодически путает, что передавать
> надо, указатель или непосредственно переменную.

В заголовке функции написано.


> Сбивает что в юнитах дельфевых разброд, где то указатель,
>  где то var...

Нету там разброда. Если в описании API-функции про параметр сказано: "can be NULL", и значение NULL имеет какой-то содержательный смысл, то параметр описан как указатель, если не сказано, или подчёркнуто, что "can't be NULL", то описан как var.

В функциях, которые не являются импортируемыми извне, НИГДЕ не используются указатели для передачи того, что по смыслу является параметром по ссылке.
Что и правильно: в языке высокого уровня указателей быть не должно.


@!!ex   (2007-09-03 13:41:00) [8]

ИМХО var - зло...
Во всякмо случае меня периодически путает, что передавать надо, указатель или непосредственно переменную.
Тем более подстава, когда есть указатель и он нормально кладеться, когда нужно значение.....
Сбивает что в юнитах дельфевых разброд, где то указатель, где то var...
жууть. лучше бы var вообще не было.


Anatoly Podgoretsky   (2007-09-03 13:37:00) [9]

Не посмотрел прототип, но тем более PChar его и передает. Указатель на первый символ строкового массива.
PChar(S), S[0], S - эквиваленты
Массивы передаются по ссылке.

> Sets, records, and static arrays of 1, 2, or 4 bytes are
> passed as 8-bit, 16-bit, and 32-bit values. Larger sets,
>  records, and static arrays are passed as 32-bit pointers
> to the value. An exception to this rule is that records
> are always passed directly on the stack under the cdecl,
>  stdcall, and safecall conventions; the size of a record
> passed this way is rounded upward to the nearest double-
> word boundary.


Сергей М.   (2007-09-03 13:14:00) [10]


> Anatoly Podgoretsky ©   (03.09.07 13:12) [18]
>
> Это не компилятор, а суть var параметров


Какой же он var ?

Цитирую :

function GetComputerName(lpBuffer: PChar; var nSize: DWORD): BOOL; stdcall;

Никакого var'а нет и в помине.


Anatoly Podgoretsky   (2007-09-03 13:12:00) [11]

Это не компилятор, а суть var параметров


Сергей М.   (2007-09-03 12:59:00) [12]


> sniknik ©   (03.09.07 12:51) [15]


Да, согласен.

Умный компилятор трактует в дан.случае Buf как @Buf.
Что, imho, есть дурь и потакание батонокидателям.


sniknik   (2007-09-03 12:53:00) [13]

и когда ты пишешь например mas[5] это тоже указатель на mas со смещением 5.


sniknik   (2007-09-03 12:51:00) [14]

ну, некоторые судя по всему действительно не знают...

но тем не менее, в данном случае и во многих других в процедуру передаётся ссылка на массив -> т.е. указатель.
не веришь, проверь, возьми код из 4 и проверь (единственное исправление инициализация n перед вызовом)


Сергей М.   (2007-09-03 12:46:00) [15]


> sniknik ©   (03.09.07 12:43) [13]
> массив это тоже указатель...


Ну да).. А мужики-то и не знают)


sniknik   (2007-09-03 12:43:00) [16]

Сергей М. ©   (03.09.07 12:39) [10]
массив это тоже указатель...


sniknik   (2007-09-03 12:41:00) [17]

> к стати в обычном приложении без этого работало
там наверное была локальная переменная которая не обязательно = 0 (значение неопределено), сделай глобальной которые нулем инициализируются и будет также.


Вася Правильный   (2007-09-03 12:39:00) [18]


> (к стати в обычном приложении без этого работало)

тут она у тебя глобальная, инициализируется нулем
а в "обычном" вероятно локальная с произвольным мусорным значением


Сергей М.   (2007-09-03 12:39:00) [19]


> в обычном приложении без этого работало


Не могло "это" работать и в обычном приложении, поскольку это даже скомпилировано быть не может - первый параметр требует указательный тип данных, в то время как ты тычешь туда данные иного типа.


Anatoly Podgoretsky   (2007-09-03 12:33:00) [20]

> Андрей Пл  (03.09.2007 12:18:08)  [8]

Ошибка не в этом, а в том, что нет даже попытки обработать результат функии, никакой проверки на ошибки.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо