【问题标题】:How to return a WCHAR ** parameter with std::vector?如何使用 std::vector 返回 WCHAR ** 参数?
【发布时间】:2019-11-26 04:18:55
【问题描述】:

我有一个将参数之一设置为传出的函数。我需要将它与 std::vector 一起使用。

这是将文件名返回到声明为 WCHAR ** 的 *sFilename 中的函数:

BOOL GetFilenameFromPathAndFilename(WCHAR *sFilenameAndPath, WCHAR **sFilename)
{
WCHAR *pDest;

// Count backwards to find the first backslash and take the right # of chars as the filename
pDest =wcsrchr(sFilenameAndPath,'\\');

if (pDest)
    {
    pDest++;
    DWORD dwLen = (DWORD) _tcslen(pDest) + 1;
    *sFilename = (WCHAR*)calloc(dwLen, sizeof(TCHAR));
    StringCchCopy(*sFilename,dwLen, pDest);
    }

return (pDest != 0);
}

如何将此函数与 std::vector 一起使用?使用 std::vector,调用不起作用:

std::vector<WCHAR> sFQDN(512);
//GetFQDomainNameEx(&sFQDN.data());  <-does not work

WCHAR *sFilenameIncoming = NULL;
GetFQDomainNameEx(&sFilenameIncoming);  <-this works

【问题讨论】:

    标签: c++ stdvector wchar


    【解决方案1】:

    接受双指针的 Windows 函数自己分配动态内存。 因此,您不能将它们与预分配的内存一起使用。你必须传递一个空指针,函数会初始化它,然后你必须根据文档释放它。

    传递一个向量,无论是否为空,都将不起作用,因为大多数 Windows 函数都不适用于 STL。

    现在,由于这似乎是您自己的函数而不是内部函数,您可以对其进行修改以接受向量:

    BOOL GetFilenameFromPathAndFilename(WCHAR *sFilenameAndPath, 
    std::vector<WCHAR>& sFileName)  {
     ....
    
    sFilename.resize(dwLen);
    StringCchCopy(sFilename.data(),dwLen, pDest);
    

    【讨论】:

    • 既然我在做分配,那如何重写函数声明来填充向量呢?
    • 我加了一个例子。
    • 如果我使用 std::vector 甚至 CString,我将如何使用 Windows API 函数?还是我应该使用 CString 以便它更兼容?
    • 您可以使用 std::string::c_str() 和 std::vector::data() 将原始缓冲区传递给 Windows API。
    【解决方案2】:

    使用此函数,您必须传递一个指针变量,例如:

    WCHAR *sFilenameIncoming;
    GetFQDomainNameEx(&sFilenameIncoming);  <-this works
    

    然后您可以将sFilenameIncoming 指向的数据复制到容器中,并释放分配空间。


    //GetFQDomainNameEx(&sFQDN.data()); <-does not work
    

    这不起作用,因为sFQDN.data() 是一个右值,所以你不能取它的地址。

    【讨论】:

      猜你喜欢
      • 2017-10-19
      • 1970-01-01
      • 2022-10-21
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多