Форум: "Начинающим";
Текущий архив: 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