zoukankan      html  css  js  c++  java
  • 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 获取宽字节类型的字符串

  • 相关阅读:
    纯代码frame位移和伸缩
    纯代码-QQ登陆练习
    IOS学习笔记 -- 基础
    LoadRunner接口脚本web_submit_data编写过程中遇到的问题及分享
    Win10系统下安装Oracle服务器和Oracle客户端
    Liunx上传下载和压缩问题分享
    LoadRunner接口工作总结
    分享网上搜到的Oracle中对判定条件where 1=1的正解
    LoadRunner接口测试Error -27225报错解决
    LoadRunner压力测试之Unique Number参数类型、Random Number参数类型浅析
  • 原文地址:https://www.cnblogs.com/tommy-huang/p/15210312.html
Copyright © 2011-2022 走看看