Codes Langage Résumé 4D Notes techniques

Transcription

Codes Langage Résumé 4D Notes techniques
Codes Langage
Par
Aziz ELGHOMARI, Support Technique, 4D SA
Note technique 4D-200106-20-FR
Version 1
Date 1 Juin 2001
Résumé
Certaines commandes 4D nous renseignent sur les informations système ( version de l'OS, volumes utilisés
etc.), mais il n'existe aucune commande 4D qui nous retourne le nom de la langue ainsi que son identifiant.
Cette note permettra de compléter les informations systèmes en nous retournant le numéro d'identifiant de la
langue ainsi que le nom .( Système Français, Système Anglais, Système Arabe etc.)
La note nous explique aussi comment convertir une chaîne de caractères Windows vers Macintosh.
4D Notes techniques
Copyright © 1985-2003 4D SA - Tous droits réservés
Tous les efforts ont été faits pour que le contenu de cette note technique présente le maximum de fiabilité possible.
Néanmoins, les différents éléments composant cette note technique, et le cas échéant, le code, sont fournis sans garantie d'aucune sorte.
L'auteur et 4D S.A. déclinent donc toute responsabilité quant à l'utilisation qui pourrait être faite de ces éléments, tant à l'égard de leurs
utilisateurs que des tiers.
Les informations contenues dans ce document peuvent faire l'objet de modifications sans préavis et ne sauraient en aucune manière
engager 4D SA. La fourniture d u logiciel décrit dans ce document est régie par u n octroi de licence dont les termes sont précisés par
ailleurs dans la licence électronique figurant sur le support d u Logiciel et de la Documentation afférente. Le logiciel et sa documentation
ne peuvent être utilisés, copiés o u reproduits sur quelque support que ce soit et de quelque manière que ce soit, que conformément aux
termes de cette licence.
Aucune partie de ce document ne peut être reproduite o u recopiée de quelque manière que ce soit, électronique o u mécanique, y compris
par photocopie, enregistrement, archivage o u tout autre procédé de stockage, de traitement et de récupération d'informations, pour
d'autres buts que l'usage personnel de l'acheteur, et ce exclusivement aux conditions contractuelles, sans la permission explicite de 4D
SA.
4D, 4D Calc, 4D Draw, 4D Write, 4D Insider, 4ème Dimension ®, 4D Server, 4D Compiler ainsi que les logos 4e Dimension, sont des
marques enregistrées de 4D SA.
Windows,Windows NT,Win 32s et Microsoft sont des marques enregistrées de Microsoft Corporation.
Apple, Macintosh, Power Macintosh, LaserWriter, ImageWriter, QuickTime sont des marques enregistrées o u des noms commerciaux de
Apple Computer,Inc.
Mac2Win Software Copyright © 1990-2002 est un produit de Altura Software,Inc.
4D Write contient des éléments de "MacLink Plus file translation", un produit de DataViz, Inc,55 Corporate drive,Trumbull,CT,USA.
XTND Copyright 1992-2002 © 4D SA. Tous droits réservés.
XTND Technology Copyright 1989-2002 © Claris Corporation.. Tous droits réservés ACROBAT © Copyright 1987-2002, Secret
Commercial Adobe Systems Inc.Tous droits réservés. ACROBAT est une marque enregistrée d'Adobe Systems Inc.
Tous les autres noms de produits o u appellations sont des marques déposées o u des noms commerciaux appartenant à leurs propriétaires
respectifs.
1/4
2001-20 Codes Langage
Par Aziz Elghomari, Support Technique 4D
Note technique 2001-20
Note technique pour Juin 2001
Introduction
Certaines commandes 4D nous renseignent sur les informations système ( version de l'OS, volumes utilisés
etc.), mais il n'existe aucune commande 4D qui nous retourne le nom de la langue ainsi que son identifiant.
La note suivante, permettra de compléter les informations systèmes en nous retournant le numéro
d'identifiant de la langue ainsi que le nom .( Système Français, Système Anglais, Système Arabe etc.)
La note nous explique aussi comment convertir une chaîne de caractères Windows vers Macintosh.
Le package externe se résume aux fonctions GetLanguage, qui permet de retourner le numéro d'identifiant de
la langue ainsi que son nom , et d'une autre fonction qui permet de convertir la table Ascii Windows vers
Macintosh
Code 4D
C_ENTIER(MyErr)
C_ENTIER(IDLanguage)
C_ALPHA(80;IDString)
MyErr:=GetLanguage(IDLanguage;IDString)
Le Code en C
void
GetLanguage(long
*returnedValue,
long
*IDLanguage,
unsigned
char
{
/* Put your code here. */
char *maval;
UINT nLenOfSysDirPath = 0;
LPTSTR lpszSysDir = NULL;
//char lpdwTrans[256],cbTrans[256];
LPVOID *lpdwTrans;
PUINT cbTrans;
// address of buffer for version value pointer
// address of length buffer
LPTSTR lpszSysFile = NULL;
2/4
*IDString)
UINT nLen = 0;
DWORD dwUseless = 0;
LPVOID lpVersionData = NULL;
DWORD dwSize = 0;
LCID lcidUSER;
TCHAR szUserLangName [64];
long lenr, taille;
char t1[255] = "çéèà";
char t2[255] = "";
unsigned char *src = (unsigned char*)t1;
unsigned char *dest = (unsigned char*)t2;
nLen = GetSystemDirectory( NULL, 0 );
nLenOfSysDirPath = nLen + NUM_TCHARS_NEEDED_FOR_BACKSLASH;
lpszSysDir = (LPTSTR) LocalAlloc( LPTR, nLenOfSysDirPath *sizeof( TCHAR ) );
lpszSysFile = (LPTSTR) LocalAlloc( LPTR, nLenOfSysDirPath *sizeof( TCHAR ) );
GetSystemDirectory( lpszSysDir, nLen );
if ( lstrcmp( (LPCTSTR) lpszSysDir[ lstrlen( lpszSysDir ) ], (LPCTSTR)
BACKSLASH ) )
lstrcat( lpszSysDir, (LPCTSTR) BACKSLASH );
//lstrcpy( lpszSysFile, (LPCTSTR) lpszSysDir );
lstrcpy( lpszSysFile,(LPCTSTR)lpszSysDir );
lstrcat( lpszSysFile, (LPCTSTR) TEXT("USER.EXE"));
dwSize = GetFileVersionInfoSize(lpszSysFile,&dwUseless);
if (dwSize)
{
lpVersionData = LocalAlloc(LPTR,(UINT)dwSize);
if (GetFileVersionInfo(lpszSysFile,dwUseless,dwSize,lpVersionData))
{
if(VerQueryValue(lpVersionData,TEXT("\\VarFileInfo\\Translation"),
(VOID**)&lpdwTrans, &cbTrans))
{
lcidUSER = LOWORD(lpdwTrans[0]);
}
} // end we got version data
LocalFree((HLOCAL)lpVersionData);
}
VerLanguageName (lcidUSER,szUserLangName,sizeof(szUserLangName));
IDLanguage=lcidUSER;
taille =strlen(szUserLangName);
lenr = AnsiToMac( szUserLangName, dest, taille);
assert( lenr == taille);
IDString[0]=strlen(dest);
memcpy(&IDString[1],dest,strlen(dest));
LocalFree(lpszSysDir);
LocalFree(lpszSysFile);
}
long AnsiToMac( unsigned char *AnsiStr, unsigned char *MacStr, short AnsiLen )
{
register short
i;
register unsigned chartch;
long
MacLen = 0;
3/4
Boolean
InSitu = AnsiStr == MacStr;
unsigned char AnsiToMacTab[] =
/* 80 - 87 */ {0xAD, 0xB0, 0xE2, 0xC4, 0xE3, 0xC9, 0xA0, 0xE0,
/* 88 - 8F */
0xF6, 0xE4, 0xDE, 0xDC, 0xCE, 0xB2, 0xB3, 0xB6,
/* 90 - 97 */
0xB7, 0xD4, 0xD5, 0xD2, 0xD3, 0xA5, 0xD0, 0xD1,
/* 98 - 9F */
0xF7, 0xAA, 0xDF, 0xDD, 0xCF, 0xBA, 0xFD, 0xD9,
/* A0 - A7 */
0xCA, 0xC1, 0xA2, 0xA3, 0xDB, 0xB4, 0xBD, 0xA4,
/* A8 - AF */
0xAC, 0xA9, 0xBB, 0xC7, 0xC2, 0xF0, 0xA8, 0xF8,
/* B0 - B7 */
0xA1, 0xB1, 0xC3, 0xC5, 0xAB, 0xB5, 0xA6, 0xE1,
/* B8 - BF */
0xFC, 0xC6, 0xBC, 0xC8, 0xF9, 0xDA, 0xD7, 0xC0,
/* C0 - C7 */
0xCB, 0xE7, 0xE5, 0xCC, 0x80, 0x81, 0xAE, 0x82,
/* C8 - CF */
0xE9, 0x83, 0xE6, 0xE8, 0xED, 0xEA, 0xEB, 0xEC,
/* D0 - D7 */
0xF5, 0x84, 0xF1, 0xEE, 0xEF, 0xCD, 0x85, 0xFB,
/* D8 - DF */
0xAF, 0xF4, 0xF2, 0xF3, 0x86, 0xFA, 0xB8, 0xA7,
/* E0 - E7 */
0x88, 0x87, 0x89, 0x8B, 0x8A, 0x8C, 0xBE, 0x8D,
/* E8 - EF */
0x8F, 0x8E, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95,
/* F0 - F7 */
0xFE, 0x96, 0x98, 0x97, 0x99, 0x9B, 0x9A, 0xD6,
/* F8 - FF */
0xBF, 0x9D, 0x9C, 0x9E, 0x9F, 0xFF, 0xB9, 0xD8};
for (i = 0; i < AnsiLen; i++)
{
tch = *AnsiStr++;
if ( tch == 0 )
break;
if ( tch == 0x0A )
{
if ( InSitu )
{
BlockMove(AnsiStr, AnsiStr-1, AnsiLen-i);
AnsiStr--;
}
}
else
{
*MacStr++ = (tch & 0x80) ? AnsiToMacTab[ tch & 0x7F ] : tch;
MacLen++;
}
}
return
MacLen;
}
4/4