Sonntag, 10. Januar 2010

Probleme mit der Funktion SHGetStockIconInfo

Betreff Probleme mit der Funktion SHGetStockIconInfo
Von =?iso-8859-1?Q?George_L=F6wer?=
Datum 19.10.2009 16:19:41

Hi ihr,

ich bekomme bei der Folgenden Funktion immer nur Fehlerhafte Parameter und
kein Icon geliefert.
Kann mir vielleicht einer einen Tipp geben.

Private Type SHSTOCKICONINFO
cbSize As Long
hIcon As Long
iSysImageIndex As Long
iIcon As Long
szPath As String
End Type

Private Const SHGFI_ICON As Long = &H100
Private Const SHGFI_SMALLICON As Long = &H1

Private Declare Function SHGetStockIconInfo Lib "shell32.dll" (ByVal SIID As
Long, ByVal uFlags As Long, ByRef PSII As SHSTOCKICONINFO) As Long

Private Sub HoleIcon
Dim mysii As SHSTOCKICONINFO
Dim Result As Long
mysii.cbSize = Len(mysii)
Result = SHGetStockIconInfo(3, SHGFI_ICON Or SHGFI_SMALLICON, mysii)
End Sub


Gruß George Löwer




Betreff Re: Probleme mit der Funktion SHGetStockIconInfo
Von Timo Kunze
Datum 19.10.2009 21:34:43

George Löwer schrieb:
> ich bekomme bei der Folgenden Funktion immer nur Fehlerhafte Parameter
> und kein Icon geliefert.
Du liest das Icon ja auch nicht aus. Du speicherst lediglich den
Rückgabewert von SHGetStockIconInfo, den du aber auch nicht weiter
verwendest.

> Kann mir vielleicht einer einen Tipp geben.
Nutze statt 3 die entsprechende SIID_*-Konstante. Das würde schonmal die
Lesbarkeit des Codes erhöhen.
Außerdem solltest du dir die Definition von SHSTOCKICONINFO nochmal
anschauen. Im Original ist szPath nicht als LPSTR definiert, sondern als
WCHAR[MAX_PATH].

Timo
--
www.TimoSoft-Software.de - Unicode controls for VB6
"Those who sacrifice freedom for safety deserve neither."
"Demokratie ist per Definition unsicher. Ihr Schutz entsteht aus der
Überzeugung, dass die demokratischen Kräfte überwiegen und sich – auf
demokratischem Wege – durchsetzen."

Betreff Re: Probleme mit der Funktion SHGetStockIconInfo
Von =?utf-8?Q?George_L=C3=B6wer?=
Datum 20.10.2009 09:49:22

Hallo Timo,

bei mir im Programm benutze ich ja auch die Konstanten. Das nächste mal
werde ich es hier auch mit dem Konstanten arbeiten. :-)
Der Testquellcode den ich euch mitgegeben habe, war natürlich zu früh
abgeschnitten.
Nur wenn ich mysii.hicon teste ist diese immer 0.

Deswegen hatte ich ja angefangen mit Result den Fehler herauszufinden.

Und nun habe ich meiner Meinung nach alle Möglichenkeiten von szPath
ausprobiert, bekomme es aber nicht hin.

szpath(260) as string

szpath as string*260

szpath=space$(260)

Hast du vielleicht noch eine Idee wie ich das direkt machen muss?


Gruß George Löwer

"Timo Kunze" schrieb im Newsbeitrag
news:eNFh2MPUKHA.4360@TK2MSFTNGP04.phx.gbl...
> George Löwer schrieb:
>> ich bekomme bei der Folgenden Funktion immer nur Fehlerhafte Parameter
>> und kein Icon geliefert.
> Du liest das Icon ja auch nicht aus. Du speicherst lediglich den
> Rückgabewert von SHGetStockIconInfo, den du aber auch nicht weiter
> verwendest.
>
>> Kann mir vielleicht einer einen Tipp geben.
> Nutze statt 3 die entsprechende SIID_*-Konstante. Das würde schonmal die
> Lesbarkeit des Codes erhöhen.
> Außerdem solltest du dir die Definition von SHSTOCKICONINFO nochmal
> anschauen. Im Original ist szPath nicht als LPSTR definiert, sondern als
> WCHAR[MAX_PATH].
>
> Timo
> --
> www.TimoSoft-Software.de - Unicode controls for VB6
> "Those who sacrifice freedom for safety deserve neither."
> "Demokratie ist per Definition unsicher. Ihr Schutz entsteht aus der
> Überzeugung, dass die demokratischen Kräfte überwiegen und sich – auf
> demokratischem Wege – durchsetzen."

