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 获取宽字节类型的字符串
分类:
Inno Setup相关
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架