windows - Hvilken HRESULT vender tilbage, når en buffer er for lille?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en funktion i en IUnknown -afledt COM-grænseflade:


HRESULT GetPassword( [in] long bufferLength, [out] WCHAR* buffer );


og kontrakten er, at implementeringen skal kontrollere, om bufferen er stor nok til at gemme den streng, der hentes. Hvis bufferen er stor nok kopieres strengen, og S\_OK returneres, ellers returnerer funktionen en fejlindikation.


Men jeg kan ikke finde en passende HRESULT værdi for det. E\_UNEXPECTED virker ret dumt og uhensigtsmæssigt. Det nærmeste jeg har fundet er DISP\_E\_BUFFERTOOSMALL, men det ser ud til at det er for IDispatch - afledte grænseflader kun.


Hvilken HRESULT skal jeg returnere, hvis en buffer er for lille?

Bedste reference


Du kan ikke returnere DISP\_E\_ * fejl, du implementerer ikke IDispatch. E\_INVALIDARG er korrekt her, det er endog uklart, hvilket ikke sker for ofte. Altid implementere ISupportErrorInfo for at generere gode fejlmeddelelser, ATL gør det trivielt med Error () -metoden.

Andre referencer 1


Som lame som det lyder, er E\_INVALIDARG sandsynligvis din bedste satsning, teknisk set. Der er ikke så mange standard HRESULT s, der er mere specifikke for argumenter. Der er også E\_POINTER, men det ville nok være mere forvirrende.


Jeg vil overveje at bruge DISP\_E\_BUFFERTOOSMALL. Dette vil være intuitivt for opkaldere, og den eneste risiko ville være, at de ikke genkender det, fordi det ikke er i standard sæt af generiske HRESULT værdier. Jeg synes, at det er en temmelig lille risiko dog for et ret lille problem :)

Andre referencer 2


Du bør ikke returnere en fejl. Du skal lykkes, udfylde bufferen med hvad du kan, og returnere gennem en anden parameter, hvor stor buffer der skal være.


Hvis du ikke gør det på denne måde, hvordan opdager opkalderen, hvor stor en buffer der skal tildeles? Du vil ikke have dem til at ringe gentagne gange, med gradvist større buffere, indtil de rammer en værdi, der er tilstrækkelig? Jeg ville hader at skulle bruge en sådan grænseflade!

Andre referencer 3


Hvis du stadig kan gøre noget ved det, bør du virkelig overveje at ændre grænsefladen for at returnere en BSTR i stedet for en WCHAR*. Det forenkler mange ting.


Nogle gange kan du, nogle gange kan du ikke.


Kredit skal gå til @tenfour for at foreslå dette. Da du ikke kan sende og videresende dine opstemninger til en anden, sender jeg mig som community wiki .