Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.06.15;
Скачать: [xml.tar.bz2];

Вниз

Работа ф-ии 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
9-1170425767
akaValerius
2007-02-02 17:16
2008.06.15
Хранение текстур


2-1211272132
ekto
2008-05-20 12:28
2008.06.15
Объявить константу-массив


15-1209827357
Pavia
2008-05-03 19:09
2008.06.15
Удаленный рабочий стол


2-1211309644
framez
2008-05-20 22:54
2008.06.15
Окна


2-1210571697
Andr
2008-05-12 09:54
2008.06.15
TPageControl





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский