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;
参考: