You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.7 KiB
96 lines
2.7 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1995 - 1999
|
|
//
|
|
// File: filever.cpp
|
|
//
|
|
// Contents: Get file version
|
|
//
|
|
// Functions: I_CryptGetFileVersion
|
|
//
|
|
// History: 22-Oct-97 philh created
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include "global.hxx"
|
|
#include "crypthlp.h"
|
|
#include "unicode.h"
|
|
#include <dbgdef.h>
|
|
|
|
//+-------------------------------------------------------------------------
|
|
// Get file version of the specified file
|
|
//--------------------------------------------------------------------------
|
|
BOOL
|
|
WINAPI
|
|
I_CryptGetFileVersion(
|
|
IN LPCWSTR pwszFilename,
|
|
OUT DWORD *pdwFileVersionMS, /* e.g. 0x00030075 = "3.75" */
|
|
OUT DWORD *pdwFileVersionLS /* e.g. 0x00000031 = "0.31" */
|
|
)
|
|
{
|
|
BOOL fResult;
|
|
DWORD dwExceptionCode;
|
|
BYTE rgb1[_MAX_PATH];
|
|
LPSTR pszFilename = NULL;
|
|
|
|
DWORD dwHandle = 0;
|
|
DWORD cbInfo;
|
|
void *pvInfo = NULL;
|
|
VS_FIXEDFILEINFO *pFixedFileInfo = NULL; // not allocated
|
|
UINT ccFixedFileInfo = 0;
|
|
|
|
if (!MkMBStr(rgb1, _MAX_PATH, pwszFilename, &pszFilename))
|
|
goto OutOfMemory;
|
|
|
|
// The following APIs are in DELAYLOAD'ed version.dll. If the DELAYLOAD
|
|
// fails an exception is raised.
|
|
__try {
|
|
if (0 == (cbInfo = GetFileVersionInfoSizeA(pszFilename, &dwHandle)))
|
|
goto GetFileVersionInfoSizeError;
|
|
|
|
if (NULL == (pvInfo = malloc(cbInfo)))
|
|
goto OutOfMemory;
|
|
|
|
if (!GetFileVersionInfoA(
|
|
pszFilename,
|
|
0, // dwHandle, ignored
|
|
cbInfo,
|
|
pvInfo
|
|
))
|
|
goto GetFileVersionInfoError;
|
|
|
|
if (!VerQueryValueA(
|
|
pvInfo,
|
|
"\\", // VS_FIXEDFILEINFO
|
|
(void **) &pFixedFileInfo,
|
|
&ccFixedFileInfo
|
|
))
|
|
goto VerQueryValueError;
|
|
} __except(EXCEPTION_EXECUTE_HANDLER) {
|
|
dwExceptionCode = GetExceptionCode();
|
|
goto GetFileVersionException;
|
|
}
|
|
|
|
*pdwFileVersionMS = pFixedFileInfo->dwFileVersionMS;
|
|
*pdwFileVersionLS = pFixedFileInfo->dwFileVersionLS;
|
|
|
|
fResult = TRUE;
|
|
CommonReturn:
|
|
FreeMBStr(rgb1, pszFilename);
|
|
if (pvInfo)
|
|
free(pvInfo);
|
|
return fResult;
|
|
|
|
ErrorReturn:
|
|
*pdwFileVersionMS = 0;
|
|
*pdwFileVersionLS = 0;
|
|
fResult = FALSE;
|
|
goto CommonReturn;
|
|
|
|
TRACE_ERROR(OutOfMemory)
|
|
TRACE_ERROR(GetFileVersionInfoSizeError)
|
|
TRACE_ERROR(GetFileVersionInfoError)
|
|
TRACE_ERROR(VerQueryValueError)
|
|
SET_ERROR_VAR(GetFileVersionException, dwExceptionCode)
|
|
}
|