簡體   English   中英

了解VerQueryValue

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM