Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.009 c
14-1134378683
Andy BitOff
2005-12-12 12:11
2006.01.08
SendMessage в VBA(Excel), надо послать WM_COPYDATA


14-1134555913
dr Tr0jan
2005-12-14 13:25
2006.01.08
Очень нужна книжка


4-1131079994
msgipss
2005-11-04 07:53
2006.01.08
Функция NtQuerySystemInformation - разве на win2000 не работает ?


14-1134573036
lookin
2005-12-14 18:10
2006.01.08
Вес электрона


2-1134837845
Lokk
2005-12-17 19:44
2006.01.08
Помогите написать запрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский