Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];

Вниз

Как узнать в консольном приложении имя машины   Найти похожие ветки 

 
Андрей Пл   (2007-09-03 11:51) [0]

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

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


 
Сергей М. ©   (2007-09-03 11:52) [1]

Работает, не выдумывай.


 
Riply ©   (2007-09-03 11:55) [2]

> [1] Сергей М. ©   (03.09.07 11:52)
> Работает, не выдумывай.
А в военное время ? :)


 
Anatoly Podgoretsky ©   (2007-09-03 11:56) [3]

> Riply  (03.09.2007 11:55:02)  [2]

В военное время выдает имя пользователя.


 
Андрей Пл   (2007-09-03 11:57) [4]

> Сергей М. ©   (03.09.07 11:52) [1]
ТОгда подскажи что не так делаю!
вот текст проги:

program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils, Windows;

var
 varFile:TextFile;
 fileReport,nameHost: String;
 buf: array [0..MAX_COMPUTERNAME_LENGTH + 1] of char;
 n:Cardinal;

begin

fileReport:= "D:\Temp\Report\report.txt";
 assignFile(varFile, fileReport);
 if not FileExists(fileReport) then
   rewrite(varFile)
 else
   Append(varFile);

 GetComputerName(buf,n);
 nameHost:=buf;

 Writeln(varFile,FormatDateTime("dd"."mm"."yyyy" "hh":"nn":"ss":"zzz",Now)+" | "+ nameHost);
 CloseFile(varFile);
end.


 
Desdechado ©   (2007-09-03 12:01) [5]

BOOL GetComputerName(
   LPTSTR lpBuffer, // address of name buffer
   LPDWORD nSize  // address of size of name buffer
  );


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


> что не так делаю


Все)

И причем здесь консоль - совершенно непонятно.

var
 Buf: String;
..
SetLength(Buf, MAX_COMPUTERNAME_LENGTH);
if GetComputerName(PChar(Buf), MAX_COMPUTERNAME_LENGTH) then
 ShowMessage(Buf);


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

Точнее так:

var
Buf: String;
n: Integer;
..
n := var
Buf: String;
..

n := MAX_COMPUTERNAME_LENGTH + 1;

SetLength(Buf, MAX_COMPUTERNAME_LENGTH);
if GetComputerName(PChar(Buf), n) then
ShowMessage(Buf);


 
Андрей Пл   (2007-09-03 12:18) [8]

> Сергей М. ©   (03.09.07 12:09) [7]
не вижу особой разницы что я сразу выделил место для переменной
buf: array [0..MAX_COMPUTERNAME_LENGTH + 1] of char;

или ты

var
Buf: String;
n: Integer;

n := MAX_COMPUTERNAME_LENGTH + 1;

SetLength(Buf, MAX_COMPUTERNAME_LENGTH);

Из вините за беспокойство моя ошибка была в том что я не занес значение в переменную N перед тем как воспользоваться функцией GetComputerName. (к стати в обычном приложении без этого работало)

 n := MAX_COMPUTERNAME_LENGTH + 1;
 fl:=GetComputerName(buf,n);


Всем спасибо.


 
Anatoly Podgoretsky ©   (2007-09-03 12:33) [9]

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

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


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


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


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


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


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

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


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

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


 
sniknik ©   (2007-09-03 12:43) [13]

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


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


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


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


 
sniknik ©   (2007-09-03 12:51) [15]

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

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


 
sniknik ©   (2007-09-03 12:53) [16]

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


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


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


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

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


 
Anatoly Podgoretsky ©   (2007-09-03 13:12) [18]

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


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


> 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:37) [20]

Не посмотрел прототип, но тем более 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.


 
@!!ex ©   (2007-09-03 13:41) [21]

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


 
DiamondShark ©   (2007-09-03 14:07) [22]


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

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


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

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


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

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


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

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

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


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


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


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


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


 
Anatoly Podgoretsky ©   (2007-09-03 14:27) [24]


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

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


 
DiamondShark ©   (2007-09-03 14:49) [25]


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

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

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


 
@!!ex ©   (2007-09-03 14:57) [26]

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

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


 
DiamondShark ©   (2007-09-03 15:12) [27]


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

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


 
Anatoly Podgoretsky ©   (2007-09-03 16:40) [28]


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

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

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



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

Форум: "Начинающим";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.106 c
9-1161125968
rts111
2006-10-18 02:59
2007.09.30
Шейдеры где компилируются, в видеокарте или в dll?


2-1188818457
Помогите!
2007-09-03 15:20
2007.09.30
Работа с битами.


15-1188795881
Palladin
2007-09-03 09:04
2007.09.30
Монстроидальный Unit


2-1188479226
ANTPro
2007-08-30 17:07
2007.09.30
RTTI


2-1188903449
em240
2007-09-04 14:57
2007.09.30
MSSQL2000+запуск функции из 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
Английский Французский Немецкий Итальянский Португальский Русский Испанский