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/b0084kay

    Meinst 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...


  • Mod

    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.


  • Mod

    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.


Log in to reply