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

Вниз

Неясное поведение Delphi при работе с указателями типа PChar.   Найти похожие ветки 

 
Maks Realov   (2003-08-14 15:14) [0]

Ситуация такова - C-ная dll-ка дёргает в моей программе call-back функцию, передавая ей след. параметры:
unsigned (__stdcall *Dialog)(char*, int, char *, int); - описание в коде С-ой dll.
У меня ф-ия выглядит след. образом:

function AuthenticationFormShow(Name: PChar;
SizeOfName: integer; Password: PChar; SizeOfPass: integer): integer; stdcall;
begin
Result:= 0;
if StrPas(Name) = "" then // m1
StrPas(Password) = "" then // m2
// if String(Name) = "" then //m3
// if String(Password) = "" then //m4
//...
end;

Так вот, когда мне пресылают пустой буфер, то Name и Password, естественно, ничего не содержат, т.е. "", а в памяти нули.
Но почему проверка (StrPas(Name) <> "") возвращает True, т.е. "m1" и "m2" выполняются, если приходят пустые буфера, а проверки (String(Name) = "") дают False и m3, m4 не выполняются??? As far as I remember, StrPas оставили для обратной совместимости и в Help-е велят пользоваться прямым приведением типов (сиреч String(expression)).
В чём прикол? Где я не заметил зарытую собаку? 8)


 
panov ©   (2003-08-14 15:18) [1]

приведи код вызова функции и определения параметров


 
Maks Realov   (2003-08-14 15:28) [2]

panov © (14.08.03 15:18):

С-ый код? Зачем? Разве не достаточно того, что память под буфер распределяется правильно и даже указатель не Pointer, а типизированный - PChar?


 
Anatoly Podgoretsky ©   (2003-08-14 15:34) [3]

Это не сишный код, при том с ошибками.


 
имя   (2003-08-14 15:37) [4]

Удалено модератором


 
имя   (2003-08-14 15:37) [5]

Удалено модератором


 
имя   (2003-08-14 15:37) [6]

Удалено модератором


 
имя   (2003-08-14 15:37) [7]

Удалено модератором


 
имя   (2003-08-14 15:38) [8]

Удалено модератором


 
имя   (2003-08-14 15:38) [9]

Удалено модератором


 
Maks Realov   (2003-08-14 15:39) [10]

Удалено модератором
Примечание: OffTopic


 
имя   (2003-08-14 15:39) [11]

Удалено модератором


 
имя   (2003-08-14 15:39) [12]

Удалено модератором


 
имя   (2003-08-14 15:40) [13]

Удалено модератором


 
имя   (2003-08-14 15:40) [14]

Удалено модератором


 
имя   (2003-08-14 15:40) [15]

Удалено модератором


 
Maks Realov   (2003-08-14 17:02) [16]

Удалено модератором


 
Maks Realov   (2003-08-15 10:14) [17]

Удалено модератором


 
Digitman ©   (2003-08-15 10:23) [18]

воспользоваться средствами интегрированной отладки не приходило в голову ?

ставишь брейкпойнт на строчке

if StrPas(Name) = "" then ..

и смотришь, что в реальности ты получил факт.параметром


 
Maks Realov   (2003-08-15 17:10) [19]

Digitman © (15.08.03 10:23):
приходило, знаешь ли...
Name - ничего не содержит, нули...

function StrPas(const Str: PChar): string;
begin
Result := Str;
end;

Это из SysUtils. Я вообще не понимаю почему String(Name) и StrPas(Name) различаются при одном и том же пустом Name???


 
Maks Realov   (2003-08-15 19:40) [20]

Удалено модератором
Примечание: В следующий раз, будет удалена вся ветка


 
Maks Realov   (2003-08-18 12:36) [21]

Ну так что, никто не может это объяснить?


 
Digitman ©   (2003-08-18 12:45) [22]


> Name - ничего не содержит, нули


значит, передается "пустая" строка

т.о., условие StrPas(Name) = "" будет истинным

что же ты хочешь еще ?


 
Maks Realov   (2003-08-18 12:50) [23]

Боже...

Digitman © (18.08.03 12:45):
Я не хочу быть навязчивым, но ты вопрос вообще читал? 8)
StrPas(Name) = "" - истина
String(Name) = "" - ложь
ПОЧЕМУ???


 
Digitman ©   (2003-08-18 13:15) [24]


> ты вопрос вообще читал?


а как же !)

вот эти конструкции будут эквивалентны :

StrPas(Name) = ""
String(Name ^) = ""

чистой воды Паскаль !)


 
Digitman ©   (2003-08-18 13:23) [25]


> Maks Realov (15.08.03 17:10) [19]
> приходило, знаешь ли...


да вот, чувствуется, не приходило !

иначе при трассировке кода, сгенерированного строчкой

if String(Name) = "" then ...

ты увидел бы следующее

mov ebx, адрес_константы_""
test ebx,ebx
jnz ... // сама константа указывает на #0, а адрес ее <> 0, поэтому и сравнение дает False



Страницы: 1 вся ветка

Текущий архив: 2003.09.01;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.021 c
3-1347
paxer
2003-08-06 14:50
2003.09.01
Хран. проц.: обратится к столбцу таблицы по зад. в парам. имени?


3-1319
styopkin
2003-08-08 12:14
2003.09.01
MIDAS, DCOM


1-1481
revo
2003-08-18 12:48
2003.09.01
Как узнать занят ли файл другим приложением?


14-1583
Внук
2003-08-13 14:36
2003.09.01
Удаление веток


1-1492
Nestor
2003-08-15 07:58
2003.09.01
Подскажите пожайлуста, как при написании help a избавиться от