Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Pointer-Fragen/PItemIDList Pointer richtig freigeben (https://www.delphipraxis.net/30564-pointer-fragen-pitemidlist-pointer-richtig-freigeben.html)

sieppl 26. Sep 2004 15:19


Pointer-Fragen/PItemIDList Pointer richtig freigeben
 
Hallo,

sehe ich das richtig, wenn ich z.B. hier:

Delphi-Quellcode:
 while (PEnumList.Next(1, PIDL, NumIDs) <> S_FALSE)
immer die selbe PIDL benutze, dass bei einem 'Next' nur der Zeiger umgebogen wird
und ich demnach in jedem Next-Schritt die PIDL komplett 'disposen' muss?
Es reicht also nicht am Ende des while-Durchlaufes die PIDL freizugeben??

Variablen die Speicher allozieren liegen doch nicht auf im Stack und müssen
doch explizit freigegeben werden auch wenn sie innerhalb einer Funktion benutzt
werden, oder?

Grüße

Sebastian

d3g 26. Sep 2004 15:31

Re: Pointer-Fragen/PItemIDList Pointer richtig freigeben
 
Zitat:

Zitat von sieppl
dass bei einem 'Next' nur der Zeiger umgebogen wird
und ich demnach in jedem Next-Schritt die PIDL komplett 'disposen' muss?
Es reicht also nicht am Ende des while-Durchlaufes die PIDL freizugeben??

Richtig:
Zitat:

Zitat von MSDN Library
Retrieves the specified number of item identifiers in the enumeration sequence and advances the current position by the number of items retrieved.

[...]

The implementation must allocate these item identifiers using the Shell's allocator (retrieved by the SHGetMalloc function). The calling application is responsible for freeing the item identifiers using the Shell's allocator.

Zitat:

Zitat von sieppl
Variablen die Speicher allozieren liegen doch nicht auf im Stack und müssen
doch explizit freigegeben werden auch wenn sie innerhalb einer Funktion benutzt
werden, oder?

Auch richtig. Hier musst du allerdings nicht normal Speicher freigeben, sondern über IMalloc; der Speicher ist in diesem Falle noch nicht einmal auf dem Heap deiner Applikation (es sei denn, du hast das COM-Objekt aus einem Local Server).

sieppl 26. Sep 2004 15:46

Re: Pointer-Fragen/PItemIDList Pointer richtig freigeben
 
Zitat:

Zitat von d3g
Zitat:

Zitat von sieppl
dass bei einem 'Next' nur der Zeiger umgebogen wird
und ich demnach in jedem Next-Schritt die PIDL komplett 'disposen' muss?
Es reicht also nicht am Ende des while-Durchlaufes die PIDL freizugeben??

Richtig:
Zitat:

Zitat von MSDN Library
Retrieves the specified number of item identifiers in the enumeration sequence and advances the current position by the number of items retrieved.

[...]

The implementation must allocate these item identifiers using the Shell's allocator (retrieved by the SHGetMalloc function). The calling application is responsible for freeing the item identifiers using the Shell's allocator.


Danke für deine Bestätigung. Ich kann aus dem MSDN-Text aber nicht entnehmen, dass die die PIDL bei Next nur umgebogen wird. Ist klar, dass man sich um die Freigabe kümmern sollte, aber Next könnte genauso gut die Freigabe übernehmen, falls die PIDL <> nil ist. Das wollte ich nur klären..

Grüße

Sebastian


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz