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 获取宽字节类型的字符串

  • 相关阅读:
    [贪心] JZOJ P3757 随机生成器
    [kmp] JZOJ P3756 动物园
    [kmp] JZOJ P3756 动物园
    [记忆化搜索] JZOJ P3767 路径
    [dfs序][线段树][并查集] JZOJ P3766 大融合
    [归并][随机算法] JZOJ P3765 想法
    [枚举][dfs] JOZJ P3749 Fox and City
    [hash] JZOJ P3669 抄卡组
    [dfs][图] 洛谷 P1330 封锁阳光大学
    [并查集]NOIP 2015 Day1 信息传递
  • 原文地址:https://www.cnblogs.com/tommy-huang/p/15210312.html
Copyright © 2011-2022 走看看