Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нет ли здесь ошибки ? [D7, Win2k, WinXP]


Страницы:   1 2

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 сам ноль в конец буфера не допишет. Хотя, надо бы в хелп слазить . . .


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо