Какие есть альтернативы для методов CString в GetBuffer и ReleaseBuffer в MinGW?

Я нашел хороший пример, как играть с диалогом выбора папки: http://bobmoore.mvps.org/Win32/w32tip70.htm — и все это работает, за исключением этого примера с использованием CString, который я не могу иметь на MinGW, потому что он не имеет stdafx.h, Поэтому я должен использовать либо строку, либо символ *.

Но здесь проблема в том, что в этом примере используются методы CString: GetBuffer а также ReleaseBuffer которого у меня нет в строковом объекте. Есть ли другой способ передачи имени папки в окно выбора папки?

1

Решение

При работе с 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 ()), что выполняется автоматически при назначении буфера строке в приведенном выше примере. Поскольку строка не предназначена для использования в качестве буфера (даже если это технически возможно), я настоятельно рекомендую использовать векторный подход.

1

Другие решения

С std::string у вас есть доступ только для чтения к базовому представлению с помощью c_str(), но ничего больше.

В вашем случае, я думаю, что единственный вариант — использовать старомодное управление памятью, а затем скопировать результат в std::string,

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector