如何使用std :: vector返回WCHAR **参数?

时间:2019-07-17 10:42:57

标签: c++ stdvector wchar

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

这是将文件名返回* sFilename的函数,该文件被声明为WCHAR **:

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

2 个答案:

答案 0 :(得分:2)

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

传递矢量(无论是否为空)将不起作用,因为大多数Windows功能均不适用于STL。

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

BOOL GetFilenameFromPathAndFilename(WCHAR *sFilenameAndPath, 
std::vector<WCHAR>& sFileName)  {
 ....

sFilename.resize(dwLen);
StringCchCopy(sFilename.data(),dwLen, pDest);

答案 1 :(得分:2)

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

n

然后您可以将WCHAR *sFilenameIncoming; GetFQDomainNameEx(&sFilenameIncoming); <-this works 指向的数据复制到容器中,并释放分配。


sFilenameIncoming

这不起作用,因为//GetFQDomainNameEx(&sFQDN.data()); <-does not work 是一个右值,因此您不能使用其地址。