我找到了一个很好的例子,如何使用文件夹选择对话框: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
using 对底层表示进行只读访问c_str()
,但没有其他权限。
在您的情况下,我认为唯一的选择是使用一些老式的内存管理,然后将结果复制到std::string
.