Sto cercando di ottenere la cartella desktop dell'utente in un'applicazione C++ (tramite una DLL) utilizzando SHGetSpecialFolderPath
:Ottieni la cartella Desktop dell'utente utilizzando l'API di Windows?
#define _WIN32_WINNT 0x0500
#define _WIN32_IE 0x0500
#define CSIDL_MYMUSIC 0x000D
#define CSIDL_MYVIDEO 0x000E
#include "dll.h"
#include <windows.h>
#include <shlobj.h>
#include <stdio.h>
TCHAR path[MAX_PATH];
export LPSTR desktop_directory()
{
if (SHGetSpecialFolderPath(HWND_DESKTOP, path, CSIDL_DESKTOP, FALSE)) {
return path;
}
}
Prima di tutto voglio restituire un caso altro. Ritorna "ERROR" ma il compilatore mi avvisa che sta provando a convertire un CHAR
in un LPSTR
. Con quello se là, sembra che la DLL potrebbe bloccarsi se non può ottenere la directory per qualche motivo.
Anche dalla documentazione MSDN, si dice "[SHGetSpecialFolderPath non è supportato.Utilizzare invece ShGetFolderPath.]", Quindi si accede a tale pagina e viene visualizzato "ShGetFolderPath: Deprecated. Ottiene il percorso di una cartella identificata da un Valore CSIDL. " Cosa dovrei usare invece?
Quindi:
- Voglio aggiungere un caso altrove torno una stringa che dice "ERROR"
- Voglio sapere se sto usando la funzione API non deprecato corretto che lavorerà per il moderno sistema operativo Windows fino a Windows XP.
EDIT
Ecco il codice aggiornato come richiesto,
#ifndef UNICODE
#define UNICODE
#endif
#ifndef _UNICODE
#define _UNICODE
#endif
#define _WIN32_WINNT 0x0500
#define _WIN32_IE 0x0500
#define CSIDL_MYMUSIC 0x000D
#define CSIDL_MYVIDEO 0x000E
#include "dll.h"
#include <windows.h>
#include <shlobj.h>
#include <stdio.h>
export LPCWSTR desktop_directory()
{
static wchar_t path[MAX_PATH+1];
if (SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, 0, path)) {
MessageBox(NULL, path, L"TEST", MB_OK); //test
return path;
} else {
return L"ERROR";
}
}
compilazione con MinGW utilizzando: g++ "src\dll\main.cpp" -D UNICODE -D _UNICODE -O3 -DNDEBUG -s -shared -o "output\main.dll"
ho bisogno di passare la stringa dalla DLL come UTF 8 utilizzando WideCharToMultiByte(CP_UTF8, ...)
, ma non sono sicuro di come farlo.
Attualmente consiglia [SHGetKnownFolderPath] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188.aspx), ma questo è stato aggiunto per la prima volta in Vista. Credo che tutti quelli che lavorano con XP siano ufficialmente deprecati. –