Mode de compatibilité de l'EXE [Résolu]

Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
- - Dernière réponse : PCPT
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
- 24 nov. 2005 à 22:56
bonsoir,
à partir de VB6, sous XP, j'ai besoin de rendre compatible un exe vers Windows 2000.

j'arrive à récupérer la version du système et bien sûr le chemin et nom de l'exe, mais je ne trouve pas quelle API chercher...
S/G-FileAttributes n'a aucun rapport...
une idée? un piste? un produit fini?
merci^^
PCPT [AFCK]
Afficher la suite 

15 réponses

Meilleure réponse
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
60
3
Merci
J'ai comparé deux Exe identiques, dont l'un etait en mode compatible, il sont identiques, cette info n'est pas stockée là...



mais dans Base de registres, effectivement :



HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

Amusez-vous !
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS - MVP Visual Basic

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 89 internautes nous ont dit merci ce mois-ci

Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
60
3
Merci
elle plante tout autant....

la fonction n'etant pas trouvée dans la Dll qui l'exporte sous 2000 et +

Amusez-vous !
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS - MVP Visual Basic

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 89 internautes nous ont dit merci ce mois-ci

Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
72
0
Merci
Salut
Bien confus tout ça ...
Explication de texte :

Avec VB6, tu as compilé un EXE sous XP.
Apparemment, il ne fonctionne aps sous W2k.
besoin de rendre compatible un exe : Pourquoi ? Quel problème/erreur as-tu ?
j'arrive à récupérer la version du système : La version de l'OS, tu veux dire, à savoir que tu es sous XP ou sous W2k. Bien, Ok.
et bien sûr le chemin et nom de l'exe : Bien sûr
mais je ne trouve pas quelle API chercher... : Pour trouver quoi ? Où est ta question ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
29
0
Merci
merci de ton intérêt.
sûr ce PC (développement, WinXP), il est fréquent que je sois obligé de passer les exe en "compatible Windows2000" lorsqu'ils sont liés ont leur "moi.exe.manifest".

après recherches, il arrive parfois cet incident....
(donc de devoir passer manuellement cette compatibilité)
or je fais une classe pour créer et appliquer facilement un manifest.
je voudrais donc que ma classe modifie cette propriété sur l'exe (suite aux tests de système, création, etc...)

supposable par API.... (non? <- question = laquelle? comment?)
j'espère avoir été plus clair ;)
@ bientôt et merci
PCPT [AFCK]
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
60
0
Merci
tu pourrais déjà conditionner l'appel à InitCommonControls(Ex)...

Amusez-vous !
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS - MVP Visual Basic
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
11
0
Merci
Salut pcpt

Sinon, pour modifier la compatibilité, si tu trouves pas d'API, y a forcément une clé dans la base de registre.

Il te faudrait un logiciel de comparaison du registre (Y en a au moins des shareware): tu sauvgarde, tu modifies les options de compatibilité, puis tu demandes les différences.

Le problème c'est qu'accèder directement à la base de registre est moins propre qu'avec l'API, et surtout que les données sont parfois plus ou moins cryptées...
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
60
0
Merci
(un simple recherche du nom du fichier dans la base de registre a suffit.... pas besoin d'un SnapShot ^^)

Amusez-vous !
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS - MVP Visual Basic
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
29
0
Merci
merci à vous 2.
j'en étais arrivé aux mêmes conclusions sans la ligne du registre.
lorsque je compile mon projet, je passe manuellement en compatible 2000, je supprime l'exe, recompile, le nouvel exe est toujours en 2000.
c'était donc forcément le registre ;)

je regarde çà de plus près et vous tiens au courant.
++
PCPT [AFCK]
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
11
0
Merci
Renfield m'a devancé !

Sinon, même conclusion que lui !

Une modification des données de la clé modifie instantanément les options de l'exe.

Par contre c'est dans HKCU...

Autrement dis, chaque utilisateur a ses propres options de compatibilité, ce qui ne vat pas te faciliter le boulot...
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
29
0
Merci
bon, bah çà a l'air fonctionnel

merci encore.

voici un bout de code qui peut être utile aux futurs éventuels lecteurs


Private Const cDestKey As String = "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"
Private Const cDestValue As String = "WIN2000"

' on regarde si la clé existe
Dim lRet As Long, lKeyHandle As Long

lRet = RegOpenKeyEx(HKEY_CURRENT_USER, cDestKey, 0&, KEY_ALL_ACCESS, lKeyHandle)
If lRet = ERROR_SUCCESS Then
' elle existe, on ferme la lecture
Call RegCloseKey(lKeyHandle)
Else
' elle n'existe pas, on la créé
Call RegCreateKey(HKEY_CURRENT_USER, cDestKey, 0&)
End If

' on ré-ouvre la clé + vérif erreur registre (logiquement inutile.....)
lRet = RegOpenKeyEx(HKEY_CURRENT_USER, cDestKey, 0&, KEY_ALL_ACCESS, lKeyHandle)
If lRet <> ERROR_SUCCESS Then Exit Sub

' on récupère la valeur (peut ne pas exister)
Dim sBuffer As String, sValue As String
sBuffer = Space$(2048)
Call RegQueryValueEx(lKeyHandle, sPathFileExe, 0&, REG_SZ, sBuffer, Len (sBuffer))

sValue = LeftB$(sBuffer, 14)
sBuffer = Chr$(0)

' si la clé n'existe pas ou n'est pas bonne, on la créé
If sValue <> cDestValue Then
sValue = cDestValue & Chr$(0)
Call RegSetValueEx(lKeyHandle, sPathFileExe, 0&, REG_SZ, sValue, Len(sValue))
End If

' on ferme
Call RegCloseKey(lKeyHandle)


<SMALL> Coloration syntaxique automatique [AFCK]</SMALL>


les API et constantes sont sur Guid-Api.
le reste est devinable...
plus de détails sur ma source Manifest que je posterai sous peu....

@+ et merci RenField
(et à toi aussi RT15 ^^)

PCPT [AFCK]
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
29
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
29
0
Merci
Rey ou Jack, à tout hasard... est-ce que SetLayeredWindowAttributes fonctionne sous NT?
merci ;)
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
60
0
Merci
Windows 2000 minimum

Google > SetLayeredWindowAttributes >"j'ai de la chance" >
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/setlayeredwindowattributes.asp

Amusez-vous !
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS - MVP Visual Basic
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
29
0
Merci
ok, j'ai mal formulé. désolé :
si je fais un SetLayered... sous W98, l'appli plante. est-ce qu'elle plante également sous NT ou n'a juste aucun effet...
(je suppose que oui, mais c'est une certitude que j'ai besoin)
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
29
0
Merci
ok. c'est bien ce que je supposais.
merci @+
PCPT [AFCK]

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.