了解VerQueryValue

时间:2011-04-16 16:00:20

标签: c++ winapi

在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);

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

至少在某些情况下,VerQueryValue会执行版本数据的转换(例如,当GetFileVersionInfo的Unicode版本使用Unicode转换为ASCII转换时,会使用ASCII版本VerQueryValueGetFileVersionInfoSize显然计算出的缓冲区大小足以保存转换后的数据。

答案 2 :(得分:2)

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

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