【发布时间】:2017-03-16 18:11:52
【问题描述】:
我使用下面的代码通过SHGetKnowFolderPath() 获取 ProgramData 路径。
您能否告诉我将它与CString 一起使用是否正确?如果没有,使用SHGetKnownFolderPath() 获取 ProgramData 路径的最佳解决方案是什么?
我使用了下面的 2 个示例,两者都有效,但我不确定它们是否正确。
CString szProgramDataPath;
szProgramDataPath.GetBuffer(MAX_PATH);
if (FAILED(SHGetKnownFolderPath(FOLDERID_ProgramData, 0, NULL, (PWSTR*)&szProgramDataPath)))
{
cout << _T("Failed, error is: ") << GetLastError();
}
或者:
CString szProgramDataPath;
if (FAILED(SHGetKnownFolderPath(FOLDERID_ProgramData, 0, NULL, (PWSTR*)&szProgramDataPath)))
{
cout << _T("Failed, error is: ") << GetLastError();
}
【问题讨论】:
-
以这种方式使用
GetBuffer()时,请确保您在之后调用ReleaseBuffer()。 -
@Danny_ds 从技术上讲,只有当缓冲区的内容发生变化并且新的字符串长度与更改前不同时,您才需要调用
ReleaseBuffer()。否则调用ReleaseBuffer()是可选的,因为它基本上是无操作的。但是,以防万一,在GetBuffer()之后调用ReleaseBuffer()始终是一个好习惯。也许有一天 MS 重新设计了GetBuffer()来分配一个临时内存块,ReleaseBuffer()将它合并到主字符串中。谁知道呢。 -
@RemyLebeau 再次正确 :)