![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
convert LSA_UNICODE_STRING to string
istok © (2010-09-27 16:15:00)как сконвертить LSA_UNICODE_STRING в string?
Anatoly Podgoretsky (2010-09-28 16:57:00) [1]
> han_malign (27.09.10 17:54) [7]
Я думаю что в его случае SetString не применим, хотя он не указал версии Дельфи.
Anatoly Podgoretsky (2010-09-28 15:43:00) [2]> Клеррио (28.09.2010 15:42:15) [15]
Причины?
Клеррио (2010-09-28 15:42:00) [3]Anatoly Podgoretsky © (28.09.10 13:28) [14] и будет buffer полностью совстимый с WS.
Не будет.
Anatoly Podgoretsky (2010-09-28 13:28:00) [4]
> Точнее, выбирать-то нечего, решение в [7].
Точнее одно из решений, точно также будет работать и buffer[lsaStr.Length]
Для строк, которые не содержат null, и будет buffer полностью совстимый с WS.
Anatoly Podgoretsky (2010-09-28 13:23:00) [5]> 6x8 (28.09.2010 12:11:11) [11]
Аминь
Jumbo (2010-09-28 13:09:00) [6]>>Anatoly Podgoretsky © (27.09.10 16:54) [6] Я думаю хватит WS := PWideChar(Buffer);
>>Anatoly Podgoretsky © (28.09.10 08:55) [10] А WideString это Дельфи структура и не тыкай в меня null- terminated это твоя задача сделать это null- terminated до использования.
Как-то [6] и [10] конфликтуют между собой. Если "задача сделать это null- terminated до использования", то тогда не "я думаю хватит". Если "я думаю хватит", то тогда не надо "сделать это null- terminated до использования". Выбрать нужно одно из двух. Точнее, выбирать-то нечего, решение в [7].
6x8 (2010-09-28 12:11:00) [7]
> А WideString это Дельфи структура и не тыкай в меня null-
> terminated это
> твоя задача сделать это null- terminated до использования.
>
Да мне по барабану чё ты там делать будешь, а придёт тебе эта структура из системной или стороннеё либы, которая действует сторго согласно доки и которой до фонаря и ты, и дельфя и WideString, и получишь по самые помидоры.
Сам делай как хочешь, но хоть другим не ври - конфа-то для начинающих, постыдись
Anatoly Podgoretsky (2010-09-28 08:55:00) [8]> 6x8 (28.09.2010 04:59:09) [9]
А WideString это Дельфи структура и не тыкай в меня null- terminated это
твоя задача сделать это null- terminated до использования. PChar тоже might
not be null-terminated. Но это же никому не мешает, все работают и не
грустят.
6x8 (2010-09-28 04:59:00) [9]
> Почему я должен не верить Борману?
Потому что борман тут не при делах. Это виндовая структура и читать про неё надо в SDK/MSDN, а не где попало. А там четко сказано
> Length
> Specifies the length, in bytes, of the string pointed to
> by the Buffer member, not including the terminating NULL
> character, if any.
> ...
> Buffer
> Pointer to a wide character string. Note that the strings
> returned by the various LSA functions might not be null-
> terminated.
Anatoly Podgoretsky (2010-09-27 19:25:00) [10]
> The WideString type represents a dynamically allocated string
> of 16-bit Unicode characters. In most respects it is similar
> to AnsiString. On Win32, WideString is compatible with the
> COM BSTR type.
Почему я должен не верить Борману?
han_malign (2010-09-27 17:54:00) [11]
> Я думаю хватит WS := PWideChar(Buffer);
- при наличии точной длины, существование терминирующего символа не гарантированно, особенно при (Length = MaximumLength)...
ws: WideString;
...
SetString(ws, lsaStr.Buffer, lsaStr.Length);
Anatoly Podgoretsky (2010-09-27 16:54:00) [12]Я думаю хватит WS := PWideChar(Buffer);
istok (2010-09-27 16:45:00) [13]спасибо!
12 (2010-09-27 16:39:00) [14]function LSAUnicodeStringToStr (const lsaStr : TLSAUnicodeString) : string;
var
len : Integer;
begin
len := lsaStr.Length div sizeof (WideChar);
SetLength (result, len);
WideCharToMultiByte (CP_ACP, 0, lsaStr.Buffer, len, PChar (result), len, Nil, Nil);
end;
12 (2010-09-27 16:37:00) [15]У джедаев оформлено как
TLSAUnicodeString = packed record
Length : WORD;
MaximumLength : WORD;
Buffer : PWideChar
end;
istok (2010-09-27 16:37:00) [16]
USHORT = word;
_LSA_UNICODE_STRING = record
Length: USHORT;
MaximumLength: USHORT;
Buffer: LPWSTR;
end;
LSA_UNICODE_STRING = _LSA_UNICODE_STRING;
LPWSTR = PWideChar; (из Windows.pas)
т.е. я так понял, что Buffer указывает на 1ый символ и надо прочесть всю строку и сконвертить в string..
Anatoly Podgoretsky (2010-09-27 16:29:00) [17]Где это объявлено и как это объявлено.