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

Вниз

Работа ф-ии RtlPrefixUnicodeString   Найти похожие ветки 

 
LightRipple ©   (2008-05-20 18:10) [0]

Здравствуйте !
Подскажите, пожалуйста, что я не так делаю (или чего не понимаю) ?
Почему ShowMessage выдет True ?

procedure RtlInitUnicodeString(Buffer: PUNICODE_STRING; Source: PWideChar); stdcall;
  external LibName_ntdll name "RtlInitUnicodeString";
function RtlPrefixUnicodeString(String1, String2: PUNICODE_STRING; CaseInSensitive: BOOL): BOOL; stdcall;
  external LibName_ntdll name "RtlPrefixUnicodeString";

procedure TMainForm.SpeedButton2Click(Sender: TObject);
var
Us1, Us2: UNICODE_STRING;
s1, s2: WideString;
begin
s1 := "bbbb";
RtlInitUnicodeString(@Us1, PWideChar(s1));
s2 := "aaaa";
RtlInitUnicodeString(@Us2, PWideChar(s2));
ShowMessage(BoolToStr(RtlPrefixUnicodeString(@Us1, @Us2, True), True));
ShowMessage(BoolToStr(RtlPrefixUnicodeString(@Us1, @Us2, False), True));
end;


А может у меня проблемы с буржуинским ?
Вот выдержка из MSDN:
The RtlPrefixUnicodeString routine compares two Unicode strings to determine whether one
string is a prefix of the other.

BOOLEAN
RtlPrefixUnicodeString(
IN PUNICODE_STRING String1,
IN PUNICODE_STRING String2,
IN BOOLEAN CaseInSensitive
);

Parameters
String1
Pointer to the first string, which might be a prefix of the buffered Unicode string at String2.
String2
Pointer to the second string.
CaseInSensitive
If TRUE, case should be ignored when doing the comparison.
Return Value
RtlPrefixUnicodeString returns TRUE if String1 is a prefix of String2.


 
han_malign ©   (2008-05-21 09:03) [1]


> RtlPrefixUnicodeString returns TRUE if String1 is a prefix of String2.

то что она возвращает FALSE в ином случае не сказанно...
попробуй
(RtlPrefixUnicodeString(@Us1, @Us2, False) = BOOL(1))


 
guav ©   (2008-05-21 11:28) [2]

BOOLEAN это не BOOL, размеры разные.

Если проблема с именно с тем, что функция может возвращать какое либо ненулевое значение в качестве FALSE, то в таких случаях в Delphi её лучше объявить как не *BOOL, а как целочисленный. В Delphi есть неявное приведение нестандартных значений к -1. Проблема может относится и к возвращаемому значению и к параметру.


 
Anatoly Podgoretsky ©   (2008-05-21 11:44) [3]

> guav  (21.05.2008 11:28:02)  [2]

ByteBool тоже не BOOLEAN, хотя и размеры совпадают и даже четыре буквы.


 
guav ©   (2008-05-21 16:02) [4]

> [3] Anatoly Podgoretsky ©   (21.05.08 11:44)
> ByteBool тоже не BOOLEAN

Это правда, зато BOOLEAN из WinNT.h есть Boolean из Delphi.
Т.к. про BOOLEAN в MSDN пишут, при том что TRUE это 1.
Boolean variable (should be TRUE or FALSE).
This type is declared in WinNT.h as follows:
typedef BYTE BOOLEAN;


 
Anatoly Podgoretsky ©   (2008-05-21 16:06) [5]

> guav  (21.05.2008 16:02:04)  [4]

Эх если бы об этом знали программисты, а то многие уже накололись на этом, почему то считали, что труе это единица, а микрософт возьми и измени это в некоторых функциях, стал возвращать -1

Увереным можно быть только за FALSE - и опытный программист будет работать только с ним, а не с TRUE


 
Anatoly Podgoretsky ©   (2008-05-21 16:16) [6]

> Anatoly Podgoretsky  (21.05.2008 16:06:05)  [5]

Кстати вторая проблема из этой оперы, поскольку в С нет строгой типизации, то возвращаемое значение часто используют и как Bool и DWord
Если 0 то это TRUE, а иначе код чего то.


 
guav ©   (2008-05-21 16:55) [7]

> [5] Anatoly Podgoretsky ©   (21.05.08 16:06)

На самом деле у BOOL и есть истина любое ненулевое значение, в винапи куча функций возвращающих как истину не единицу. С другой стороны некоторые винапи функции готовы принять как истину только TRUE. В Delphi типы *Bool имеют как истину по умолчанию -1.
Тип BOOLEAN, который typedef BYTE BOOLEAN в принципе тоже продолжает путаницу целочисленных и логических типов.


 
guav ©   (2008-05-21 16:56) [8]

> в винапи куча функций возвращающих как истину не единицу

Они даже не пишут про результат TRUE или FALSE, пишут "nonzero" и "zero".


 
Anatoly Podgoretsky ©   (2008-05-21 17:02) [9]

> guav  (21.05.2008 16:56:08)  [8]

Да я в курсе, а теперь представь тех, кто переводил функцию в Дельфи, часто описывают по справке, как BOOL
а на самом деле никаким BOOL и не пахнет. Переводили бы как Cardinal может и проблем бы не была, ну может чуть больше кода при обработке.


 
LightRipple ©   (2008-05-21 17:14) [10]

Пробовала декларировать как integer, но "с нахрапа" не увидела закономерности
в возвращаемом результате :(
Посему, временно, написала свою RtlPrefixUnicodeString,
а настоящую оставила в покое до окончания дискуссии Мастеров :)


 
guav ©   (2008-05-21 17:42) [11]

> [10] LightRipple ©   (21.05.08 17:14)
> Пробовала декларировать как integer


Не, BOOLEAN это
typedef BYTE BOOLEAN


 
Игорь Шевченко ©   (2008-05-21 20:45) [12]

Ntdll.pas
{ Является одна Unicode-строка префиксом другой }
function RtlPrefixUnicodeString(String1, String2: PUNICODE_STRING;
 CaseInSensitive: BOOL): Boolean; stdcall;


 
LightRipple ©   (2008-05-22 16:13) [13]

> [12] Игорь Шевченко ©   (21.05.08 20:45)
> function RtlPrefixUnicodeString(String1, String2: PUNICODE_STRING;
> CaseInSensitive: BOOL): Boolean; stdcall;

Вот ведь чудеса - работает :)
Спасибо. Пошла выкидывать собственнолапную :)



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

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

Наверх




Память: 0.5 MB
Время: 0.03 c
2-1211225363
Чайник
2008-05-19 23:29
2008.06.15
Оператор цикла For - порядок выполнения


6-1188888728
Alexey_k
2007-09-04 10:52
2008.06.15
Indy и подсчёт траффика


9-1171341313
ryryr
2007-02-13 07:35
2008.06.15
Puzzle


15-1209409182
Dmitry S
2008-04-28 22:59
2008.06.15
Тонкости перехвата API


15-1208803510
Kerk
2008-04-21 22:45
2008.06.15
Питер