Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: WinAPI ::  Frage zu Doppelzeiger (IO-Funktion + GetQueuedCompletionStatus)  
Gehen Sie zu Seite 1, 2, 3, 4  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Hi
Unregistrierter




Beitrag Hi Unregistrierter 18:31:44 05.09.2010   Titel:   Frage zu Doppelzeiger (IO-Funktion + GetQueuedCompletionStatus)            Zitieren

Hi!

Irgendwie verschiebt sich der Pointer auf overlapped um 4, wenn ich ihn bekomme.

Info:
AcceptEx: http://msdn.microsoft.com/en-us/library/ms737524
GetQueuedCompletionStatus: http://msdn.microsoft.com/en-us/library/aa364986
(Man übergibt AcceptEx eine Adresse, und bekommt sie dann bei GetQueuedCompletionStatus wieder. Bei mir allerdings manchmal 4 Bytes verschoben)


C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
struct Context : public OVERLAPPED
{
// ...
};

// ...

Context* newContext = new Context;

// ...

AcceptEx(..., (OVERLAPPED*)newContext );
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
struct Context : public OVERLAPPED
{
// ...
};

// ...

Context* newContext = new Context;

// ...

AcceptEx(..., (OVERLAPPED*)newContext );
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
struct Context : public OVERLAPPED
{
// ...
};

// ...

Context* newContext = new Context;

// ...

AcceptEx(..., (OVERLAPPED*)newContext );


Ok gut, nun bekomme ich eine completion.

So gehts:

C/C++ Code:
OVERLAPPED* overlapped;

GetQueuedCompletionStatus(..., (OVERLAPPED**)&overlapped);

Context* context = (Context*)overlapped;

// Ok, context == newContext
C/C++ Code:
OVERLAPPED* overlapped;

GetQueuedCompletionStatus(..., (OVERLAPPED**)&overlapped);

Context* context = (Context*)overlapped;

// Ok, context == newContext
C/C++ Code:
OVERLAPPED* overlapped;

GetQueuedCompletionStatus(..., (OVERLAPPED**)&overlapped);

Context* context = (Context*)overlapped;

// Ok, context == newContext


Und so gehts nicht, weil dann context plötzlich 4 Bytes weiter zeigt, als der dem AcceptEx übergebene Context.

C/C++ Code:
Context* context

GetQueuedCompletionStatus(..., (OVERLAPPED**)&context);

// Nicht Ok, context == newContext + 4 (???)
C/C++ Code:
Context* context

GetQueuedCompletionStatus(..., (OVERLAPPED**)&context);

// Nicht Ok, context == newContext + 4 (???)
C/C++ Code:
Context* context

GetQueuedCompletionStatus(..., (OVERLAPPED**)&context);

// Nicht Ok, context == newContext + 4 (???)


Warum ist das so? Zeiger ist doch gleich Zeiger?

THX!
hiii
Unregistrierter




Beitrag hiii Unregistrierter 18:50:42 05.09.2010   Titel:              Zitieren

hast du virtuelle Methoden in deinem Context?
Hi
Unregistrierter




Beitrag Hi Unregistrierter 19:25:46 05.09.2010   Titel:              Zitieren

Danke für den Tip, habs grad mit nem Minimalbeispiel versucht. Liegt tatsächlich am virtuellen Destruktor von Context.

Bin aber viel zu eingerostet in C++, um mir erklären zu können, warum...
Hi
Unregistrierter




Beitrag Hi Unregistrierter 23:21:02 08.09.2010   Titel:              Zitieren

:confused:
Statischer Kasten
Unregistrierter




Beitrag Statischer Kasten Unregistrierter 00:21:20 09.09.2010   Titel:              Zitieren

Nimm static_cast statt C-Casts!
Hi
Unregistrierter




Beitrag Hi Unregistrierter 01:39:14 10.09.2010   Titel:              Zitieren

Bringt nix.
Hi
Unregistrierter




Beitrag Hi Unregistrierter 03:19:29 16.01.2011   Titel:              Zitieren

Need Input
theta
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 3645
Beitrag theta Mitglied 11:02:12 16.01.2011   Titel:              Zitieren

--- hier stand blödsinn ----

Zeiger ist nicht gleich Zeiger - Zeiger auf abgeleitete Klass können anders sein als Zeiger auf Basis Klassen - man denke da nur mal an die Mehrfachvererbung.


Zuletzt bearbeitet von theta am 11:11:17 16.01.2011, insgesamt 3-mal bearbeitet
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 12742
Beitrag hustbaer Mitglied 16:05:20 16.01.2011   Titel:              Zitieren

Ich verwende ähnlichen Code öfters, funktioniert wunderbar.
Funktioniert bloss nicht, wenn man nicht korrekt castet.
Wenn du z.B. von "Context" zu "void*" castest, und dann von "void*" zu "OVERLAPPED*", dann wird das nix werden.
Genau so wenn du über void* zurückcastest.
Oder sonst irgendwie Unsinn baust.

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
Hi
Unregistrierter




Beitrag Hi Unregistrierter 16:28:37 16.01.2011   Titel:              Zitieren

hustbaer schrieb:
Wenn du z.B. von "Context" zu "void*" castest, und dann von "void*" zu "OVERLAPPED*", dann wird das nix werden.
Genau so wenn du über void* zurückcastest.

Und wie sonst? Und warum geht das nicht?
C/C++ Forum :: WinAPI ::  Frage zu Doppelzeiger (IO-Funktion + GetQueuedCompletionStatus)  
Gehen Sie zu Seite 1, 2, 3, 4  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.