Форум: "Начинающим";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];
ВнизНет ли здесь ошибки ? Найти похожие ветки
← →
ANB © (2005-12-20 12:06) [0]
function GetComputerName : PChar;
var Name : String;
Size : DWord;
begin
Size := MAX_COMPUTERNAME_LENGTH + 1;
SetLength(Name, Size);
Windows.GetComputerName(PAnsiChar(Name), Size);
SetLength(Name, Size);
Result := PChar(Name);
end;
Насколько корректно будет работать эта функция, если разместить ее в DLL и вызывать не из делфи (из Wise) ?
PS. Вообще то работает, хотел бы оценить надежность кода.
← →
Dmitrij_K (2005-12-20 12:25) [1]имхо корректней так
function GetComputerName : PChar;
var Size : DWord;
begin
Size := MAX_COMPUTERNAME_LENGTH + 1;
GetMem(Result, Size);
Windows.GetComputerName(Result, Size);
end;
ябыличнотакделалбы
← →
ANB © (2005-12-20 12:30) [2]
> Dmitrij_K (20.12.05 12:25) [1]
Я бы так не делал, т.к. GetComputerName сам ноль в конец буфера не допишет. Хотя, надо бы в хелп слазить . . .
← →
Leonid Troyanovsky © (2005-12-20 12:30) [3]
> ANB © (20.12.05 12:06)
> PS. Вообще то работает, хотел бы оценить надежность кода.
Плохой подход, что не раз объяснялось.
После выгрузки dll - AV при обращении к имени компьютера.
Если уж хост может вызывать внешнии функции, чего бы ему
не вызвать непосредственно GetComputerName.
--
Regards, LVT.
← →
ANB © (2005-12-20 13:59) [4]
> Leonid Troyanovsky © (20.12.05 12:30) [3]
Не может хост вызвать напрямую. Нужна DLL. Я так и думал, вообще то. А как правильно ?
← →
Leonid Troyanovsky © (2005-12-20 14:03) [5]
> ANB © (20.12.05 13:59) [4]
> Не может хост вызвать напрямую. Нужна DLL. Я так и думал,
> вообще то. А как правильно ?
Она и так в dll - kernell32.dll
А правильно - распределить буфер для строки в приложении
и передать его адрес и размер в параметрах функции.
Т.е., тоже самое, как если вызывать GetComputerName напрямую.
--
Regards, LVT.
← →
TUser © (2005-12-20 14:04) [6]
> Не может хост вызвать напрямую. Нужна DLL.
Почему он не может вызвать из системной библиотеки? Т.е. испотзуя описание из Windows.pas?
← →
ANB © (2005-12-20 14:13) [7]
> Leonid Troyanovsky © (20.12.05 14:03) [5]
> TUser © (20.12.05 14:04) [6]
Хост написан на Magic. Т.е. исполняется интерпретатором. У него хитрый формат вызова DLL. Память он выделять вообще не умеет. Кстати, DLL выгружаться не будет.
← →
evvcom © (2005-12-20 14:36) [8]
> т.к. GetComputerName сам ноль в конец буфера не допишет
допишет, для этого и
> Size := MAX_COMPUTERNAME_LENGTH + 1;
← →
Anatoly Podgoretsky © (2005-12-20 15:06) [9]ANB © (20.12.05 12:06)
Name прекращает свое существование при выходе из функции. рискуешь получить AV
← →
Leonid Troyanovsky © (2005-12-20 15:09) [10]
> ANB © (20.12.05 14:13) [7]
> Хост написан на Magic. Т.е. исполняется интерпретатором.
> У него хитрый формат вызова DLL. Память он выделять вообще
> не умеет.
Ну, а как-то ты собираешься прицепить свою dll?
(kernel32.dll, кста, уже прицеплена).
А со строками как оно работает, скажем, как скопировать строку?
Ну, а если выгружаться не будет, то и первый вариант сгодится.
Хотя, сегодня не выгружается, а завтра выгрузят :)
--
Regards, LVT.
← →
ANB © (2005-12-20 15:18) [11]
> Anatoly Podgoretsky © (20.12.05 15:06) [9]
Вот и я про тоже подумал. GetMem спасет ?
> Хотя, сегодня не выгружается, а завтра выгрузят :)
Он их и выгружать не умеет. Только подгружать.
← →
Anatoly Podgoretsky © (2005-12-20 15:22) [12]ANB © (20.12.05 15:18) [11]
Именно так, ты должен использовать не string а выделение памяти, иначе при выходе строка будет освобождена.
Только зачем ты дублируешь стандартную функцию GetComputerName - она как раз это и делает, возвращает имя
← →
begin...end © (2005-12-20 15:29) [13]Не понял, что такое Wise. Там можно статический массив символов определённого размера объявить? Если да, то, может быть, вызвать GetComputerName из kernel, передавая адрес массива нужного размера?
← →
Leonid Troyanovsky © (2005-12-20 15:37) [14]
> Anatoly Podgoretsky © (20.12.05 15:22) [12]
> иначе при выходе строка будет освобождена.
Да, а слона я и не приметил :)
Т.е., отложился лишь [1].
> Он их и выгружать не умеет. Только подгружать.
А может, он и строки копировать не умеет.
(или там задать длину строки и т.п.)?
Дык, и чему ж он будет присваивать результат?
И как он будет использован. Хелп к ему хорошо изучен?
--
Regards, LVT.
← →
Alexander Panov © (2005-12-20 15:38) [15]ANB © (20.12.05 15:18) [11]
Он их и выгружать не умеет. Только подгружать.
А параметры-то передавать умеет?
Т.е. может ли передать адрес переменной?
Если может, тогда надо передавать как параметр буфер достаточной длины, а в DLL заполнять его.
← →
ANB © (2005-12-20 17:10) [16]
> Alexander Panov © (20.12.05 15:38) [15]
> Leonid Troyanovsky © (20.12.05 15:37) [14]
Про Wise я не подумав, написал. Короче, у Magic вообще нету языка. В нем описываешь, как должна работать программа, и она работает. Правда, хреново. Команды "выделить память" там нету. Он сам выделяет, если посчитает нужным. Адреса в DLL он передавать не умеет. GetComputerName сам память под буфер не выделяет, т.е. задача стояла, выделить память, вызвать GetComputerName, вернуть в Magic указатель на ASCIIZ строку. В принципе, и в моем варианте не падает. Но, как я и подозревал, надо бы переписать через GetMem. Утечка здесь не страшна, т.к. эта ветка программы работает раз в год.
← →
Reindeer Moss Eater © (2005-12-20 17:19) [17]GetcomputerName можно вызвать прямо из скрипта вайза.
Вообще любую функцию из любой DLL можно вызвать, просто не всегда можно параметры средствами вайза построить.
← →
Leonid Troyanovsky © (2005-12-20 17:39) [18]
> Reindeer Moss Eater © (20.12.05 17:19) [17]
> не всегда можно параметры средствами вайза построить.
Ну, а строки там как представлены?
Т.е., если оное имя собираются использовать, то там с чем-то сравнивают.
Можно, к примеру, создать строку, скажем, из 16 пробелов.
А в функцию можно параметры по ссылке передавать?
--
Regards, LVT.
← →
ANB © (2005-12-20 17:48) [19]
> А в функцию можно параметры по ссылке передавать?
А хрен его знает. Вся документашка частично на английском (причем ужасная), частично на иврите (который у нас никто не знает). Раньше не было нужды активно работать с API - вот и не парились. Почему не смогли напрямую вызвать - не знаю. Сам пробовал в Magic ковыряться - ничего не понял.
← →
Reindeer Moss Eater © (2005-12-20 18:03) [20]С Pchar там вообще нет проблем.
Сложные структуры - да, проблематично.
В общем надо вспоминать, поднимать скрипты или документацию. Но со строками точно проблем нет. Помнится у самого вайза в самплесах куча скриптов на эту тему была.
← →
ANB © (2005-12-21 14:14) [21]
> Reindeer Moss Eater © (20.12.05 18:03) [20]
Это не для вайза ! Я перепутал.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.007 c