Understanding VerQueryValue

Understanding VerQueryValue

本文关键字:VerQueryValue Understanding      更新时间:2023-10-16

在MSDN上,我注意到VerQueryValue函数如下:

lplpBuffer[出]

的值当这个方法返回时,包含一个指针的地址,该指针指向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);

VerQueryValue返回指向您分配的初始内存块中的某个地方的指针(GetFileVersionInfoSize返回足够大的块的大小,以包含整个版本资源+ ansi到unicode转换等所需的任何空间)

至少在某些情况下,VerQueryValue执行版本数据的转换(例如,当使用Unicode版本的GetFileVersionInfo,但使用ASCII版本的VerQueryValue时,将Unicode转换为ASCII)。显然,GetFileVersionInfoSize计算的缓冲区大小足以容纳转换后的数据。

GetFileVersionInfo将数据复制到提供的缓冲区中。由于该数据的格式不容易获得/没有文档记录,因此需要使用辅助函数VerQueryValue来检索指向GetFileVersionInfo填充的缓冲区中的特定项的指针。

MS记录的"VerQueryValue返回的指针不是从任何地方分配的-它只是指向另一个缓冲区中的某个地方"的方式有点令人困惑。