我找到了一个很好的例子,如何使用文件夹选择对话框:http://bobmoore.mvps.org/Win32/w32tip70.htm - 除了这个使用CString的例子之外,所有这些都是有用的,我不能在MinGW上使用它,因为它没有{{1 }}。所以我必须使用字符串或char *。
但问题是这个例子使用CString方法:stdafx.h
和GetBuffer
我没有在字符串对象中。是否有其他方法将文件夹名称传递给文件夹选择窗口?
答案 0 :(得分:1)
在处理Windows API和缓冲区时,可以使用std::vector<BYTE>
表示字节,使用std::vector<TCHAR>
表示字符串。 (如果定义了UNICODE,则TCHAR
定义为wchar_t
,否则定义为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 :(得分:0)
使用std::string
,您可以使用c_str()
对基础表示进行只读访问,但不能使用其他内容。
在您的情况下,我认为唯一的选择是使用一些老式的内存管理,然后将结果复制到std::string
。