Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Woher weiß ich die Puffergröße für einen Aufruf?

  Alt 8. Nov 2016, 10:13
Ich habe eine WinApi-Routine die mir einen String gibt. Man übergibt hierbei immer einen Zeiger auf das erste Zeichen und wie groß der bereitgestellte Puffer ist. Die Puffergröße ist immer ein in/out (Delphi-Sprech: "var-Parameter").

Bislang kannte ich das so dass man erst einmal nil und eine Pufferlänge von 0 angibt, hierauf ein ERROR_INSUFFICIENT_BUFFER zurückbekommt und im var-Parameter drinsteht wie groß er den Puffer gerne hätte. Beispiel:

Delphi-Quellcode:
         GetTokenInformation(
            processToken,
            TTokenInformationClass.TokenUser,
            nil,
            0,
            bufferLength
         );
         if (GetLastError() <> ERROR_INSUFFICIENT_BUFFER) then RaiseLastOSError();

         SetLength(buffer, bufferLength);
         Win32Check( GetTokenInformation(
            processToken,
            TTokenInformationClass.TokenUser,
            buffer,
            bufferLength,
            bufferLength
         ) );

Ich habe nun ein Problem mit dem Aufruf QueryFullProcessImageName

Die Doku stimmt: Wenn der Puffer zu klein ist gibt der Aufruf False zurück und GetLastError() liefert ERROR_INSUFFICIENT_BUFFER . Aber der Ausgabeparameter wird nicht gesetzt. Ich weiß also immer noch nicht wie groß der Puffer sein muss.

Rein akademisch betrachtet: Wie muss man das richtig machen? Eine Schleife welche den Puffer so lange verdoppelt bis es irgendwann mal gepasst hat ist ja wirklich nicht schön...
  Mit Zitat antworten Zitat