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

Вниз

Нет ли здесь ошибки ?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.018 c
6-1127697832
pr0t0n
2005-09-26 05:23
2006.01.08
Proxy & WebBrowser


14-1134195633
begin...end
2005-12-10 09:20
2006.01.08
С Днём рождения! 10 декабря


2-1134917493
newhite
2005-12-18 17:51
2006.01.08
Объясните!


1-1133530511
Сафаров
2005-12-02 16:35
2006.01.08
нестандартный размер шрифтов


1-1133802665
The Only
2005-12-05 20:11
2006.01.08
смена языка