[WinAPI] Verständnisproblem / Wie ist Eure Meinung dazu:

05/12/2011 - 11:27 von Robert Hartmann | Report spam
Hallo zusammen,

Im folgenden Code-Schnipsel wird ein Puffer angelegt,
der dann spàter verwendet werden soll, um jeweils eine
Information aus dem Internet Explorer Cache (index.dat)
mit den Wininet-Funktionen (FindFirstUrlCacheEntry [1],
FindNextUrlCacheEntry [2]) auslesen zu können:

<Code-Schnippsel von [3]> (*) :

lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwEntrySize];
lpCacheEntry->dwStructSize = dwEntrySize;

</Code-Schnippsel>

Die komplette Struktur INTERNET_CACHE_ENTRY_INFO
ist bei [4] erklàrt.
Dort ist über das Attribut dwStructSize geschrieben (**) :

<Zitat>

dwStructSize
Size of this structure, in bytes. This value can be used to help
determine the version of the cache system.

</Zitat>

Wenn ich nun die Erklàrung (**) mit dem Einsatz (*) vergleiche,
dann stellt sich mir die Frage, ob ich davon ausgehen kann,
dass nach Verlassen von FindFirstUrlCacheEntry bzw
FindNextUrlCacheEntry im Attribut dwStructSize weiterhin
die Größe des Puffers drin stehen wird.

Beste Grüße,
Robert


[1] FindFirstUrlCacheEntry function
http://msdn.microsoft.com/en-us/lib...85%29.aspx

[2] FindNextUrlCacheEntry function
http://msdn.microsoft.com/en-us/lib...85%29.aspx

[3] Caching
http://msdn.microsoft.com/en-us/lib...85%29.aspx

[4] INTERNET_CACHE_ENTRY_INFO structure
http://msdn.microsoft.com/en-us/lib...85%29.aspx
 

Lesen sie die antworten

#1 Ulrich Eckhardt
05/12/2011 - 13:57 | Warnen spam
Am 05.12.2011 11:27, schrieb Robert Hartmann:
Im folgenden Code-Schnipsel wird ein Puffer angelegt, der dann spàter
verwendet werden soll, um jeweils eine Information aus dem Internet
Explorer Cache (index.dat) mit den Wininet-Funktionen
(FindFirstUrlCacheEntry [1], FindNextUrlCacheEntry [2]) auslesen zu
können:

<Code-Schnippsel von [3]> (*) :

lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwEntrySize];
lpCacheEntry->dwStructSize = dwEntrySize;

</Code-Schnippsel>



Also generell sollte jeder C++-Programmierer eingekerkert werden der
unreflektiert den "vector new operator" benutzt, meistens ist ein
std::vector das Mittel der Wahl, in diesem Fall u.U. auch malloc() bzw
realloc().


Die komplette Struktur INTERNET_CACHE_ENTRY_INFO ist bei [4]
erklàrt. Dort ist über das Attribut dwStructSize geschrieben (**) :

<Zitat>

dwStructSize
Size of this structure, in bytes. This value can be used to help
determine the version of the cache system.

</Zitat>



Die Idee ist dass neuere API-Versionen einfach neue Felder in der
Struktur anlegen koennen und die Implementierung von
FindFirstUrlCacheEntry() durch die Groesse erfaehrt welche API-Version
der aufrufende Code benutzt um dann u.U. nur einen beschraenkten Teil zu
benutzen.


Wenn ich nun die Erklàrung (**) mit dem Einsatz (*) vergleiche,
dann stellt sich mir die Frage, ob ich davon ausgehen kann,
dass nach Verlassen von FindFirstUrlCacheEntry bzw
FindNextUrlCacheEntry im Attribut dwStructSize weiterhin
die Größe des Puffers drin stehen wird.



Ich wuerde es vermuten aber nicht davon ausgehen. Die
benoetigte/benutzte Groesse des Puffers signalisiert FFUCE() ueber den
lpcbCacheEntryInfo-Parameter und der Returnwert. Wichtig ist hierbei die
Unterscheidung zwischen "buffer size" und "struct size". Die Struktur
muss eine Groesse entsprechend der API haben gegen die Du kompilierst,
also immer "sizeof *lpCacheEntry". Der Puffer hingegen, welcher auch
fuer dynamische Daten (die LPTSTRs) benutzt wird, muss groesser sein, so
wie es Dir FFUCE() vorgibt.

Uli

Ähnliche fragen