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

Вниз

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

 
Андрей Пл   (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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.028 c
6-1161760446
petun
2006-10-25 11:14
2007.09.30
для пользователей TIcqClient


2-1189034348
Riply
2007-09-06 03:19
2007.09.30
Работа с памятью.


3-1179992276
bss
2007-05-24 11:37
2007.09.30
При сохранении изменений Post переходит на 1-ую запись


2-1188901835
Vovka
2007-09-04 14:30
2007.09.30
Прога для выключения компа в определённое времы!


2-1188729507
MAXHo
2007-09-02 14:38
2007.09.30
Сохранение страниц в TWebBrowser