inno setup 通过指针获取完整字符串(宽字节字符)

 对应 C++ 的 wchar_t * 或者 LPWSTR 的 PWideChar,在 inno setup 中并不能直接使用,
而是需要通过 指针来获取:

[Code]
type
  PWideChar = Cardinal; { Inno doesn't have a pointer type, so we use a Cardinal instead }

{ This function allows us to get us the length of a string from a PWideChar }
function lstrlenW(lpString: PWideChar): Cardinal;
external 'lstrlenW@kernel32.dll stdcall';

{ This function copies a string - we declare it in such a way that we can pass a pointer
  to an Inno string as destination
  This works because Inno will actually pass a PWideChar that points to the start of the
  string contents in memory, and internally the string is still null-terminated
  We just have to make sure that the string already has the right size beforehand! }
function lstrcpyW_ToInnoString(lpStringDest: String; lpStringSrc: PWideChar): Integer;
external 'lstrcpyW@kernel32.dll stdcall';

function GetStringFromPWideChar(pointer : PWideChar): String;
var
    stringLength: Cardinal; { Length of the string we got }
    innoString: String; { This is where we'll copy the string into } 
begin
    { The pointer is actually just a renamed Cardinal at this point: }
    Log('String pointer = ' + IntToStr(pointer));

    { Now we have to manually allocate a new Inno string with the right length and
    copy the data into it }

    { Start by getting the string length }
    stringLength := lstrlenW(pointer);
    Log('String length = ' + IntToStr(stringLength));

    { Create a string with the right size }
    innoString := '';
    SetLength(innoString, stringLength);

    { This check is necessary because an empty Inno string would translate to a NULL pointer
        and not a pointer to an empty string, and lstrcpyW cannot handle that. }
    if StringLength > 0 then begin
        { Copy string contents from the external buffer to the Inno string }
        lstrcpyW_ToInnoString(innoString, pointer);
    end;

    { Now we have the value stored in a proper string variable! }
    Log('String value = ' + innoString);

    Result := innoString;
end;

参考:

INNO SETUP 获取宽字节类型的字符串

原文地址:https://www.cnblogs.com/tommy-huang/p/15210312.html