[英]Understanding VerQueryValue
在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);
VerQueryValue返回指向您分配的初始內存塊內某處的指針(GetFileVersionInfoSize返回一個足夠大的塊的大小,以包含整個版本資源+ ansi到unicode轉換所需的任何空間等)
至少在某些情況下, VerQueryValue
執行版本數據的轉換(例如,當使用Unicode版本的GetFileVersionInfo
但使用ASCII版本的VerQueryValue
時,Unicode轉換為ASCII轉換)。 GetFileVersionInfoSize
顯然計算的緩沖區大小足以容納轉換后的數據。
GetFileVersionInfo
數據復制到提供的緩沖區中。 由於該數據的格式沒有現成/文檔,您需要使用輔助函數VerQueryValue
到緩沖區內檢索指向特定條目GetFileVersionInfo
填充。
MS記錄的方式“VerQueryValue返回的指針不是從任何地方分配的 - 它只是指向另一個緩沖區中的某個地方”有點令人困惑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.