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