Самый простой способ выполнить задачу - объявить вашу функцию как:
interface
function StrCmpLogicalW(const sz1, sz2: WideString): Integer; stdcall;
implementation
function StrCmpLogicalW; external 'shlwapi.dll' name 'StrCmpLogicalW';
Поскольку переменная WideString
является указателем на WideChar
(точно так же переменная AnsiString
является указателем на AnsiChar
.)
И таким образом Delphi автоматически преобразует AnsiString в WideString
для вас.
Обновление
И так как мы сейчас находимся в мире UnicodeString
, вы бы сделали это:
interface
function StrCmpLogicalW(const sz1, sz2: UnicodeString): Integer; stdcall;
implementation
function StrCmpLogicalW; external 'shlwapi.dll' name 'StrCmpLogicalW';
Поскольку переменная UnicodeString
по-прежнему является указателем на завершенную \0\0
строку WideChars
. Так что если вы звоните:
var
s1, s1: AnsiString;
begin
s1 := 'Hello';
s2 := 'world';
nCompare := StrCmpLogicalW(s1, s2);
end;
Когда вы пытаетесь передать AnsiString
в функцию, которая принимает UnicodeString
, компилятор автоматически вызовет MultiByteToWideChar
для вас в сгенерированном коде.
CompareString поддерживает числовую сортировку в Windows 7
Начиная с Windows 7, Microsoft добавила SORT_DIGITSASNUMBERS
к CompareString
:
Windows 7: При сортировке обрабатывать цифры как числа, например, сортировать «2» перед «10».
Ничто из этого не помогает ответить на актуальный вопрос, который касается случаев, когда вам нужно преобразовать или привести строки.