Condividi tramite


TN057: localizzazione di componenti MFC

Nota

La seguente nota tecnica non è stata aggiornata da quando è stata inclusa per la prima volta nella documentazione online. Di conseguenza, alcune procedure e argomenti potrebbero essere non aggiornati o errati. Per le informazioni più recenti, è consigliabile cercare l'argomento di interesse nell'indice della documentazione online.

Questa nota descrive alcune delle progettazioni e delle procedure che è possibile usare per localizzare il componente, se è un'applicazione o un controllo OLE o una DLL che usa MFC.

Panoramica

Esistono davvero due problemi da risolvere durante la localizzazione di un componente che usa MFC. In primo luogo, è necessario localizzare le proprie risorse, ovvero stringhe, dialoghi e altre risorse specifiche del componente. La maggior parte dei componenti compilati con MFC include e usa anche una serie di risorse definite da MFC. È necessario specificare anche le risorse MFC localizzate. Fortunatamente, diverse lingue sono già fornite da MFC stesso.

Inoltre, il componente deve essere preparato per l'esecuzione nell'ambiente di destinazione (ambiente europeo o abilitato per DBCS). Nella maggior parte dei casi, ciò dipende dalla gestione corretta dei caratteri con il bit elevato impostato correttamente e dalla gestione delle stringhe con caratteri a byte doppio. MFC è abilitato, per impostazione predefinita, per entrambi questi ambienti, in modo che sia possibile avere un singolo binario globale usato in tutte le piattaforme con solo risorse diverse collegate in fase di installazione.

Localizzazione delle risorse del componente

La localizzazione dell'applicazione o della DLL deve comportare semplicemente la sostituzione delle risorse con le risorse che corrispondono al linguaggio di destinazione. Per le proprie risorse, questa operazione è relativamente semplice: modificare le risorse nell'editor di risorse e compilare l'applicazione. Se il codice viene scritto correttamente, non ci saranno stringhe o testo che si desidera localizzare hardcoded nel codice sorgente C++. Tutte le localizzazioni possono essere eseguite semplicemente modificando le risorse. In effetti, è possibile implementare il componente in modo che tutti gli elementi che forniscono una versione localizzata non implicano nemmeno una compilazione del codice originale. Questo è più complesso, ma vale la pena e è il meccanismo scelto per MFC stesso. È anche possibile localizzare un'applicazione caricando il file EXE o DLL nell'editor di risorse e modificando direttamente le risorse. Anche se possibile, richiede la riplicazione di tali modifiche ogni volta che si compila una nuova versione dell'applicazione.

Un modo per evitare che si tratti di individuare tutte le risorse in una DLL separata, talvolta detta DLL satellite. Questa DLL viene quindi caricata dinamicamente in fase di esecuzione e le risorse vengono caricate da tale DLL anziché dal modulo principale con tutto il codice. MFC supporta direttamente questo approccio. Prendere in considerazione un'applicazione denominata MYAPP.EXE; potrebbe avere tutte le relative risorse che si trovano in una DLL denominata MYRES.DLL. Nell'applicazione InitInstance si eseguirà quanto segue per caricare tale DLL e fare in modo che MFC carichi le risorse da tale posizione:

CMyApp::InitInstance()
{
    // one of the first things in the init code
    HINSTANCE hInst = LoadLibrary("myres.dll");

    if (hInst != NULL)
        AfxSetResourceHandle(hInst);

    // other initialization code would follow
    // ...
}

Da allora, MFC caricherà le risorse da tale DLL anziché da myapp.exe. Tutte le risorse, tuttavia, devono essere presenti in tale DLL; MFC non eseguirà ricerche nell'istanza dell'applicazione nella ricerca di una determinata risorsa. Questa tecnica si applica altrettanto bene alle NORMALI DLL MFC e ai controlli OLE. Il programma di installazione copia la versione appropriata di MYRES.DLL a seconda delle impostazioni locali delle risorse desiderate dall'utente.

