微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

混合使用c ++标准string和windows API

许多Windows APIs会将指针指向一个缓冲区和一个size元素,但是结果需要放入一个c ++string中。 (我在这里使用windows unicode,所以他们是wstrings)

这是一个例子:

#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"; }

我的问题确实是,这是编写getComputerName函数的最好方法,以便更好地适合C ++,还是有更好的方法? 我没有看到任何方式直接使用string,而不通过一个载体,除非我错过了什么? 它工作正常,但不知何故似乎有点难看。 问题不在于特定的API,而只是一个简单的例子。

Mercurial预先提交挂钩:如何挂钩到当前目录中的python程序?

Windows 7 – 右键单击​​Python的上下文级联菜单

在C#中我的程序注销部分错误,我可以得到一些帮助吗?

C#属性:飞行中的字体和颜色更改

在Windows核心文件调用fopen返回NULL指针

无法复制Java中的“我的文档”

获取Windows上给定path的可用磁盘空间

如何有效地检查,如果一个path是C#中的另一个path的孩子?

我怎样才能改变驱动器使用Python的操作系统?

尝试使用任务计划程序(Win7)注册任务时出错

在这种情况下,我不明白std :: vector是怎么给队伍带来的。 MAX_COmpuTERNAME_LENGTH不可能是非常大的,所以我简单地使用一个C风格的数组作为临时缓冲区。

看到这个答案的另一个问题。 它提供了一个StringBuffer类来处理这种情况非常干净。

我会说,因为你已经在更抽象的C ++接口背后抽象Windows API的任务,所以完全不要使用vector,也不要担心wstring的构造函数

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

这个函数将返回一个有效的wstring对象。

我会使用矢量。 为了回应你说你选了一个不好的例子,假装我们没有一个合理的恒定的字符串长度上限。 然后它不是那么容易:

#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定义non-const operator[]返回一个reference ,并返回data()[pos] 。 所以如果reference只是一个普通的wchar_t&那么通过引用就没有令人兴奋的写时复制行为的空间,而实际上字符串必须通过指针&buffer[0]来修改。 我认为。 这里的基本问题是标准允许实现更多的灵活性,而不是需要的。

尽管如此,为了避免复制一个字符串,这是一个很大的努力和评论,所以我从来没有觉得有必要避免一个中间数组/矢量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