TN057: Lokalisierung von MFC-Komponenten

Hinweis

Der folgende technische Hinweis wurde seit dem ersten Erscheinen in der Onlinedokumentation nicht aktualisiert. Daher können einige Verfahren und Themen veraltet oder falsch sein. Um aktuelle Informationen zu erhalten, wird empfohlen, das gewünschte Thema im Index der Onlinedokumentation zu suchen.

In diesem Hinweis werden einige der Designs und Verfahren beschrieben, die Sie zum Lokalisieren Ihrer Komponente verwenden können, wenn es sich um eine Anwendung oder ein OLE-Steuerelement oder eine DLL handelt, die MFC verwendet.

Überblick

Es gibt wirklich zwei Probleme, die beim Lokalisieren einer Komponente behoben werden müssen, die MFC verwendet. Zunächst müssen Sie Ihre eigenen Ressourcen lokalisieren – Zeichenfolgen, Dialogfelder und andere Ressourcen, die für Ihre Komponente spezifisch sind. Die meisten Komponenten, die mit MFC erstellt wurden, enthalten und verwenden auch eine Reihe von Ressourcen, die von MFC definiert werden. Sie müssen auch lokalisierte MFC-Ressourcen bereitstellen. Glücklicherweise werden bereits mehrere Sprachen von MFC selbst bereitgestellt.

Darüber hinaus sollte Ihre Komponente für die Ausführung in der Zielumgebung (Europäische oder DBCS-fähige Umgebung) vorbereitet sein. Dies hängt größtenteils davon ab, dass die Anwendung Zeichen mit dem hohen Bit-Satz richtig behandelt und Zeichenfolgen mit Doppelbytezeichen behandelt. MFC ist standardmäßig für beide Umgebungen aktiviert, sodass es möglich ist, eine einzelne weltweite Binärdatei zu haben, die auf allen Plattformen mit nur unterschiedlichen Ressourcen verwendet wird, die zur Einrichtungszeit angeschlossen sind.

Lokalisieren der Ressourcen Ihrer Komponente

Das Lokalisieren Ihrer Anwendung oder DLL sollte einfach das Ersetzen der Ressourcen durch Ressourcen umfassen, die der Zielsprache entsprechen. Für Ihre eigenen Ressourcen ist dies relativ einfach: Bearbeiten Sie die Ressourcen im Ressourcen-Editor, und erstellen Sie Ihre Anwendung. Wenn Ihr Code ordnungsgemäß geschrieben ist, gibt es keine Zeichenfolgen oder Text, die Sie hartcodiert in Ihren C++-Quellcode lokalisieren möchten. Die gesamte Lokalisierung kann durch einfaches Ändern von Ressourcen erfolgen. Tatsächlich können Sie Ihre Komponente so implementieren, dass alle Bereitstellungen einer lokalisierten Version nicht einmal einen Build des ursprünglichen Codes beinhalten. Dies ist komplexer, lohnt sich aber und ist der Mechanismus, der für MFC selbst gewählt wird. Es ist auch möglich, eine Anwendung zu lokalisieren, indem die EXE- oder DLL-Datei in den Ressourcen-Editor geladen und die Ressourcen direkt bearbeitet werden. Es ist zwar möglich, diese Änderungen bei jedem Erstellen einer neuen Version Ihrer Anwendung erneut zu erstellen.

Eine Möglichkeit, dies zu vermeiden, besteht darin, alle Ressourcen in einer separaten DLL zu finden, manchmal als Satelliten-DLL bezeichnet. Diese DLL wird dann dynamisch zur Laufzeit geladen, und die Ressourcen werden von dieser DLL anstelle des moduls Standard mit dem gesamten Code geladen. MFC unterstützt diesen Ansatz direkt. Betrachten Sie eine Anwendung namens MYAPP.EXE; es könnte alle seine Ressourcen in einer DLL namens MYRES.DLL haben. In der Anwendung InitInstance würde folgendes ausgeführt, um diese DLL zu laden und dazu zu führen, dass MFC Ressourcen von diesem Speicherort lädt:

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
    // ...
}

Von nun an lädt MFC Ressourcen aus dieser DLL anstelle von myapp.exe. Alle Ressourcen müssen jedoch in dieser DLL vorhanden sein; MFC durchsucht die Instanz der Anwendung nicht bei der Suche nach einer bestimmten Ressource. Diese Technik gilt gleichermaßen gut für reguläre MFC-DLLs sowie OLE-Steuerelemente. Ihr Setupprogramm würde die entsprechende Version von MYRES.DLL kopieren, je nachdem, welches Ressourcengebietsschema der Benutzer verwenden möchte.

