Я нашел хороший пример, как играть с диалогом выбора папки: http://bobmoore.mvps.org/Win32/w32tip70.htm — и все это работает, за исключением этого примера с использованием CString, который я не могу иметь на MinGW, потому что он не имеет stdafx.h
, Поэтому я должен использовать либо строку, либо символ *.
Но здесь проблема в том, что в этом примере используются методы CString: GetBuffer
а также ReleaseBuffer
которого у меня нет в строковом объекте. Есть ли другой способ передачи имени папки в окно выбора папки?
При работе с Windows API и буферами вы можете использовать std::vector<BYTE>
для байтов и std::vector<TCHAR>
для струнных. (TCHAR
определяется как wchar_t
если UNICODE определен и char
иначе. Таким образом, код работает как для UNICODE, так и для ANSI). При создании экземпляра вектора укажите его размер для выделения памяти:
// can hold MAX_PATH TCHARs, including terminating '\0'
std::vector<TCHAR> buffer(MAX_PATH);
Теперь вы можете обращаться почти как с буфером TCHAR, выделенным с новым или созданным в стеке.
BROWSEINFO bi = {0};
bi.pszDisplayName = &buffer[0];
Тем не мение, buffer.size()
всегда будет возвращать полную длину вектора. Если вам нужно знать длину строки, хранящейся в векторе, или вы хотите использовать методы, связанные со строками,
Вы можете скопировать его в std::string
:
if( LPITEMIDLIST pidl = SHBrowseForFolder(&bi) ) {
// this way it works for both UNICODE and ANSI:
std::basic_string<TCHAR> folderName(&buffer[0]);
if( SHGetPathFromIDList(pidl,&buffer[0]) ) {
MessageBox(0, &buffer[0], folderName.c_str(), MB_OK);
}
// TODO: free pidl with IMalloc* obtained through SHGetMalloc()
}
поскольку std::string
это просто еще один смежный контейнер, вы можете (ab) использовать его вместо вектора. Тем не мение, size()
вернет количество элементов, хранящихся в строке, даже если они \0
, Вы должны были бы resize()
строка до первого появления \0
(это то, что делает CString :: ReleaseBuffer ()), что выполняется автоматически при назначении буфера строке в приведенном выше примере. Поскольку строка не предназначена для использования в качестве буфера (даже если это технически возможно), я настоятельно рекомендую использовать векторный подход.
С std::string
у вас есть доступ только для чтения к базовому представлению с помощью c_str()
, но ничего больше.
В вашем случае, я думаю, что единственный вариант — использовать старомодное управление памятью, а затем скопировать результат в std::string
,