|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 30.08.2005, 10:46 Titel: Kompatiebler Code zwischen Win32 und Win64 |
|
|
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 |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 30.08.2005, 14:40 Titel: |
|
|
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 |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 30.08.2005, 15:01 Titel: |
|
|
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 |
|
|
|
|
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
|