Frage

Ich bin mit der SHGetSpecialFolderLocation API-Funktion. Meine Anwendung ist auf „Verwenden Sie Unicode-Zeichensatz“.

Hier ist, was ich bisher:

int main ( int, char ** )
{
    LPITEMIDLIST pidl;
    HRESULT hr = SHGetSpecialFolderLocation(NULL, CSIDL_PERSONAL, &pidl);


    /* Confused at this point */
    wstring wstrPath;

    wstrPath.resize ( _MAX_PATH );
    BOOL f = SHGetPathFromIDList(pidl, wstrPath.c_str () );
    /* End confusion */

Der Fehler Ich erhalte ist:

error C2664: 'SHGetPathFromIDListW' : cannot convert parameter 2 from 'const wchar_t *' to 'LPWSTR'

Kann jemand helfen? Was ist die richtige C ++ Art und Weise, dies zu tun?

Danke!

War es hilfreich?

Lösung

Der zweite Parameter ist ein aus Parameter, so dass Sie nicht nur c_str passieren kann (was const ist) direkt. Es wäre wohl am einfachsten sein, genau das zu tun:

wchar_t wstrPath[MAX_PATH];
BOOL f = SHGetPathFromIDList(pidl, wstrPath);

MAX_PATH ist derzeit 260 Zeichen.

Andere Tipps

wstring::c_str() kehrt const wchar_t* und ist nur lesen . LPWSTR ist kein const Typ, und das Parameter ist ein out-Parameter. Sie müssen die Puffer selbst zuzuweisen. Man könnte so etwas tun:

wchar_t buf[MAX_PATH] = {0};
BOOL f = SHGetPathFromIDList( pidl, buf );
wstring wstrPath = buf;

Sie können in basic_string als Zeiger auf beschreibbare String-Daten-Adresse des ersten Array-Elements erhalten. Obwohl C ++ Standard garantiert nicht, dass dieser Speicherblock kontinuierlich sein muss dies bei allen bekannten Implementierungen ( wie schlecht Code mit std :: ist basic_string als zusammenhängende Puffer ).

std::wstring path(_MAX_PATH, L'\0');
BOOL f = SHGetPathFromIDList(pidl, &path[0]);

std::basic_string::c_str() kehrt ein Konstante Pufferspeicher zu ihm ist. Wenn Sie die Zeichenfolge ändern möchten, dann würden Sie haben, so etwas zu tun:

wstring wstrPath;
wstrPath.resize( MAX_PATH );
BOOL f = SHGetPathFromIDList(pidl, &wstrPath[0]);
wstrPath.erase(
   std::find(wstrPath.begin(), wstrPath.end(), L'\0'), wstrPath.end()
); //Throw away unused buffer space

EDIT: Die sollte auch funktionieren, wenn Sie von C-Bibliotheken nicht Angst haben (obwohl ich es nicht getestet habe, wie ich die Umsetzung oben getestet habe):

wstring wstrPath;
wstrPath.resize( MAX_PATH );
BOOL f = SHGetPathFromIDList(pidl, &wstrPath[0]);
wstrPath.resize(wcslen(wstrPath.c_str()));

wstring :: c_str () läßt Dich nicht seinen internen Puffer auf diese Weise modifizieren. Ihre einfachste Abhilfe ist, eine erstellen Wchar_t selbst puffern, und der Pass, dass an den wstring Konstruktor:

wchar_t buf[MAX_PATH];
BOOL f = SHGetPathFromIDList(pidl, buf );
wstring wstrPath(buf);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top