È relativamente semplice creare una DLL solo risorsa. Si crea un progetto DLL, aggiungere . File RC e aggiungere le risorse necessarie. Se si dispone di un progetto esistente che non usa questa tecnica, è possibile copiare le risorse da tale progetto. Dopo aver aggiunto il file di risorse al progetto, si è quasi pronti per compilare il progetto. L'unica operazione da eseguire è impostare le opzioni del linker per includere /NOENTRY. Questo indica al linker che la DLL non ha alcun punto di ingresso, poiché non ha codice, non ha alcun punto di ingresso.

Nota

L'editor di risorse in Visual C++ 4.0 e versioni successive supporta più linguaggi per . FILE RC. In questo modo è molto semplice gestire la localizzazione in un singolo progetto. Le risorse per ogni linguaggio sono controllate dalle direttive del preprocessore generate dall'editor di risorse.

Uso delle risorse localizzate MFC fornite

Qualsiasi applicazione MFC compilata riutilizza due elementi da MFC: codice e risorse. Ovvero, MFC include vari messaggi di errore, finestre di dialogo predefinite e altre risorse usate dalle classi MFC. Per localizzare completamente l'applicazione, è necessario localizzare non solo le risorse dell'applicazione, ma anche le risorse provenienti direttamente da MFC. MFC fornisce automaticamente diversi file di risorse del linguaggio, in modo che se la lingua di destinazione è una delle lingue già supportate da MFC, è sufficiente assicurarsi di usare tali risorse localizzate.

A partire da questo articolo, MFC supporta cinese, tedesco, spagnolo, francese, italiano, giapponese e coreano. I file che contengono queste versioni localizzate si trovano nelle directory MFC\INCLUDE\L.* (l'acronimo di "L" per le directory localizzate). I file tedeschi sono in MFC\INCLUDE\L.DEU, ad esempio. Per fare in modo che l'applicazione usi questi file RC invece dei file che si trovano in MFC\INCLUDE, aggiungi un oggetto /IC:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\MFC\INCLUDE\L.DEU alla riga di comando RC (questo è solo un esempio; devi sostituire le impostazioni locali preferite e la directory in cui è stato installato Visual C++).

Le istruzioni precedenti funzioneranno se l'applicazione si collega in modo statico con MFC. La maggior parte delle applicazioni si collega in modo dinamico (perché è l'impostazione predefinita AppWizard). In questo scenario, non solo il codice è collegato dinamicamente, quindi sono le risorse. Di conseguenza, è possibile localizzare le risorse nell'applicazione, ma le risorse di implementazione MFC verranno comunque caricate dalla MFC7x.DLL (o una versione successiva) o da MFC7xLOC.DLL, se esistente. È possibile avvicinare questo approccio da due angoli diversi.

L'approccio più complesso consiste nel fornire una delle DLL MFC7xLOC.DLL localizzate (ad esempio MFC7xDEU, per tedesco, MFC7xESP.DLL per spagnolo e così via) o una versione successiva e installare la MFC7xLOC.DLL appropriata nella directory di sistema quando l'utente installa l'applicazione. Questo può essere molto complesso sia per lo sviluppatore che per l'utente finale e di conseguenza non è consigliato. Per altre informazioni su questa tecnica e sulle sue avvertenze, vedere La nota tecnica 56 .

L'approccio più semplice e sicuro consiste nell'includere le risorse MFC localizzate nell'applicazione o nella DLL stessa (o nella DLL satellite se si usa una dll satellite). In questo modo si evitano i problemi di installazione corretta di MFC7xLOC.DLL. A tale scopo, seguire le stesse istruzioni per il caso statico indicato in precedenza (impostando correttamente la riga di comando RC in modo che punti alle risorse localizzate), ad eccezione del fatto che è necessario rimuovere anche la /D_AFXDLL definizione aggiunta da AppWizard. Quando /D_AFXDLL viene definito, AFXRES. H (e gli altri file MFC RC) non definiscono effettivamente alcuna risorsa (perché verranno invece estratti dalle DLL MFC).

Vedi anche

Note tecniche per numero
Note tecniche per categoria