我有一个将参数之一设置为传出的函数。我需要将其与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
答案 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
是一个右值,因此您不能使用其地址。