Bonjour,
Dans une appli C++, je fais appel à une DLL écrite en C++.
C'est le numéro de version de la DLL (FILEVERSION) qui se trouve dans ressources.rc que je cherche a recuperer.
Quelqu'un aurait-il une idee?
Merci par avance!
Regeaisse.
Bonjour,
Dans une appli C++, je fais appel à une DLL écrite en C++.
C'est le numéro de version de la DLL (FILEVERSION) qui se trouve dans ressources.rc que je cherche a recuperer.
Quelqu'un aurait-il une idee?
Merci par avance!
Regeaisse.
C'est spécifique Windows, je déplace.
La référence ici:
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/resources/versioninformation.asp
Un exemple là:
http://www.codeproject.com/dll/showver.asp
J'ai redige ce code pour recuperer la version de la dll
J'ai un probleme avec le GetModuleFileName car il me retourne le nom du module C++ utilisant la dll dont je cherche la version.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 if ( GetModuleFileName( NULL, strExeName, _MAX_PATH ) ) { DWORD dummy; DWORD size = GetFileVersionInfoSize/*W*/( strExeName, &dummy ) ; if (size) { void* pVer = _alloca(size); memset(pVer, 0, size); if ( GetFileVersionInfo/*W*/( strExeName, 0, size, pVer ) ) { // Interpret the VS_VERSIONINFO header pseudo-struct VS_VERSIONINFO_98 * pVS = (VS_VERSIONINFO_98 *)pVer; } } }
J'ai donc essayé ceci:
Mais le FindRessource ne fonctionne pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 HMODULE h = ::GetModuleHandle("NomDLL.dll"); HRSRC hres = FindResource(h, "VS_VERSION_INFO", RT_VERSION); if (hres) { DWORD size = SizeofResource( hInst, hres ); HGLOBAL hmem = LoadResource(h, hres); char *lpResLock = (char *)LockResource(hmem); ........ }
Qu'est ce qui ne va pas dans ce que je fais?
Merci par avance.
Regeaisse
[Balises [code] ajoutées par Aurélien.Regat-Barrel, merci d'y penser]
Pour récupérer la version d'une DLL au sein d'elle-même, j'enchaîne les appels suivants :
- GetModuleFileName, avec le HINSTANCE passé à DllEntryPoint en paramètre.
- GetFileVersionInfoSize / GetFileVersionInfo
- VerQueryValue sur "\VarFileInfo\Translation", histoire d'obtenir la bonne version en fonction de la langue (sinon, effets de bord "mignons" en cas de changement de la langue de base !!).
- Puis des appels à la chaîne à VerQueryValue sur "\StringFileInfo\" + la représentation texte du code numérique obtenu à l'étape précédente + "\" + le nom du champ à récupérer, donc "ProductVersion" dans ton cas.
Détail des commandes sur MSDN.
Mac LAK.
___________________________________________________
Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.
Sources et composants Delphi sur mon site, L'antre du Lak.
Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.
Rejoignez-nous sur : ► Serveur de fichiers [NAS] ► Le Tableau de bord projets ► Le groupe de travail ICMO
c'est parce que tu as donné NULL en premier paramètre. Faut donner le handle de la dll ( GetModuleHandle("NomDLL.dll") par exemple, encore que si tu as le nom, autant l'utiliser directement non ?)J'ai un probleme avec le GetModuleFileName car il me retourne le nom du module C++ utilisant la dll dont je cherche la version.
J'ai utilise le GetModuleHandle("NomDLL.dll") comme suggere par Aurelien.Regat-Barrel, car je ne connais pas le nom complet (chemin compris) de la Dll.
Ensuite grace au handle recupere je peux utilise la sequence d'appels suggeree par Mac LAK.
Ca fonctionne!
Merci de votre aide!
Regeaisse
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager