Menu

Wyciąganie informacji o pliku, wersji

2024-07-27 - Pliki i katalogi
// ---------------------------------------------------------------------------
// Comments InternalName    ProductName
// CompanyName  LegalCopyright  ProductVersion
// FileDescription  LegalTrademarks PrivateBuild
// FileVersion  OriginalFilename    SpecialBuild
// ---------------------------------------------------------------------------
UnicodeString __fastcall TForm1::GetFileVersionField(UnicodeString PathToFile, const wchar_t *DataFileInformation) {
 
    UnicodeString RetField;
    DWORD hVersion, vis;
    int len = MAX_PATH;
    wchar_t cFile[MAX_PATH], vn[100], *ver; ;
    char ret[MAX_PATH];
    LPVOID transblock, *vData;
    UINT vsize;
 
    StrCpyW(cFile, PathToFile.w_str());
    vis = GetFileVersionInfoSize(cFile, &hVersion);
    if (vis == 0)
        return RetField;
    vData = (LPVOID*)new char[(UINT)vis];
    if (!GetFileVersionInfo(cFile, hVersion, vis, vData)) {
        delete[](char *)vData;
        return RetField;
    }
    StrCpyW(vn, L"\\VarFileInfo\\Translation");
    BOOL res = VerQueryValue(vData, vn, &transblock, &vsize);
    if (!res) {
        delete[](char *)vData;
        return RetField;
    }
    *(DWORD*)transblock = MAKELONG(HIWORD(*(DWORD*)transblock), LOWORD(*(DWORD*)transblock));
    wsprintf(vn, L"\\StringFileInfo\\%08lx\\%s", *(DWORD*)transblock, DataFileInformation);
    res = VerQueryValue(vData, vn, (LPVOID*)&ver, &vsize);
    if (!res) {
        delete[](char *)vData;
        return RetField;
    }
    int vlen = wcslen(ver);
    if (ret != NULL) {
        int clen = ((vlen + 1) >= (len - 1)) ? len - 1 : vlen + 1;
        for (int i = 0; i < clen; i++)
            ret[i] = ver[i];
        ret[len - 1] = 0;
    }
    delete[](char *)vData;
    RetField = ret;
    if (!RetField.IsEmpty())
        return RetField.Trim();
    else
        return RetField;
}
// ---------------------------------------------------------------------------