在MSDN上,我注意到VerQueryValue函数的以下内容:
lplpBuffer [out]
LPVOID
当此方法返回时,包含指向pBlock指向的缓冲区中所请求的版本信息的指针的地址。 释放关联的pBlock内存后释放lplpBuffer指向的内存。
由于pBlock是由调用者分配的,系统如何知道何时释放pBlock?
我正在使用以下代码:
UINT reqSize = ::GetSystemDirectoryW(nullptr, 1);
std::vector<wchar_t> winDirectory (reqSize, 0);
UINT retVal = ::GetSystemDirectoryW(&winDirectory[0], reqSize);
std::wstring filePath(winDirectory.begin(), winDirectory.end()-1);
filePath.append(L"\\kernel32.dll");
DWORD bufSize = ::GetFileVersionInfoSizeW(
filePath.c_str(),
nullptr);
std::vector<BYTE> fileInfo (bufSize, 0);
::GetFileVersionInfoW(
filePath.c_str(),
0,
bufSize,
&fileInfo[0]);
UINT size = 0;
VS_FIXEDFILEINFO * ptr = nullptr;
BOOL error = ::VerQueryValueW(
&fileInfo[0],
L"\\",
reinterpret_cast<LPVOID*>(&ptr),
&size);
答案 0 :(得分:4)
VerQueryValue返回指向您分配的初始内存块内某处的指针(GetFileVersionInfoSize返回块的大小,该块足够大以包含整个版本资源+ ansi转换为unicode所需的任何空间等)
答案 1 :(得分:3)
至少在某些情况下,VerQueryValue
会执行版本数据的转换(例如,当GetFileVersionInfo
的Unicode版本使用Unicode转换为ASCII转换时,会使用ASCII版本VerQueryValue
。 GetFileVersionInfoSize
显然计算出的缓冲区大小足以保存转换后的数据。
答案 2 :(得分:2)
GetFileVersionInfo
将数据复制到提供的缓冲区中。由于此数据的格式不易获得/记录,您需要使用辅助函数VerQueryValue
来检索指向填充的缓冲区GetFileVersionInfo
中的特定条目的指针。
MS记录的方式“VerQueryValue返回的指针不是从任何地方分配的 - 它只是指向另一个缓冲区中的某个地方”有点令人困惑。