Pfad der Application data herausfinden
-
Ich habe ein #include "shlobj.h" gemacht.
-
Und das hast Du auch berücksichtigt:
_WIN32_IE >= 0x0500?
-
Bei mir ist _WIN32_IE = 0x0400.
Was nun?
-
Was wohl? Natürlich auf mindestens 0x0500 setzen umd diese Funktion zu verwenden.
Nach 437 Posts von Dir würde ich voraussetzen, dass Du gelernt hast die MSDN zu lesen und auch zumindestens zu verstehen, was die Requirements unten am Ende der Funktion bedeuten.
Siehe auch:
http://msdn2.microsoft.com/en-us/library/aa383745.aspx
-
hab ich ja versucht. Mir fehlt wohl die DLL shell32.dll. In welchen Ordner muss ich diese kopieren? Nee hab sie gefunden. Dann weiß ich nicht warum es immer noch nicht funktioniert. Habe _WIN32_IE_ auf 0x0500 gesetzt und den Header eingebunden. und die Funktion wird nicht vom Compiler erkannt.
-
Und wo hast Du das gemacht?
Hoffentlich in der stdafx.h bevor Du was anderes includest.Die shell32.dll gehört zum OS, die kann nicht fehlen!
Außerdem wird die erst benötigt wenn Dein Programm läuft...
-
Ah okay, jetzt wird die Funktion ausgeführt. Allerdings bekomme ich eine ASSERTION.
Mein Code:
/* open the default document */ /* get the path name of the default doc */ LPSTR pszPath = new char; SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, NULL, pszPath); szPath = pszPath; delete pszPath; szPath = szPath + "\\" + "SipromT" + "\\" + "SIPDAT.dat"; OnOpenDocument(szPath);und der file dbgheap in dem ASSERTION auftritt:
#ifdef CRTDLL else if ( __active_heap == __V5_HEAP ) { __old_sbh_region_t * preg; __old_sbh_page_t * ppage; __old_page_map_t * pmap; if ( (pmap = __old_sbh_find_block( pHdr(pUserData), &preg, &ppage )) != NULL ) { if ( *pmap ) return TRUE; else return FALSE; } else if ( (_osver & 0x8000) != 0 ) return TRUE; else return HeapValidate( _crtheap, 0, pHdr(pUserData) ); } #endif /* CRTDLL */ else // __active_heap == _SYSTEM_HEAP #endif /* _WIN64 */ { return HeapValidate( _crtheap, 0, pHdr(pUserData) ); } #else /* WINHEAP */ /* * Go through the heap regions and see if the pointer lies within one * of the regions of the local heap. * * Pointers from non-local heaps cannot be handled. For example, a * non-local pointer may come from a DLL that has the CRT linked-in. * */ for (i = 0; (base = _heap_regions[i]._regbase) != NULL && i < _HEAP_REGIONMAX; i++) { if (pUserData >= base && pUserData < (void *)(((char *)base)+_heap_regions[i]._currsize)) return TRUE; } return FALSE; #endif /* WINHEAP */Wo liegt denn mein Fehler?
-
Ja verstehe ich!
Was hast Du als Zeiger auf den Pfad überbegen, der normalerweise die Größe _MAX_PATH haben soll? Einen Puffer mit einem Byte... nett!
Noch neter: Du löscht den Speicher bevor er benutzt werden kann, auch nett!
Warum verwendest Du überhaupt new?Ich empfehle Dir dringends mal ein paar Basics zu C/C++ zu lernen.
Weiterhin: Hast Du Dir schon mal Gedanken um Rückgabewerte gemacht. Was passiert wenn der User Escape drückt?
TCHAR szPath[_MAX_PATH]; SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, NULL, szPath);
-
Danke, jetzt klappts!
Martin Richter schrieb:
Weiterhin: Hast Du Dir schon mal Gedanken um Rückgabewerte gemacht. Was passiert wenn der User Escape drückt?
In meinem Programm pasiert nichts wenn der Anwender Escape drückt.
Was sollte deiner Meinung nach passieren?
-
maRKus23 schrieb:
Martin Richter schrieb:
Weiterhin: Hast Du Dir schon mal Gedanken um Rückgabewerte gemacht. Was passiert wenn der User Escape drückt?
In meinem Programm pasiert nichts wenn der Anwender Escape drückt.
Was sollte deiner Meinung nach passieren?Vergiss es. Sorry! War mit meinen Gedanken bei der Pfadauswahl (SHBrowseForFolder) und nicht beim Laden der Standardpfade...