【问题标题】:what are alternatives for CString methods of GetBuffer and ReleaseBuffer in MinGW?MinGW 中 GetBuffer 和 ReleaseBuffer 的 CString 方法有哪些替代方法?
【发布时间】:2012-12-10 21:59:28
【问题描述】:

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

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

【问题讨论】:

  • 我认为stdafx.h 是用于预编译头文件,而不是 CString。
  • CString 是 MFC 的一部分,而不是标准库。您需要安装 Windows SDK(如果它仍然包含)来获取它。
  • 好的,如果 CString 没有问题,有没有替代方法?
  • @rsk82 std::stringstd::wstring
  • @CaptainObvlious:是的,但我的意思是方法,即GetBufferReleaseBuffer...它们在字符串对象中的对应物是什么?

标签: c++ winapi mingw cstring


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

【讨论】:

  • 如果签名很重要,仍然会推荐std::vector&lt;BYTE&gt;。 +1
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-03-25
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多