Visualiser le bitmap n°100 d'un Logonui.exe [Résolu]

cincap 490 Messages postés dimanche 5 décembre 2004Date d'inscription 6 avril 2009 Dernière intervention - 11 déc. 2006 à 07:33 - Dernière réponse : cincap 490 Messages postés dimanche 5 décembre 2004Date d'inscription 6 avril 2009 Dernière intervention
- 15 déc. 2006 à 09:56
Bonjour,

Quelqu'un aurais t'il une idée pour extraire le bitmap (n° 100 d'un logonui).

Le logonui étant un fichier .exe qui contient les bitmaps qui permettent d'afficher un logon de session Windows XP.

Le principe serait en choississant et en pointant la souris sur le fichier .exe, de voir un aperçu du bitmap n° 100 (dans un Timage) avant de l'installer.

Comme un viewer !

Merci,

Cincap

[url]mailto:/url
Afficher la suite 

Votre réponse

25 réponses

Meilleure réponse
cincap 490 Messages postés dimanche 5 décembre 2004Date d'inscription 6 avril 2009 Dernière intervention - 13 déc. 2006 à 23:06
3
Merci
Bonsoir,

J'ai finalement adopté le 1er code controlant l'exception de l'ami Japee puisque seule la ressource n° 100 m'intéressait au niveau extraction et affichage avant l'installation d'un logonui.

Le logonui étant un exécutable (dos) il peut être manipulé prudemment independemment du WinXp pack1 ou pack2.

Reshacker est encore le logiciel qui permet de remplacer facilement les différents bitmaps et textes et de créer un logonui personnalisé.

Merci donc a Cirec et Japee pour leur savoir.

Vu l'audience élevée, a quand un logiciel en Delphi pour remplacer Reshacker ?

@+,

Cincap

[url]mailto:/url

Merci cincap 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de cincap
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 11 déc. 2006 à 12:52
0
Merci
Salut,

Voici une solution :

tu places un TImage et un TButton sur ta Form principale et tu complètes comme suit :

procedure TfrmMain.Button1Click(Sender: TObject);
Var HandleLib : THandle;
    aBmp : TBitmap;
begin
  HandleLib := LoadLibrary('LogonUi.exe');
  If HandleLib <> 0 Then Begin
  aBmp : = TBitmap.Create;
    Try
      aBmp.LoadFromResourceID(HandleLib, 100);
      Image1.Picture.Assign(aBmp);
    Finally
      FreeLibrary(HandleLib);
      aBmp.Free;
    End;
  End;
end;

 
@+
Cirec

<hr size="2" />
Commenter la réponse de Cirec
Utilisateur anonyme - 11 déc. 2006 à 13:08
0
Merci
Et si maintenant il veut modifier l'icone du fichier logonui : comment il fait ? niark niark niark .
Commenter la réponse de Utilisateur anonyme
japee 1799 Messages postés vendredi 27 décembre 2002Date d'inscription 19 juillet 2018 Dernière intervention - 11 déc. 2006 à 14:17
0
Merci
Salut,


Cirec > intéressant, ce code.

Francky > Avec ResourceHacker .
Sinon, OK pour la tarte au concombre (je sais, c'est pas le même
thread, mais je groupe mes interventions, because problèmes de
connexion...).


A+
Commenter la réponse de japee
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 11 déc. 2006 à 14:44
0
Merci
@ Japee : en fait la méthode d'accès reste la même sauf que dans ce cas de figure la ressource qui nous intéresse ne se trouve pas dans l'application appelante mais dans une autre ce qui explique l'utilisation de LoadLibrary et FreeLibrary.
Avec cette méthode tu peux charger n'importe quelle ressource de n'importe quelle fichier en contenant (*.exe; *.dll; *.ocx; *.bpl ...)
@ Francky :c'est très très facile à réaliser (3 où 4 lignes de code), Ajout, Suppression, Modification de ressources mais je ne crois pas qu'un code de ce type soit bien vu sur DelphiFr

 
@+
Cirec

<hr size="2" />
Commenter la réponse de Cirec
Utilisateur anonyme - 11 déc. 2006 à 14:51
0
Merci
Effectivement c'est limite : cependant ca ferait un sacré tutorial. Par exemple supprimer une ressource est peu référencée sur le web. Quand à changer une ressource c'est encore plus dure à trouver. Mais oui oui c'est limite
Commenter la réponse de Utilisateur anonyme
cincap 490 Messages postés dimanche 5 décembre 2004Date d'inscription 6 avril 2009 Dernière intervention - 12 déc. 2006 à 07:03
0
Merci
Bonjour tout le monde,

Merci Cirec pour ton astuce, je connais ResHacker et je m'en sers pour créer mes Logons.

Rassurer vous, l'idée était de pouvoir greffer sur une fiche un viewer qui permettrait de charger avec un "TopenDialogue" un Logon déja créé (avec ResHacker par ex) dans le répertoire "C:\WINDOWS\Resources\LogonUI\Logon" et de visualiser le bitmap 100 avant de l'installer avec une procédure utilisant Regedit sans plus.

Attention le Logon pourrait se nommer "Logonui_Tartempion.exe" et se trouver dans le répertoire cité.


Avec une unité qui modifie l'extension *.exe avec *.jpg et un "TopenPictureDialogue", il était facile d'assimiler une photo *.jpg avec le même nom que le logon.

Mais j'aurais aimé un viewer plus personnel avec agrandissement de la photo.

@+,

Cincap

[url]mailto:/url
Commenter la réponse de cincap
cincap 490 Messages postés dimanche 5 décembre 2004Date d'inscription 6 avril 2009 Dernière intervention - 12 déc. 2006 à 08:26
0
Merci
L'essai est assez concluant avec le code de l'ami Cirec, j'étais parti dans une autre direction.

En ajoutant sur ma fiche les composants TFileslistbox, TDirectoryListBox et TDriveComboBox il serait possible d'appliquer le code de l'ami Cirec ?

Car un Fileslistbox.filename et un HandleLib = difficulté.

Existe t'il aussi une solution ?

@+,

Cincap

[url]mailto:/url
Commenter la réponse de cincap
japee 1799 Messages postés vendredi 27 décembre 2002Date d'inscription 19 juillet 2018 Dernière intervention - 12 déc. 2006 à 08:45
0
Merci
"un Fileslistbox.filename et un HandleLib = difficulté"

Meuuu nooon...

HandleLib := LoadLibrary(FileListBox.FileName);
Commenter la réponse de japee
cincap 490 Messages postés dimanche 5 décembre 2004Date d'inscription 6 avril 2009 Dernière intervention - 12 déc. 2006 à 09:07
0
Merci
Bonjour Japee,

Meuuu siiii

Déjà essayé voici ce que cela donne en utilisant le code de l'ami Cirec.

"[Erreur] Unit1.pas(107): Types incompatibles : 'String' et 'PChar'"

@+

[url]mailto:/url
Commenter la réponse de cincap
cincap 490 Messages postés dimanche 5 décembre 2004Date d'inscription 6 avril 2009 Dernière intervention - 12 déc. 2006 à 11:11
0
Merci
Japee,

Voici la méthode qui donne un résultat mais forcément si tu pointes sur un fichier *.exe qui n'a pas de bitmap (100) tu as une erreur ! :

"HandleLib := LoadLibrary(pchar(FileListBox1.FileName));"

Sinon pour les logonuis_zaza.exe cela fonctionne correctement, on avance.

La connaissance s'accroit quand on la partage

@+,

Cincap

[url]mailto:/url
Commenter la réponse de cincap
cincap 490 Messages postés dimanche 5 décembre 2004Date d'inscription 6 avril 2009 Dernière intervention - 12 déc. 2006 à 12:57
0
Merci
Rebonjour à tous,

Voila, grand merci à maître Cirec pour sa solution, pour parrer l'exception concernant les exécutables qui n'ont pas la ressource (100), il suffit de forcer le mask du composant TFileListBox en donnant le nom des Logons, dans mon cas Logonui_*.exe pour un logonui qui se nomme "Logonui_tartempion.exe".

Donc à l'ouverture, le composant TFileListBox n'affiche que les logonui_*.exe et par conséquent  plus d'exception, cette solution m'agrée.

Dernière petite question, peut t'on forcer le directory de recherche avec le composant "TDirectoryListBox".

Merci.

@+

[url]mailto:jmcapellen@skynet.be/url
Commenter la réponse de cincap
japee 1799 Messages postés vendredi 27 décembre 2002Date d'inscription 19 juillet 2018 Dernière intervention - 12 déc. 2006 à 13:52
0
Merci
Ah oui, le PChar, peuchère... lol

Pour indiquer un répertoire au TDirectoryListBox :

DirectoryListBox1.Directory := 'C:\LeDirectoryQueJeVeux';

Bonne prog'
Commenter la réponse de japee
cincap 490 Messages postés dimanche 5 décembre 2004Date d'inscription 6 avril 2009 Dernière intervention - 12 déc. 2006 à 14:56
0
Merci
Déjà essayé, le TdirectoryListBox se trouve sur la fiche principale et la dans le oncreate j'ai une erreur "Imposible de focaliser une fenêtre désactivée ou invisible" une fois que je fais OK en effet le répertoire est bien celui que je voulais.

Je vais tester sur une fiche à part.

@+

[url]mailto:/url
Commenter la réponse de cincap
cincap 490 Messages postés dimanche 5 décembre 2004Date d'inscription 6 avril 2009 Dernière intervention - 12 déc. 2006 à 16:23
0
Merci
"Impossible de focaliser une fenêtre désactivée ou invisible"

C'était bien cela, j'ai donc ajouté un Tbouton pour choisir le dossier contenant les logonuis pour forcer son directory après la création de la fiche.

Maintenant, je peu visualiser mes logons de session avant de les installer, très pratique.

Merci à tous ,

Cincap

[url]mailto:/url
Commenter la réponse de cincap
cincap 490 Messages postés dimanche 5 décembre 2004Date d'inscription 6 avril 2009 Dernière intervention - 13 déc. 2006 à 09:44
0
Merci
Bonjour Cirec,

Avec ton code,  serait il possible et peut être préférable de préciser si le fichier exécutable possède en ressource le bitmap 100 si non l'indiquer par un message afin d'éviter l'exception.

Car ma méthode d'éviter l'exception en indiquant comme Mask "logonui_*.exe" ne fonctionne que pour mes logons personnels bien entendu.

Si je vérifie des logons sur le net, forcément leur noms sont différents et ne seront donc pas visible avec ma méthode.

@+,

Cincap
[url]mailto:/url
Commenter la réponse de cincap
japee 1799 Messages postés vendredi 27 décembre 2002Date d'inscription 19 juillet 2018 Dernière intervention - 13 déc. 2006 à 11:54
0
Merci
Bonjour Cirec,

Je m'invite dans la discussion, lol.

Il faut au minimum un Form, une Image, un Label et un SpinEdit pour tester ce code.

function LoadBmpFromLogon(const FileName: string; const Param: Byte;
  aBmp: TBitmap): Boolean;
var
  HandleLib : THandle;
begin
  try
    HandleLib := LoadLibrary(PChar(FileName));
    if HandleLib <> 0 then
    try
      aBmp.LoadFromResourceID(HandleLib, Param);
      Result := True;
    finally
      FreeLibrary(HandleLib);
    end;
  except
    Result := False;
  end;
end;

procedure TForm1.seParamChange(Sender: TObject);
var
  NumBmp: Byte;
  FilePath: string;
begin
  FilePath := 'D:\WINDOWS\system32\LogonUi.exe'; // par exemple...
  NumBmp := seParam.Value;
  Label1.Caption := '';
  if not LoadBmpFromLogon(FilePath, NumBmp, Image1.Picture.Bitmap) then
    Label1.Caption := 'Paramètre non valide';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  seParamChange(nil);
end;

Bonne prog'

japee
Commenter la réponse de japee
cincap 490 Messages postés dimanche 5 décembre 2004Date d'inscription 6 avril 2009 Dernière intervention - 13 déc. 2006 à 12:17
0
Merci
Bonjour Japee,

Excellente solution, en ce qui concerne les logonuis, les bitmaps commencent au n° 100 jusqu'au n° 127.


Je m'en vais tester cela.


@+,


Cincap

[url]mailto:/url
Commenter la réponse de cincap
japee 1799 Messages postés vendredi 27 décembre 2002Date d'inscription 19 juillet 2018 Dernière intervention - 13 déc. 2006 à 12:34
0
Merci
Salut,

Si tu connais d'avance les paramètres, tu peux faire un truc comme ça :

function LoadBmpFromLogon(const FileName: string; const Param: Byte;
  aBmp: TBitmap): Boolean;
const
  Valid = [100, 102..114, 119, 121..127];
var
  HandleLib : THandle;
begin
  Result := False;
  if not (Param in Valid) then Exit;
  try
    HandleLib := LoadLibrary(PChar(FileName));
    if HandleLib <> 0 then
    try
      aBmp.LoadFromResourceID(HandleLib, Param);
      Result := True;
    finally
      FreeLibrary(HandleLib);
    end;
  except
  end;
end;

Bonne prog'
Commenter la réponse de japee
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 13 déc. 2006 à 17:19
0
Merci
Salut,







désolé j'avais pas trop de temps ces derniers jours ...








j'ai écris un petit prog avec une unité a part qui se charge de récuperer tous les noms de bitmaps contenus dans un executable ... si il n'y en a pas vous en êtes aussi averti








J'ai simplifier au maximum pour ne conserver que ce qui nous interresse








Le programme est simple :








vous cliquez sur le bouton ... selectionnez un fichier (Valide *.exe;*.dll;*.ocx;*.bpl) ...
et si il contient des Bitmaps leurs nom seront affichés dans une TListBox ...
et a chaque clique sur un item de la TListBox le Bitmap correspondant est affiché























// une unité à part pour chercher les bitmaps dans un fichier (*.exe; *.dll ...)









// copie et nomme la UcrResource.pas












<hr size= "2" width="100%" />











unit

UcrResource






interface







Uses

Windows
,
SysUtils
,
Classes













Function


  GetResources
(
Res_Handle
:
THandle
;
Res_Type
:
PChar
):
TStringList













implementation










Function

enumResNamesProcex
(
module
:
HMODULE
;
restype
,
resname
:
PChar
;

 
LParam
:
Integer
):
Integer
;



Stdcall

;





Begin






 


With

TStrings
(
LParam
)



do






 


If

HiWord
(
Cardinal
(
resname
))


<>


0



Then






   
Add
(
Resname
)

 

Else






   
Add
(
IntToStr
(
loword
(
Cardinal
(
resname
))));

 
Result
:=


1
;





End














Function


  GetResources
(
Res_Handle
:
THandle
;
Res_Type
:
Pchar
):
TStringList
;

OverLoad

;





Begin






 
Result
:=

TStringList
.
Create
;

 

If




Not


EnumResourceNames
(
Res_Handle
,
Res_Type
,


@
enumResNamesProcEx
,
Integer
(
Result
))



Then






   
Result
.
Add
(
SysErrorMessage
(
GetLastError
));





End







end

.











<hr size="2" width="100%" />













// ici c'est l'unité principale ...









// reproduis la même en n'oubliant rien : 1 TListBox; 1 TImage; et 1 TButton














<hr size ="2" width="100%" />


unit

UMain
;



interface

uses






 
Windows
,
Messages
,
SysUtils
,
Classes
,
Graphics
,
Controls
,
Forms
,
Dialogs
,

 
StdCtrls
,
ExtCtrls
;






type






 
Tfrm_Main
=



class

(
TForm
)

   
lb_Bitmaps
:
TListBox
;

   
img_Bitmaps
:
TImage
;

   
Btn_Open
:
TButton
;

   

procedure


Btn_OpenClick
(
Sender
:
TObject
);

   

procedure


FormClose
(
Sender
:
TObject
;



var

Action
:
TCloseAction
);

   

procedure


lb_BitmapsClick
(
Sender
:
TObject
);

 

private






   


{ Déclarations privées }






   


Procedure

CloseLib
;

 

public






   


{ Déclarations publiques }






 


end














var






 
frm_Main
:
Tfrm_Main






implementation 






{$R *.DFM}








 


























//Ne pas oublier de déclarer :



Uses

UcrResource







Var

HandleLib
:
THandle
=


0
;






 




procedure

Tfrm_Main
.
FormClose
(
Sender
:
TObject
;



var

Action
:
TCloseAction
);





begin






 
CloseLib
;





end














procedure

Tfrm_Main
.
Btn_OpenClick
(
Sender
:
TObject
);





Var


     BmpList
:
TStringList
;





begin






 


With

TOpenDialog
.
Create
(
Self
)



do






 


Try






   
InitialDir
:=


'%SYSTEMROOT%\System32'
;

   
Filter
:=


'Files with resources|*.EXE;*.DLL;*.OCX'
;

   
FilterIndex
:=


1
;

   

If

Execute

Then




Begin






     
CloseLib
;

      HandleLib
:=
LoadLibrary
(
PChar
(
FileName
));

     


If

HandleLib
<>


0



Then




Begin






       
lb_Bitmaps
.
Clear
;

       
BmpList
:=
GetResources
(
HandleLib
,
RT_BITMAP
);

       
lb_Bitmaps
.
Items
.
AddStrings
(
BmpList
);

       
BmpList
.
Free
;

     


End

;

   

End

;

 

Finally






   
Free
;

 

End

;





end














procedure

Tfrm_Main
.
CloseLib
;





begin






 


If

HandleLib
<>


0



Then

FreeLibrary
(
HandleLib
);





end














procedure

Tfrm_Main
.
lb_BitmapsClick
(
Sender
:
TObject
);





Var

aBmp
:
TBitmap
;

   
BmpNum
:
Integer
;





begin






 


If

lb_Bitmaps
.
ItemIndex
<


0



Then

Exit
;

 

With

lb_Bitmaps

Do

BmpNum
:=
StrToIntDef
(
Items
[
ItemIndex
],


-
1
);

 

If

BmpNum
<


0



Then

Exit
;

 
aBmp
:=
TBitmap
.
Create
;

   

With

aBmp

Do




Try






     
LoadFromResourceID
(
HandleLib
,
BmpNum
);

     
img_Bitmaps
.
Picture
.
Assign
(
aBmp
);

   

Finally






     
aBmp
.
Free
;

   

End

;





end







end

.






<hr size="2" width="100%" />

Voilà c'est tout ...
 
@+
Cirec

<hr size="2" />
Commenter la réponse de Cirec

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.