Question Enumérer les ressources d'un programme
- blanc
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 54
- Remerciements reçus 0
il y a 9 ans 10 mois #21836
par blanc
Enumérer les ressources d'un programme a été créé par blanc
Bonjour,
Le site de référence : www.pinvoke.net/default.aspx/kernel32.EnumResourceNames
Dans le but de modifier une ressource contenue dans un programme, j'ai d'abord utilisé l'API FindResource.
Mais avec cette API, mon code ne trouve pas les ressources ayant un nom. Elle trouve les ressources ayant un ID.
Et évidemment, je veux modifier une ressource avec un nom.
J'ai comparé avec le logiciel de www.angusj.com/ (resourcehacker) : il voit bien toutes les ressources correctement.
J'ai donc modifié le code de la page ci-dessus pour énumérer les ressources. Et j'obtiens la même erreur, comme le montre le résultat du code :
Type : UIFILE
Name: 1001
erreur: -532462766
Type : WEVT_TEMPLATE
Name: 1
erreur: -532462766
Type : XMLFILE
Name: 100
erreur: -532462766
Type : 2
Name: 1
Language: 1033
Name: 2
Language: 1033
Donc, j'énumère correctement les types, les noms, les ID. Lorque la ressource possède un ID, j'énumère bien les langues.
Mais si la ressource possède un nom, il y a une erreur.
Après un peu de recherche, j'ai trouvé que la fonction IS_INTRESOURCE de P/invoke retourne false lors de l'erreur
private static bool IS_INTRESOURCE(IntPtr value)
{
// if ( ((uint) value) > ushort.MaxValue)
if ( ((long) value) > ((long) ushort.MaxValue))
return false;
return true;
}
Note : j'ai modifié une ligne de cette fonction car le code .cs compilé avec CSC.EXE fonctionne bien alors que ce même code placé dans un script PS ne fonctionne pas du tout.
Merci d'essayer le code PS et de me dire quel est l'origine de mon problème.
PS : J'ai aussi posté sur developpez.com mais pas de réponse. Alors je tente ici. Je ne maîtrise pas l'anglais et ne peux pas tenter de poster sur un site anglophone car je ne peux pas expliquer mon problème en anglais, ni comprendre la réponse éventuelle.
Le site de référence : www.pinvoke.net/default.aspx/kernel32.EnumResourceNames
Dans le but de modifier une ressource contenue dans un programme, j'ai d'abord utilisé l'API FindResource.
Mais avec cette API, mon code ne trouve pas les ressources ayant un nom. Elle trouve les ressources ayant un ID.
Et évidemment, je veux modifier une ressource avec un nom.
J'ai comparé avec le logiciel de www.angusj.com/ (resourcehacker) : il voit bien toutes les ressources correctement.
J'ai donc modifié le code de la page ci-dessus pour énumérer les ressources. Et j'obtiens la même erreur, comme le montre le résultat du code :
Type : UIFILE
Name: 1001
erreur: -532462766
Type : WEVT_TEMPLATE
Name: 1
erreur: -532462766
Type : XMLFILE
Name: 100
erreur: -532462766
Type : 2
Name: 1
Language: 1033
Name: 2
Language: 1033
Donc, j'énumère correctement les types, les noms, les ID. Lorque la ressource possède un ID, j'énumère bien les langues.
Mais si la ressource possède un nom, il y a une erreur.
Après un peu de recherche, j'ai trouvé que la fonction IS_INTRESOURCE de P/invoke retourne false lors de l'erreur
private static bool IS_INTRESOURCE(IntPtr value)
{
// if ( ((uint) value) > ushort.MaxValue)
if ( ((long) value) > ((long) ushort.MaxValue))
return false;
return true;
}
Note : j'ai modifié une ligne de cette fonction car le code .cs compilé avec CSC.EXE fonctionne bien alors que ce même code placé dans un script PS ne fonctionne pas du tout.
Merci d'essayer le code PS et de me dire quel est l'origine de mon problème.
PS : J'ai aussi posté sur developpez.com mais pas de réponse. Alors je tente ici. Je ne maîtrise pas l'anglais et ne peux pas tenter de poster sur un site anglophone car je ne peux pas expliquer mon problème en anglais, ni comprendre la réponse éventuelle.
La pièce jointe enumerationRessources.txt est absente ou indisponible
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- blanc
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 54
- Remerciements reçus 0
il y a 9 ans 10 mois #21837
par blanc
Réponse de blanc sur le sujet Re:Enumérer les ressources d'un programme
Il s'agit d'une mauvaise signature pour EnumResourceLanguages
La bonne signature :
[code:1]#region Enumération des langues des ressources
[DllImport(\"kernel32.dll\", CharSet = CharSet.Unicode, SetLastError = true)]
static extern bool EnumResourceLanguages(IntPtr hModule, IntPtr lpszType,
IntPtr lpName, EnumResLangDelegate lpEnumFunc, IntPtr lParam);
[/code:1]
Et on obtient le bon résultat ( un extrait) :
Type : EDPPERMISSIVEAPPINFOID
Name: MICROSOFTEDPPERMISSIVEAPPINFO
Language: 1033
Type : MUI
Name: 1
Language: 1036
Language: 1033
La bonne signature :
[code:1]#region Enumération des langues des ressources
[DllImport(\"kernel32.dll\", CharSet = CharSet.Unicode, SetLastError = true)]
static extern bool EnumResourceLanguages(IntPtr hModule, IntPtr lpszType,
IntPtr lpName, EnumResLangDelegate lpEnumFunc, IntPtr lParam);
[/code:1]
Et on obtient le bon résultat ( un extrait) :
Type : EDPPERMISSIVEAPPINFOID
Name: MICROSOFTEDPPERMISSIVEAPPINFO
Language: 1033
Type : MUI
Name: 1
Language: 1036
Language: 1033
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 9 ans 10 mois #21838
par Arnaud Petitjean
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Réponse de Arnaud Petitjean sur le sujet Re:Enumérer les ressources d'un programme
Merci Noël d'être venu poster la solution.
Arnaud
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.048 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les initiés
- Enumérer les ressources d'un programme