gpt4 book ai didi

c++ - MinGW 中 GetBuffer 和 ReleaseBuffer 的 CString 方法有哪些替代方法?

转载 作者:太空宇宙 更新时间:2023-11-04 12:01:49 26 4
gpt4 key购买 nike

我找到了一个如何使用文件夹选择对话框的好例子:http://bobmoore.mvps.org/Win32/w32tip70.htm - 除了这个使用 CString 的示例之外,所有这些都有效,我不能在 MinGW 上使用它,因为它没有 stdafx.h。所以我必须使用 string 或 char*。

但这里的问题是这个例子使用了 CString 方法:GetBufferReleaseBuffer 我在字符串对象中没有。是否有任何其他方法将文件夹名称传递到文件夹选择窗口?

最佳答案

在处理 Windows API 和缓冲区时,可以使用 std::vector<BYTE>对于字节和 std::vector<TCHAR>对于字符串。 (如果定义了 UNICODE,则 TCHAR 定义为 wchar_t,否则定义为 char。这样代码对 UNICODE 和 ANSI 都有效)。在实例化 vector 时,给它一个大小来分配内存:

// can hold MAX_PATH TCHARs, including terminating '\0'
std::vector<TCHAR> buffer(MAX_PATH);

现在您可以将其视为几乎完全一样的 TCHAR 缓冲区,这些缓冲区是用 new 分配的或在堆栈上创建的。

BROWSEINFO bi = {0};
bi.pszDisplayName = &buffer[0];

然而,buffer.size()将始终返回完整的 vector 长度。如果您需要知道存储在 vector 中的字符串的长度,或者想使用与字符串相关的方法,你可以把它复制到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)使用它而不是 vector 。然而,size()将返回存储在字符串中的元素数,即使它们是 \0 .你必须 resize()第一次出现 \0 的字符串(这就是 CString::ReleaseBuffer() 所做的)当您将缓冲区分配给上例中的字符串时,它会自动完成。因为字符串不打算用作缓冲区(即使在技术上可行)我强烈建议使用 vector 方法。

关于c++ - MinGW 中 GetBuffer 和 ReleaseBuffer 的 CString 方法有哪些替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13809995/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com