📄 01_9_17_20.asp.html
字号:
</td></tr></table><table width=100% ><tr><td class=a14>
DWORD GetMinorVersion ()</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
return m_dwMinor;</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
DWORD GetBuildNumber ()</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
return m_dwBuild;</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
BOOL IsValid ()</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
return m_bValid;</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
private:</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
BOOL GetDLLVersion (LPSTR szDLLFileName, </td></tr></table><table width=100% ><tr><td class=a14>
DWORD &dwMajor, DWORD &dwMinor, DWORD &dwBuildNumber);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
BOOL CheckFileVersion (LPSTR szFileName, FileLocationType FileLoc, </td></tr></table><table width=100% ><tr><td class=a14>
DWORD &dwMajor, DWORD &dwMinor, DWORD &dwBuildNumber);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
BOOL ParseVersionString (LPSTR lpVersion, </td></tr></table><table width=100% ><tr><td class=a14>
DWORD &dwMajor, DWORD &dwMinor, DWORD &dwBuildNumber);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
BOOL FixFilePath (char * szFileName, FileLocationType FileLoc);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
DWORD m_dwMajor, // Major version number</td></tr></table><table width=100% ><tr><td class=a14>
m_dwMinor, // Minor version number</td></tr></table><table width=100% ><tr><td class=a14>
m_dwBuild; // Build number</td></tr></table><table width=100% ><tr><td class=a14>
BOOL m_bValid; // Is the DLL version information valid ?</td></tr></table><table width=100% ><tr><td class=a14>
};</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
#endif</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
这里是实现部分:</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
#include "DLLVersion.h"</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
/**********************************************************</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
Function: GetDLLVersion</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
Purpose: Retrieves DLL major version, minor version and build numbers</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
Input: DLL file name</td></tr></table><table width=100% ><tr><td class=a14>
Reference to Major number </td></tr></table><table width=100% ><tr><td class=a14>
Reference to Minor number </td></tr></table><table width=100% ><tr><td class=a14>
Reference to Build number </td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
Output: TRUE only if successful</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
Remarks: This function first tries to get the DLL version the nice way,</td></tr></table><table width=100% ><tr><td class=a14>
that is, call the DllGetVersion function in the DLL.</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
If this fails, it tries to located the DLL file in the file system,</td></tr></table><table width=100% ><tr><td class=a14>
read the file information block and retrieve the file version.</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
****************************************************************************/</td></tr></table><table width=100% ><tr><td class=a14>
BOOL CDLLVersion::GetDLLVersion (LPSTR szDLLFileName, </td></tr></table><table width=100% ><tr><td class=a14>
DWORD &dwMajor, DWORD &dwMinor, DWORD &dwBuildNumber)</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
HINSTANCE hDllInst; // Instance of loaded DLL</td></tr></table><table width=100% ><tr><td class=a14>
char szFileName [_MAX_PATH]; // Temp file name</td></tr></table><table width=100% ><tr><td class=a14>
BOOL bRes = TRUE; // Result</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
lstrcpy (szFileName, szDLLFileName); // Save a file name copy for the loading</td></tr></table><table width=100% ><tr><td class=a14>
hDllInst = LoadLibrary(TEXT(szFileName)); //load the DLL</td></tr></table><table width=100% ><tr><td class=a14>
if(hDllInst) { // Could successfully load the DLL</td></tr></table><table width=100% ><tr><td class=a14>
DLLGETVERSIONPROC pDllGetVersion;</td></tr></table><table width=100% ><tr><td class=a14>
/*</td></tr></table><table width=100% ><tr><td class=a14>
You must get this function explicitly because earlier versions of the DLL </td></tr></table><table width=100% ><tr><td class=a14>
don't implement this function. That makes the lack of implementation of the </td></tr></table><table width=100% ><tr><td class=a14>
function a version marker in itself.</td></tr></table><table width=100% ><tr><td class=a14>
*/</td></tr></table><table width=100% ><tr><td class=a14>
pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hDllInst,</td></tr></table><table width=100% ><tr><td class=a14>
TEXT("DllGetVersion"));</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
if(pDllGetVersion) { // DLL supports version retrieval function</td></tr></table><table width=100% ><tr><td class=a14>
DLLVERSIONINFO dvi;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
ZeroMemory(&dvi, sizeof(dvi));</td></tr></table><table width=100% ><tr><td class=a14>
dvi.cbSize = sizeof(dvi);</td></tr></table><table width=100% ><tr><td class=a14>
HRESULT hr = (*pDllGetVersion)(&dvi);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
if(SUCCEEDED(hr)) { // Finally, the version is at our hands</td></tr></table><table width=100% ><tr><td class=a14>
dwMajor = dvi.dwMajorVersion;</td></tr></table><table width=100% ><tr><td class=a14>
dwMinor = dvi.dwMinorVersion;</td></tr></table><table width=100% ><tr><td class=a14>
dwBuildNumber = dvi.dwBuildNumber;</td></tr></table><table width=100% ><tr><td class=a14>
} else</td></tr></table><table width=100% ><tr><td class=a14>
bRes = FALSE; // Failure</td></tr></table><table width=100% ><tr><td class=a14>
} else // GetProcAddress failed, the DLL cannot tell its version</td></tr></table><table width=100% ><tr><td class=a14>
bRes = FALSE; // Failure</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
FreeLibrary(hDllInst); // Release DLL</td></tr></table><table width=100% ><tr><td class=a14>
} else </td></tr></table><table width=100% ><tr><td class=a14>
bRes = FALSE; // DLL could not be loaded</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
if (!bRes) // Cannot read DLL version the nice way </td></tr></table><table width=100% ><tr><td class=a14>
return CheckFileVersion (szFileName, SYS_DIR, </td></tr></table><table width=100% ><tr><td class=a14>
dwMajor, dwMinor, dwBuildNumber); // Try the ugly way</td></tr></table><table width=100% ><tr><td class=a14>
else</td></tr></table><table width=100% ><tr><td class=a14>
return TRUE;</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
/***************************************************************************</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
Function: CheckFileVersion</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
Purpose: Check the version information of a given file</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
Input: File name</td></tr></table><table width=100% ><tr><td class=a14>
File location (Windows dir, System dir, Current dir or none)</td></tr></table><table width=100% ><tr><td class=a14>
Reference to Major number </td></tr></table><table width=100% ><tr><td class=a14>
Reference to Minor number </td></tr></table><table width=100% ><tr><td class=a14>
Reference to Build number </td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
Output: TRUE only if successful</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
Remarks: Trashes original file name</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
****************************************************************************/</td></tr></table><table width=100% ><tr><td class=a14>
BOOL CDLLVersion::CheckFileVersion (LPSTR szFileName, FileLocationType FileLoc, </td></tr></table><table width=100% ><tr><td class=a14>
DWORD &dwMajor, DWORD &dwMinor, </td></tr></table><table width=100% ><tr><td class=a14>
DWORD &dwBuildNumber)</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
LPSTR lpVersion; // String pointer to 'version' text</td></tr></table><table width=100% ><tr><td class=a14>
UINT uVersionLen;</td></tr></table><table width=100% ><tr><td class=a14>
DWORD dwVerHnd=0; // An 'ignored' parameter, always '0'</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
FixFilePath (szFileName, FileLoc); // Add necessary path prefix to file name</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
DWORD dwVerInfoSize = GetFileVersionInfoSize (szFileName, &dwVerHnd);</td></tr></table><table width=100% ><tr><td class=a14>
if (!dwVerInfoSize) // Cannot reach the DLL file</td></tr></table><table width=100% ><tr><td class=a14>
return FALSE;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
LPSTR lpstrVffInfo = </td></tr></table><table width=100% ><tr><td class=a14>
(LPSTR) malloc (dwVerInfoSize); // Alloc memory for file info</td></tr></table><table width=100% ><tr><td class=a14>
if (lpstrVffInfo == NULL)</td></tr></table><table width=100% ><tr><td class=a14>
return FALSE; // Allocation failed</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
// Try to get the info</td></tr></table><table width=100% ><tr><td class=a14>
if (!GetFileVersionInfo(szFileName, dwVerHnd, dwVerInfoSize, lpstrVffInfo)) {</td></tr></table><table width=100% ><tr><td class=a14>
free (lpstrVffInfo);</td></tr></table><table width=100% ><tr><td class=a14>
return FALSE; // Cannot read the file information - </td></tr></table><table width=100% ><tr><td class=a14>
// wierd, since we could read the information size</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
/* The below 'hex' value looks a little confusing, but</td></tr></table><table width=100% ><tr><td class=a14>
essentially what it is, is the hexidecimal representation</td></tr></table><table width=100% ><tr><td class=a14>
of a couple different values that represent the language</td></tr></table><table width=100% ><tr><td class=a14>
and character set that we are wanting string values for.</td></tr></table><table width=100% ><tr><td class=a14>
040904E4 is a very common one, because it means:</td></tr></table><table width=100% ><tr><td class=a14>
US English, Windows MultiLingual characterset</td></tr></table><table width=100% ><tr><td class=a14>
Or to pull it all apart:</td></tr></table><table width=100% ><tr><td class=a14>
04------ = SUBLANG_ENGLISH_USA</td></tr></table><table width=100% ><tr><td class=a14>
--09---- = LANG_ENGLISH</td></tr></table><table width=100% ><tr><td class=a14>
----04E4 = 1252 = Codepage for Windows:Multilingual</td></tr></table><table width=100% ><tr><td class=a14>
*/</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
if (!VerQueryValue ( lpstrVffInfo, </td></tr></table><table width=100% ><tr><td class=a14>
(LPSTR) (TEXT("\\StringFileInfo\\040904E4\\FileVersion")), </td></tr></table><table width=100% ><tr><td class=a14>
(LPVOID *)&lpVersion, (UINT *)&uVersionLen)) {</td></tr></table><table width=100% ><tr><td class=a14>
free (lpstrVffInfo);</td></tr></table><table width=100% ><tr><td class=a14>
return FALSE; // Query was unsuccessful</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
// Now we have a string that looks like this :</td></tr></table><table width=100% ><tr><td class=a14>
// "MajorVersion.MinorVersion.BuildNumber", so let's parse it</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
BOOL bRes = ParseVersionString (lpVersion, dwMajor, dwMinor, dwBuildNumber);</td></tr></table><table width=100% ><tr><td class=a14>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -