1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
| #define __BROWSEDLL__
// INCLUDE
#include "GetDllInfo.h"
#include <string.h>
extern "C" int APIENTRY DllMain
(
HINSTANCE p_hInstance ,
DWORD p_dwReason ,
LPVOID p_lpReserved
)
{
// (1) Cas ou la raison de l'appel à DllMain vaut :
switch( p_dwReason )
{
// (1.10) Appel a la dll.
case DLL_PROCESS_ATTACH :
break;
// (1.20) Liberation de la dll.
case DLL_PROCESS_DETACH :
break;
// (1.30) Autre cas.
default :
break;
}
// (2) Retourner OK.
return 1; // ok
}
// ne pas oublier de rajouter version.lib dans les liens des Settings du projet pour avoir les != fonctions qui vont bien ; )
DLLPREFIX BL_ERRORS GetDLLVersion
(
char* p_pcDllName,
VS_FIXEDFILEINFO* p_ptVerInfo,
BROWSEDATA* p_bdDataArray
)
{
// variables pour la version de la dll
BL_ERRORS l_ErrCode = BLE_NO_ERROR;
DWORD l_dwVerInfoSize; // Taille de la version.
DWORD l_dwVerHnd; // Non utilisé.
// (1) Vérifier si le buffer de réception a été alloué.
if (p_pcDllName!= NULL)
{
l_dwVerInfoSize = GetFileVersionInfoSize(p_pcDllName, &l_dwVerHnd);
if (l_dwVerInfoSize > 0)
{
unsigned char* l_pucVersionBlock ;
//Allocate memory space for version block
l_pucVersionBlock = new unsigned char [l_dwVerInfoSize];
if (l_pucVersionBlock != NULL)
{
if (GetFileVersionInfo(p_pcDllName, NULL, l_dwVerInfoSize, (LPVOID) l_pucVersionBlock) > 0 ) // on commence à récupérer les infos dans l_dwVerInfoSize. Si >0, c'est OK
{
VS_FIXEDFILEINFO *l_ptVerInfo ;
BOOL l_bRetCode ;
unsigned int l_uiVersionLen ;
l_bRetCode = VerQueryValue (l_pucVersionBlock, "\\", (LPVOID *)&l_ptVerInfo, &l_uiVersionLen); //on récupère encore des infos par VerQueryValue
if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
{
return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
}
else
{
memcpy (p_ptVerInfo, l_ptVerInfo, sizeof (VS_FIXEDFILEINFO ));
// et on copie toutes les infos sur la dll dans la structure
WORD *l_pwVerInfo ;
BOOL l_bRetCode ;
unsigned int l_uiVersionLen ;
//on récupère les infos de langues et de version (voir msdn sur VerQueryValue)
l_bRetCode = VerQueryValue (l_pucVersionBlock, "\\VarFileInfo\\Translation", (LPVOID *)&l_pwVerInfo, &l_uiVersionLen);
if (l_bRetCode && (l_uiVersionLen > 0) && l_ptVerInfo != NULL)
{
char* l_pcDllInfos;
char l_cStartString[30];
char l_pulLangageRef[50];
// on concatène les infos langues sous forme de 2 chaines char en hexa
sprintf(l_cStartString, "\\StringFileInfo\\%04x%04x\\", l_pwVerInfo[0], l_pwVerInfo[1]);
// on commence par le nom de la compagnie
sprintf(l_pulLangageRef, "%sCompanyName", l_cStartString);
l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef, (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
strncpy(p_bdDataArray->m_acCompanyName, l_pcDllInfos, l_uiVersionLen);
if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
{
return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
}
// on continue par la description du fichier
sprintf(l_pulLangageRef, "%sFileDescription", l_cStartString);
l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef, (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
strncpy(p_bdDataArray->m_acFileDescription, l_pcDllInfos, l_uiVersionLen);
if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
{
return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
}
// on commence par la version du fichier
sprintf(l_pulLangageRef, "%sFileVersion", l_cStartString);
l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef, (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
strncpy(p_bdDataArray->m_acFileVersion, l_pcDllInfos, l_uiVersionLen);
if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
{
return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
}
// on commence par le nom nom interne du produit
sprintf(l_pulLangageRef, "%sInternalName", l_cStartString);
l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef, (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
strncpy(p_bdDataArray->m_acInternalName, l_pcDllInfos, l_uiVersionLen);
if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
{
return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
}
// on commence par le copyright
sprintf(l_pulLangageRef, "%sLegalCopyright", l_cStartString);
l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef, (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
strncpy(p_bdDataArray->m_acLegalCopyright, l_pcDllInfos, l_uiVersionLen);
if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
{
return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
}
// on commence par le nom d'origine
sprintf(l_pulLangageRef, "%sOriginalFilename", l_cStartString);
l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef, (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
strncpy(p_bdDataArray->m_acOriginalFilename, l_pcDllInfos, l_uiVersionLen);
if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
{
return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
}
// on commence par le nom de produit
sprintf(l_pulLangageRef, "%sProductName", l_cStartString);
l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef, (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
strncpy(p_bdDataArray->m_acProductName, l_pcDllInfos, l_uiVersionLen);
if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
{
return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
}
// on termine par la version du produit
sprintf(l_pulLangageRef, "%sProductVersion", l_cStartString);
l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef, (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
strncpy(p_bdDataArray->m_acProductVersion, l_pcDllInfos, l_uiVersionLen);
if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
{
return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
}
}//end if (l_bRetCode && (l_uiVersionLen > 0) && l_ptVerInfo != NULL) deuxieme niveau
else // si il ne trouve pas de langage set (ie, pas de champs renseignés pour cette dll
l_ErrCode = BLE_INVALIDE_DLL_VERSION;
}//end if (l_bRetCode && (l_uiVersionLen > 0) && l_ptVerInfo != NULL) premier niveau
}// end if GetFileVersionInfo
} // if l_puc
}// if l_dwVer
else
l_ErrCode = BLE_INVALIDE_DLL_VERSION;
}// if p_pcVersion
return l_ErrCode;
} |
Partager