У SetString есть две версии для AnsiString и UnicodeString соответственно? - PullRequest
1 голос
/ 27 октября 2019

Я использую Delphi XE3. Мне просто интересно, есть ли у строковых функций Delphi, таких как Windows SDK, две версии, одна для AnsiString и одна для UnicodeString?

Например, процедура SetString:

procedure SetString(var S: String; Buffer: PChar; Length: Integer);

Имеет ли она две версииодин из них:

procedure SetString(var S: AnsiString; Buffer: PAnsiChar; Length: Integer);

, а другая версия:

procedure SetString(var S: UnicodeString; Buffer: PUnicodeChar; Length: Integer);

Я искал в исходном коде Delphi, но нашел только следующую функцию в system.pas:

procedure _SetString(s: _PShortStr; buffer: _PAnsiChr; len: Byte);

Кажется, что System.pas определяет только строковую версию Ansi?

Ответы [ 2 ]

2 голосов
/ 27 октября 2019

На самом деле существует четыре разные версии SetString, по одной для каждого типа строки. Эти типы строк:

  • ShortString
  • AnsiString
  • UnicodeString
  • WideString

Хотя вы спрашивали о WideString, я подозреваю, что вы действительно хотели спросить о UnicodeString. В Delphi 2009 и более поздних версиях string является псевдонимом UnicodeString. Тип WideString - это оболочка Delphi для типа COM BSTR. Вы используете его только для взаимодействия COM и для поддержки Unicode в Dephi 2007 и более ранних версиях.

2 голосов
/ 27 октября 2019

Да, Delphi имеет разные версии этой функции для работы с разными типами строк и символов (и их комбинаций, т. Е. Существует более двух версий).

Если вы пишете этот простой тест и смотрите накод ассемблера, вы увидите, что на самом деле происходит:

procedure DoTest;
var
  s1: AnsiString;
  s2: WideString;
begin
  SetString(s1, PAnsiChar('Test1'), 3);
  SetString(s2, PWideChar('Test1'), 3);
end;

Установите точку останова в конце этой функции и откройте окно разборки (Ctrl + Alt + D):

Project1.dpr.15: SetString(s1, PAnsiChar('Test1'), 3);
0041BD71 6A00             push $00
0041BD73 BAC0BD4100       mov edx,$0041bdc0
0041BD78 8D45FC           lea eax,[ebp-$04]
0041BD7B B903000000       mov ecx,$00000003
0041BD80 E817B7FEFF       call @LStrFromPCharLen        ; <-- called AnsiString version
Project1.dpr.16: SetString(s2, PWideChar('Test1'), 3);
0041BD85 BAC8BD4100       mov edx,$0041bdc8
0041BD8A 8D45F8           lea eax,[ebp-$08]
0041BD8D B903000000       mov ecx,$00000003
0041BD92 E8E1B6FEFF       call @WStrFromPWCharLen       ; <-- called WideString version
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...