0

Je souhaite empêcher l'utilisateur de saisir le caractère> ASCII 127 dans l'un des champs de mot de passe du programme d'installation.code ASCII de caractères dans InstallScript InstallShield

je googlé mais n'a pas trouvé de façon directe pour cela, actuellement j'utilise:

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; 

Y at-il une meilleure façon d'obtenir le code ASCII d'une chaîne?

Répondre

1

Tout d'abord, j'éviterais la conversion vers et à partir de la chaîne; il suffit de comparer sPassword[nCount] avec 127 directement; InstallScript stocke des caractères larges (nombres de 16 bits). Comme approche alternative, vous pouvez essayer d'appeler WideCharToMultiByte avec l'US-ASCII code page (20127). Je ne suis pas fort avec InstallScript et je codage sans le compilateur, alors vous pourriez avoir à corriger une erreur ou deux, mais voici l'idée approximative:

#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; 
Questions connexes