3

SHGetSpecialFolderLocationAPI関数を使用しています。私のアプリケーションは「Unicode文字セットを使用する」に設定されています。

これが私がこれまでに持っているものです:

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 */

私が得ているエラーは次のとおりです。

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

誰かが助けることができますか?これを行うための適切なC++の方法は何ですか?

ありがとう!

4

5 に答える 5

6

2番目のパラメーターはoutc_strパラメーターであるため、 (であるconst)を直接渡すことはできません。おそらく、次のことを行うのが最も簡単です。

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

MAX_PATH現在260文字です。

于 2010-06-29T01:41:01.630 に答える
1

std::basic_string::c_str()メモリに定数バッファを返します。文字列を変更する場合は、次のようにする必要があります。

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

編集:これは、Cライブラリを恐れていない場合にも機能するはずです(ただし、上記の実装をテストしたようにテストしていません):

wstring wstrPath;
wstrPath.resize( MAX_PATH );
BOOL f = SHGetPathFromIDList(pidl, &wstrPath[0]);
wstrPath.resize(wcslen(wstrPath.c_str()));
于 2010-06-29T01:44:50.147 に答える
1

wstring::c_str()戻りconst wchar_t*読み取り専用です。LPWSTRはタイプではなく、constそのパラメーターはoutパラメーターです。自分でバッファを割り当てる必要があります。あなたはこのようなことをすることができます:

wchar_t buf[MAX_PATH] = {0};
BOOL f = SHGetPathFromIDList( pidl, buf );
wstring wstrPath = buf;
于 2010-06-29T01:45:41.853 に答える
1

書き込み可能な文字列データへのポインタとして、basic_stringの最初の配列項目のアドレスを取得できます。C ++標準は、このメモリブロックが連続している必要があることを保証していませんが、これはすべての既知の実装で安全です(std :: basic_stringを連続バッファとして使用するコードはどれほど悪いですか)。

std::wstring path(_MAX_PATH, L'\0');
BOOL f = SHGetPathFromIDList(pidl, &path[0]);
于 2010-06-29T06:48:25.863 に答える
0

wstring :: c_str()では、この方法で内部バッファーを変更することはできません。最も簡単な回避策は、wchar_tバッファーを自分で作成し、それをwstringコンストラクターに渡すことです。

wchar_t buf[MAX_PATH];
BOOL f = SHGetPathFromIDList(pidl, buf );
wstring wstrPath(buf);
于 2010-06-29T01:46:05.713 に答える