C ++: using std :: wstring in API-Funktion
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!
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);