код символа ASCII в InstallScript InstallShield - PullRequest
0 голосов
/ 14 сентября 2011

Я хочу, чтобы пользователь не вводил символ> ASCII 127 в одно из полей пароля в программе установки.

Я гуглил, но не нашел прямого пути для этого, в настоящее время я использую:

CHAR ch;
STRING ASCII;
NUMBER nASCII;

for nCount = 0 to StrLength(sPassword)
  ch = sPassword[nCount];
  sprintf(ASCII,"%d",ch);

  StrToNum(nASCII,ASCII);

  if ( nASCII > 127 )
    MessageBox("Invalid Character in Password",INFORMATION);
  endif; 

endfor;

Есть ли лучший способ получить код ASCII из строки?

1 Ответ

1 голос
/ 23 сентября 2011

Во-первых, я бы избегал преобразования в и из строки; просто сравните sPassword[nCount] с 127 напрямую; InstallScript хранит широкие символы (16-битные числа).

В качестве альтернативы вы можете попробовать WideCharToMultiByte с кодовой страницей US-ASCII (20127). Я не так силен с InstallScript и пишу без компилятора, поэтому вам, возможно, придется исправить одну или две ошибки, но вот грубая идея:

#define CP_US_ASCII 20127
extern prototype NUMBER Kernel32.WideCharToMultiByte(NUMBER, NUMBER, WSTRING, NUMBER, STRING, NUMBER, STRING, BYREF BOOL);

function BOOL IsSafeAscii(STRING szCheck)
    STRING szOut;
    BOOL bReplaced;
begin
    WideCharToMultiBute(CP_US_ASCII,          // only supports characters 0-127
                        WC_NO_BEST_FIT_CHARS, // or maybe 0; disallow turning accented to plain
                        szCheck,              // test string
                        StrLength(szCheck),   // length of test string
                        szOut,                // return buffer
                        StrLength(szOut),     // length of return buffer
                        "?",                  // replacement for unsupported characters
                        bReplaced);           // whether replacement was used
    return !bReplaced;
end;
...