Betreff Re: Probleme mit der Funktion SHGetStockIconInfo
Von Timo Kunze
Datum 20.10.2009 12:15:22

George Löwer schrieb:
> szpath as string*260
Ich bin mir grad nicht sicher, ob ein so deklarierter String dann 260
Bytes belegt oder 520. Erwartet wird jedenfalls ein Puffer für 260
Unicode-Zeichen.
Probier mal szPath As String * 520. Wenn das nicht geht, dann nimm
szPath(519) As Byte. Das geht auf jeden Fall.

Timo
--
www.TimoSoft-Software.de - Unicode controls for VB6
"Those who sacrifice freedom for safety deserve neither."
"Demokratie ist per Definition unsicher. Ihr Schutz entsteht aus der
Überzeugung, dass die demokratischen Kräfte überwiegen und sich – auf
demokratischem Wege – durchsetzen."

Betreff Re: Probleme mit der Funktion SHGetStockIconInfo
Von "Thorsten Albers"
Datum 20.10.2009 13:27:42

Timo Kunze schrieb im Beitrag
...
> Ich bin mir grad nicht sicher, ob ein so deklarierter String dann 260
> Bytes belegt oder 520. Erwartet wird jedenfalls ein Puffer für 260
> Unicode-Zeichen.

520. Aber auch bei einem 'fixed length string' in einer Struktur würde VB
<= 6 dann intern die 'ANSI-Variante' der Struktur rüberschicken und später
interpretieren.

> Probier mal szPath As String * 520. Wenn das nicht geht, dann nimm
> szPath(519) As Byte. Das geht auf jeden Fall.

Wie gesagt, mit 'As String[...]' würde VB <= 6 immer in ANSI umwandeln bzw.
nach Rückkehr versuchen, von ANSI in Unicode zurückzuwandeln, was in einem
Zeichen-Kuddelmuddel enden würde (VB kann ja leider nicht beigebracht
werden, daß der String bereits von der Windows-API-Funktion mit einem
Unicode-String befüllt wurde).

'... As Byte' wäre hier die sinnvollste Lösung - dann sollte 'Len(mysii)'
auch das gleiche Ergebnis liefern wie 'sizeof(mysii)'.

--
Thorsten Albers

albers (a) uni-freiburg.de

Betreff Re: Probleme mit der Funktion SHGetStockIconInfo
Von =?iso-8859-1?Q?George_L=F6wer?=
Datum 20.10.2009 14:45:26

Hi ihr,

also mit szPath(519) As Byte funktioniert es tadellos.

Dank an Euch.

Gruß George Löwer

"Thorsten Albers" schrieb im Newsbeitrag
news:01ca5178$4c5bf220$ab01a8c0@thalk8s8x...
> Timo Kunze schrieb im Beitrag
> ...
>> Ich bin mir grad nicht sicher, ob ein so deklarierter String dann 260
>> Bytes belegt oder 520. Erwartet wird jedenfalls ein Puffer für 260
>> Unicode-Zeichen.
>
> 520. Aber auch bei einem 'fixed length string' in einer Struktur würde VB
> <= 6 dann intern die 'ANSI-Variante' der Struktur rüberschicken und später
> interpretieren.
>
>> Probier mal szPath As String * 520. Wenn das nicht geht, dann nimm
>> szPath(519) As Byte. Das geht auf jeden Fall.
>
> Wie gesagt, mit 'As String[...]' würde VB <= 6 immer in ANSI umwandeln
> bzw.
> nach Rückkehr versuchen, von ANSI in Unicode zurückzuwandeln, was in einem
> Zeichen-Kuddelmuddel enden würde (VB kann ja leider nicht beigebracht
> werden, daß der String bereits von der Windows-API-Funktion mit einem
> Unicode-String befüllt wurde).
>
> '... As Byte' wäre hier die sinnvollste Lösung - dann sollte 'Len(mysii)'
> auch das gleiche Ergebnis liefern wie 'sizeof(mysii)'.
>
> --
> Thorsten Albers
>
> albers (a) uni-freiburg.de
>

Keine Kommentare:

Kommentar veröffentlichen