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返回的指针不是从任何地方分配的-它只是指向另一个缓冲区中的某个地方"的方式有点令人困惑。