Windows 64 Bit Entwicklung
-
Hallo!
Ich habe über den Konfigurations Manager in VS2008 mir die Konfiguration für x64 Systeme erzeugen lassen (Kopie von Win32).
Nun habe ich eine Frage bzgl. der Definitionen. Es ist weiterhin "nur" WIN32 in den Präprozessordefinitionen definiert.
Muss ich manuell WIN64 oder _WIN64 o.ä. hinzufügen oder brauche ich das nicht?
Wie unterscheide ich nun 32 und 64 Bit Version im Code?
#ifdef WIN32 #elif WIN64 #endif
Zudem wollte ich innerhalb der Resourcendateien zwischen 32 und 64 Bit Version unterscheiden. Ich möchte nämlich AFX_IDS_APP_TITLE anpassen. Wie gehe ich hier am besten vor?
Gruß
HaJo
-
Du musst nichts besonderes beachten.
Wenn nicht unbedingt nötig, solltest Du es im Code nicht unterscheiden... warum auch?
Wenn Du es für nötig erachtest, kannst Du es mittels _M_IX86 oder _M_IA64 unterscheiden. Siehe:
http://msdn.microsoft.com/en-us/library/b0084kay
-
Jochen Kalmbach schrieb:
Du musst nichts besonderes beachten.
Wenn nicht unbedingt nötig, solltest Du es im Code nicht unterscheiden... warum auch?Wie gesagt, ich würde den Resource String "AFX_IDS_APP_TITLE" bei der 64 Bit Version gerne etwas abändern. Das würde ich gerne per Präprozessor Anweisung in der Resource-Datei machen, oder wäre das schlechter Stil?
Ansonsten würde ich eben nur den Titel des Hauptfensters ändern, aber auch das gerne per Präprozessor.
Jochen Kalmbach schrieb:
Wenn Du es für nötig erachtest, kannst Du es mittels _M_IX86 oder _M_IA64 unterscheiden. Siehe:
http://msdn.microsoft.com/en-us/library/b0084kayMeinst Du vielleicht eher _WIN64? _M_IA64 ist doch für Itanium Prozessoren, wäre da nicht eher _M_X64?
Eine Frage beantwortet die MSDN irgendwie nicht so ganz. Die Prozessor Makros definieren doch eher den Prozessortyp auf denen die Applikation komipilert wird und _WIN64 z.B. ist definiert bei Applikationen, die für 64 Bit Windowssysteme - also selbst auch 64 Bit - sind. Oder verstehe ich etwas falsch?
-
HaJo schrieb:
Meinst Du vielleicht eher _WIN64? _M_IA64 ist doch für Itanium Prozessoren, wäre da nicht eher _M_X64?
_M_X64 wäre für x64.
HaJo schrieb:
Eine Frage beantwortet die MSDN irgendwie nicht so ganz. Die Prozessor Makros definieren doch eher den Prozessortyp auf denen die Applikation komipilert wird und _WIN64 z.B. ist definiert bei Applikationen, die für 64 Bit Windowssysteme - also selbst auch 64 Bit - sind. Oder verstehe ich etwas falsch?
Ich hätte das auch so verstanden...
-
HaJo. schrieb:
Wie gesagt, ich würde den Resource String "AFX_IDS_APP_TITLE" bei der 64 Bit Version gerne etwas abändern. Das würde ich gerne per Präprozessor Anweisung in der Resource-Datei machen, oder wäre das schlechter Stil?
Ansonsten würde ich eben nur den Titel des Hauptfensters ändern, aber auch das gerne per Präprozessor.
1. Variante: Du machst das im Ressourcen Editor. dort kannst Du eine weitere String Tabelle erzeugen und dieser eine Bedingung mitgeben (Condition). Du hast dann drei: Eine mit allen allgemeinen Strings ohne Bedingung. Eine mit der 64bit Bedignung, eine mit der 32bit Bedignung.
2. Variante: Der String von AFX_IDS_APP_TITLE wird einfach nach CWinApp::m_pszAppName geladen.
Was spricht dagegen Deinen eigenen Titel im Code zu setzen wenn CWinApp:InitInstance läuft?// Free old name free(const_cast<LPTSTR>(m_pszAppName)); // Save new name (human readable title) m_pszAppName = _tcsdup(myTitle);
-
_WIN64 ist immer definiert, wenn Anwendungen für 64-bit Systeme kompiliert werden. Allerdings gilt das nicht für den Ressourcen-Compiler.
Man kann also mit
CString strTest; #ifdef _WIN64 strTest.LoadString(IDS_TITLE_X64); #else strTest.LoadString(IDS_TITLE_X32); #endif
Strings entsprechend für 64-bit oder 32-bit Systeme laden. Ist allerdings nicht zukunftskompatibel, da 128-bit Systeme nicht beachtet werden.
Bei allgemeinen Strings, die wie AFX_IDS_APP_TITLE auch in der MFC verwendet werden, kann man die .rc2-Datei verwenden:
#ifdef _WIN64 STRINGTABLE PRELOAD DISCARDABLE BEGIN AFX_IDS_APP_TITLE "Anwendungsname (x64)" END #else STRINGTABLE PRELOAD DISCARDABLE BEGIN AFX_IDS_APP_TITLE "Anwendungsname" END #endif
Da der Ressourcen-Compiler aber _WIN64 nicht kennt, muss man es noch bei den Präprozessor-Definitionen für Ressourcen eintragen. Allerdings natürlich nur bei den 64-bit Konfigurationen.
-
Martin Richter schrieb:
1. Variante: Du machst das im Ressourcen Editor. dort kannst Du eine weitere String Tabelle erzeugen und dieser eine Bedingung mitgeben (Condition). Du hast dann drei: Eine mit allen allgemeinen Strings ohne Bedingung. Eine mit der 64bit Bedignung, eine mit der 32bit Bedignung.
Es wäre aber doch eher Variante 2 üblich. Also die Resourcen-Datei so zu belassen, richtig?
Wird m_pszAppName eigentlich auch für den AfxMessageBox Titel genutzt, oder wird der String aus der Resourcen-Datei geladen?Martin Richter schrieb:
2. Variante: Der String von AFX_IDS_APP_TITLE wird einfach nach CWinApp::m_pszAppName geladen.
Was spricht dagegen Deinen eigenen Titel im Code zu setzen wenn CWinApp:InitInstance läuft?Rufe ich dann in ExitInstance
free(const_cast<LPTSTR>(m_pszAppName));
auf Grund von _tcsdup auf oder erledigt das die MFC für mich?
-
sri schrieb:
Da der Ressourcen-Compiler aber _WIN64 nicht kennt, muss man es noch bei den Präprozessor-Definitionen für Ressourcen eintragen. Allerdings natürlich nur bei den 64-bit Konfigurationen.
Danke für den Hinweis.
-
HaJo. schrieb:
Es wäre aber doch eher Variante 2 üblich. Also die Resourcen-Datei so zu belassen, richtig?
Wird m_pszAppName eigentlich auch für den AfxMessageBox Titel genutzt, oder wird der String aus der Resourcen-Datei geladen?Es wird CWinApp::HaJo. verwendet.
Duhast doch den Sourcecode. Ein Blick in CWinApp:DoMessageBox genügt.
HaJo. schrieb:
Rufe ich dann in ExitInstance
free(const_cast<LPTSTR>(m_pszAppName));
auf Grund von _tcsdup auf oder erledigt das die MFC für mich?
Auch die Frage ist doch logisch oder?
m_pszAppName wurde ja auch zuvor schon allokiert. Wir machen ja kein extra-Spielchen undhaben den alten Zeiger ja auch zuvor freigegeben.Die Antwort lautet: Ja die MFC entsorgt diesen Zeiger!
-
Ok, vielen Dank für die Hilfe.