JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=ae293f57ff03dee26d27ea6fe420d78dMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Kompatiebler Code zwischen Win32 und Win64

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 30.08.2005, 10:46    Titel: Kompatiebler Code zwischen Win32 und Win64 Antworten mit Zitat

Ich hab mal wieder eine spezielle Frage an unsere anboluten Profis:

Wie muss ich den Code abändern, damit er logisch Korrekt bleibt und die Warnung nicht nur unterdrückt wird?

Ich habe eine Klasse:
CPP:
class D3DWindow
{
private:
  ...
  static LRESULT CALLBACK MainWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
  ...
public:
  ...
  void Init();
  ...
};

In dieser Klasse verwalte ich mein Programmhauptfenster - eigendlich nix besonderes. Allerdings benötige ich in der Callbackroutine hin und wieder die Instanz der Klasse *2), also übergebe ich der Funktion CreateWindowEx den this-Pointer (Init):
CPP:
D3DWindow::Init()
{
  ...
  hWnd=CreateWindowEx(... , this);
  ...
}

Während des Aufrufs von CreateWindowEx wird ja die Nachricht WM_CREATE gesendet, welche als LPARAM-Parameter den in CreateWindowEx übergebenen Pointer enthält. Zur Zeit verwende ich Ihn so:
CPP:
LRESULT CALLBACK D3DWindow::MainWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  switch(Msg) {
    case WM_CREATE:
      {
        D3DWindow **D3DWnd=(D3DWindow **)lParam; // Alles OK
        SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)(*D3DWnd)); // *1)
      }
      return 0;
    case ...
  }
}

*1) An dieser Stelle tritt die Warnung warning C4244: 'Argument': Konvertierung von 'LONG_PTR' in 'LONG', möglicher Datenverlust auf, welcher durch die Win64-Kompatiblitätsprüfung entsteht. Da ich aber funktionalen Code schreiben möchte, der auch morgen noch gültig ist, soll diese Warnung nich einfach nur durch deaktivieren der Prüfung unterdrückt werden. Wie muss ich diese Zeile passend ändern, damit der Code sowohl in einer 32-Bit-Umgebung als auch in einer 64-Bit-Umgebung gültig ist?

*2) Mit GetWindowLongPtr() lese ich die Instanz wieder aus, wenn benötigt.

PS.: Bringen mir die neuen Cast-Funktionen dabei etwas?
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 30.08.2005, 14:40    Titel: Antworten mit Zitat

Die Warnung wirst du gar nicht wegbekommen, solange du den (LONG_PTR) Cast machst:

CPP:
long L = 0;

SetWindowLongPtr(0, GWLP_USERDATA, L);


gibt keine Warnung. Die Warnung kommt auch nur, da LONG_PTR als

CPP:
#if defined(_WIN64)
    typedef __int64 LONG_PTR, *PLONG_PTR;
    typedef unsigned __int64 ULONG_PTR, *PULONG_PTR;
#else
    typedef _W64 long LONG_PTR, *PLONG_PTR;
    typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;
#endif


definiert ist. Das _W64 sorgt dafür, dass der Compiler Warnungen ausgibt, der ist scheinbar von alleine gar nicht so schlau und erkennt 32/64 Bit portability issues. Nur wg. dem _W64 kommt die Warnung.

C.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 30.08.2005, 15:01    Titel: Antworten mit Zitat

Ist der Code oben denn so portabel?
Ich kann das schlecht testen - da ich kein 64-Bit-System zur Verfügung habe.

(Werde wohl doch diesen Check ausschalten)

AFE-GmdG
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum