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.
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 ?
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...).
@ 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
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
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.
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".
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.
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.
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;
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;
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 ...)