Es ist relativ einfach, eine Nur-DLL-Ressource zu erstellen. Sie erstellen ein DLL-Projekt, fügen Sie Ihr . RC-Datei hinzufügen und die erforderlichen Ressourcen hinzufügen. Wenn Sie über ein vorhandenes Projekt verfügen, das diese Technik nicht verwendet, können Sie die Ressourcen aus diesem Projekt kopieren. Nachdem Sie die Ressourcendatei zum Projekt hinzugefügt haben, sind Sie fast bereit, das Projekt zu erstellen. Das einzige, was Sie tun müssen, ist das Festlegen der Linkeroptionen, um /NOENTRY einzuschließen. Dadurch wird dem Linker mitgeteilt, dass die DLL keinen Einstiegspunkt hat – da sie keinen Code hat, hat sie keinen Einstiegspunkt.

Hinweis

Der Ressourcen-Editor in Visual C++ 4.0 und höher unterstützt mehrere Sprachen pro . RC-Datei. Dies kann es sehr einfach machen, Ihre Lokalisierung in einem einzigen Projekt zu verwalten. Die Ressourcen für jede Sprache werden durch Präprozessordirektiven gesteuert, die vom Ressourcen-Editor generiert werden.

Verwenden der bereitgestellten lokalisierten MFC-Ressourcen

Jede MFC-Anwendung, die Sie erstellen, verwendet zwei Dinge aus MFC: Code und Ressourcen. Das heißt, MFC verfügt über verschiedene Fehlermeldungen, integrierte Dialogfelder und andere Ressourcen, die von den MFC-Klassen verwendet werden. Um Ihre Anwendung vollständig zu lokalisieren, müssen Sie nicht nur die Ressourcen Ihrer Anwendung lokalisieren, sondern auch die Ressourcen, die direkt aus MFC stammen. MFC stellt eine Reihe von verschiedenen Sprachressourcendateien automatisch bereit. Wenn die Sprache, die Sie als Ziel verwenden möchten, eine der Sprachen ist, die MFC bereits unterstützt, müssen Sie lediglich sicherstellen, dass Sie diese lokalisierten Ressourcen verwenden.

Ab diesem Schreiben unterstützt MFC Chinesisch, Deutsch, Spanisch, Französisch, Italienisch, Japanisch und Koreanisch. Die Dateien, die diese lokalisierten Versionen enthalten, befinden sich in den Verzeichnissen MFC\INCLUDE\L.* (das "L" steht für lokalisierte Verzeichnisse). Die deutschen Dateien befinden sich beispielsweise in MFC\INCLUDE\L.DEU. Damit Ihre Anwendung diese RC-Dateien anstelle der Dateien in MFC\INCLUDE verwenden kann, fügen Sie ihrer RC-Befehlszeile eine hinzu /IC:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\MFC\INCLUDE\L.DEU (dies ist nur ein Beispiel; Sie müssen ihr Gebietsschema sowie das Verzeichnis ersetzen, in dem Sie Visual C++ installiert haben).

Die obigen Anweisungen funktionieren, wenn Ihre Anwendung statisch mit MFC verknüpft. Die meisten Anwendungen verknüpfen dynamisch (da dies der Standard für AppWizard ist). In diesem Szenario ist nicht nur der Code dynamisch verknüpft – also die Ressourcen. Daher können Sie Ihre Ressourcen in Ihrer Anwendung lokalisieren, aber die MFC-Implementierungsressourcen werden weiterhin aus der MFC7x.DLL (oder einer höheren Version) oder von MFC7xLOC.DLL geladen, falls vorhanden. Sie können dies aus zwei verschiedenen Blickwinkeln nähern.

Der komplexere Ansatz besteht darin, eine der lokalisierten MFC7xLOC.DLLs (z. B. MFC7xDEU, für Deutsch, MFC7xESP.DLL für Spanisch usw.) oder eine höhere Version zu versenden und die entsprechende MFC7xLOC.DLL im Systemverzeichnis zu installieren, wenn der Benutzer Ihre Anwendung installiert. Dies kann sowohl für den Entwickler als auch für den Endbenutzer sehr komplex sein und daher nicht empfohlen werden. Weitere Informationen zu dieser Technik und den zugehörigen Einschränkungen finden Sie in technischem Hinweis 56 .

Der einfachste und sicherste Ansatz besteht darin, die lokalisierten MFC-Ressourcen in Ihre Anwendung oder DLL selbst einzuschließen (oder die Satelliten-DLL, wenn Sie eine verwenden). Dadurch werden die Probleme bei der ordnungsgemäßen Installation von MFC7xLOC.DLL vermieden. Dazu befolgen Sie die gleichen Anweisungen für den oben angegebenen statischen Fall (das Festlegen der RC-Befehlszeile ordnungsgemäß auf die lokalisierten Ressourcen), mit der Ausnahme, dass Sie auch die /D_AFXDLL Definition entfernen müssen, die von AppWizard hinzugefügt wurde. Wann /D_AFXDLL definiert, AFXRES. H (und die anderen MFC RC-Dateien) definieren keine Ressourcen (da sie stattdessen aus den MFC-DLLs abgerufen werden).

Siehe auch

Technische Hinweise – nach Nummern geordnet
Technische Hinweise – nach Kategorien geordnet