Exception bei SHBindToParent
-
Hallo!
Bei dieser Zeile:int iError = SHBindToParent(SGlobales->vecOrdnerInhalt[i],IID_IShellFolder,(void**)SGlobales->vecShellFolderPointer[iLetztesElement],&pidlSingleLevel);taucht folgende Exception auf:
"Unbehandelte Ausnahme bei 0x7c9d7226 in Testanwendung.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xa093c37c"
SGlobales ist eine Instanz von dieser Struktur:
struct GLOBALES{ std::vector<LPITEMIDLIST> vecOrdnerInhalt; bool bOrdnerInhaltVeraltet; std::vector<IShellFolder*>vecShellFolderPointer; HDC hDC; };Die Elemente der Vektoren, auf die zugegriffen wird, existieren- und deshalb kann ich mir nicht erklären, warum ich diese Exception bekomme. Weiss da jemand weiter?? (oder werden evtl. noch mehr Informationen gebraucht??)
-
Also.. mir ist gerade eingefallen, dass es an dem IShellFolder Interface liegt, das ja auch übergeben werden muss. Das ist das Interface vom Desktop und um das zu kriegen verwende ich an anderer Stelle SHGetDesktopFolder. Da ist es so, dass SHGetDesktopFolder den Fehler 183- also ERROR_ALREADY_EXISTS zurückgibt- Klartext:
Cannot create a file when that file already exists
Das wird wohl die Lösung zu dem Problem sein- weiss denn da jemand, warum ShGetDesktopFolder diesen Fehler zurückgibt??
-
Versuche es doch einmal mit "normalen" Interfacezeigern (IShellFolder* bzw. IShellFolderPtr). ERROR_ALREADY_EXISTS ist eigentlich ziemlich ungewöhnlich, SHGetDesktopFolder sollte S_OK oder einen COM-Fehlercode zurückgeben.
-
sri schrieb:
Versuche es doch einmal mit "normalen" Interfacezeigern (IShellFolder* bzw. IShellFolderPtr). ERROR_ALREADY_EXISTS ist eigentlich ziemlich ungewöhnlich, SHGetDesktopFolder sollte S_OK oder einen COM-Fehlercode zurückgeben.
Na ja...also eigentlich gibt es NOERROR zurück- aber irgendwie kriege ich diese ERROR_ALREADY_EXISTS mit getlasterror(). Frag mich nicht, wie ich darauf gekommen bin mal getlasterror zu überprüfen- in der Dokumentation steht ja nichts darüber, dass man das benutzen sollte, wenn ein Fehler bei SHGetDesktopFolder autritt! Ich werde es mal mit normalen Zeigern versuchen- danke für den Tip!
EDIT: Also ich meine, dass ich überprüfe, ob er NOERROR zurückgibt oder nicht- vielleicht sollte ich da auch lieber auf S_OK überprüfen!!
-
S_OK ist 0 und NOERROR auch. Beide Werte sind daher gleich.

Return Value
Returns S_OK if successful, or a COM-defined error result otherwise.
Ich glaube nicht, dass SHGetDesktopFolder den Fehlercode mit SetLastError setzt. Dafür ist ja der Rückgabewert da.
Setze vor dem Aufruf von SHGetDesktopFolder mal den Fehlercode zurück:
SetLastError(ERROR_SUCCESS);Ich vermute nämlich eher, dass der GetLastError-Code von einem früheren Funktionsaufruf stammt.