1

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

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

4

2 回答 2

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() 所做的),当您将缓冲区分配给上例中的字符串时,这会自动完成。因为字符串并不打算用作缓冲区(即使它在技术上是可行的)我强烈建议使用向量方法。

于 2012-12-10T23:40:49.827 回答
0

您可以通过std::stringusing 对底层表示进行只读访问c_str(),但没有其他权限。

在您的情况下,我认为唯一的选择是使用一些老式的内存管理,然后将结果复制到std::string.

于 2012-12-10T23:23:33.207 回答