代码之家  ›  专栏  ›  技术社区  ›  jcoder

混合C++标准字符串和Windows API

  •  3
  • jcoder  · 技术社区  · 16 年前

    许多Windows API都使用一个指向缓冲区和大小元素的指针,但是结果需要进入C++字符串。我在这里使用的是windows unicode,所以它们是

    举个例子:-

    #include <iostream>
    #include <string>
    #include <vector>
    #include <windows.h>
    
    using namespace std;
    
    // This is the method I'm interested in improving ...
    wstring getComputerName()
    {
        vector<wchar_t> buffer;
        buffer.resize(MAX_COMPUTERNAME_LENGTH+1);
        DWORD size = MAX_COMPUTERNAME_LENGTH;
    
        GetComputerNameW(&buffer[0], &size);
    
        return wstring(&buffer[0], size);
    }
    
    int main()
    {
        wcout << getComputerName() << "\n";
    }
    

    4 回复  |  直到 16 年前
        1
  •  7
  •   anon anon    16 年前

    在这种情况下,我看不出std::vector给聚会带来了什么。MAX\u COMPUTERNAME\u长度不太可能很大,所以我只需要使用一个C样式的数组作为临时缓冲区。

        2
  •  3
  •   Community Mohan Dere    9 年前

    看到了吗 this answer 另一个问题。它为一个StringBuffer类提供了源代码,该类可以非常干净地处理这种情况。

        3
  •  2
  •   Armen Michaeli    16 年前

    wstring getComputerName()
    {
        wchar_t name[MAX_COMPUTERNAME_LENGTH + 1];
        DWORD size = MAX_COMPUTERNAME_LENGTH;
    
        GetComputerNameW(name, &size);
    
        return name;
    }
    

    此函数将返回有效的wstring对象。

        4
  •  1
  •   Steve Jessop    16 年前

    我会用向量。为了回应你说你选了一个不好的例子,假装我们没有一个合理的字符串长度的常数上限。那就不那么容易了:

    #include <string>
    #include <vector>
    #include <windows.h>
    
    using std::wstring;
    using std::vector;
    
    wstring getComputerName()
    {
        DWORD size = 1; // or a bigger number if you like
        vector<wchar_t> buffer(size);
        while ((GetComputerNameW(&buffer[0], &size) == 0))
        {
            if (GetLastError() != ERROR_BUFFER_OVERFLOW) aargh(); // handle error
            buffer.resize(++size);
        };
        return wstring(&buffer[0], size);
    }
    

    在实践中,你可能不需要写一个字符串,但我不完全确定。你当然需要通过你的行动来提供额外的保证 std::wstring ,超出了标准中的内容,但我希望MSVC的字符串可能还可以。

    我想如果 wstring::reference wchar_t& 那你就分类了。21.3.4定义了非常量 operator[] 返回一个 reference ,并且它返回 data()[pos] 参考 只是一个普通的 wchar& 那么就没有通过引用实现令人兴奋的写时复制行为的范围,而且字符串实际上必须可以通过指针进行修改 &buffer[0] . 我想。这里的基本问题是,标准允许实现比实际需要更大的灵活性。

    不过,为了避免复制字符串,这需要大量的工作和注释,所以我从未觉得有必要避免使用中间数组/向量。