IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Charger un style à partir d'un fichier DLL


Sujet :

Delphi

  1. #1
    Membre averti
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 321
    Points : 303
    Points
    303
    Par défaut Charger un style à partir d'un fichier DLL
    Bonjour a tous,

    Je suis à la recherche d'une méthode pour charger un style à partir d'un DLL.
    Je rencontre un problème avec un message d'erreur : Le point d'entrée de procédure StyleFromResource est introuvable dans la bibliothèque de liens dynamiques.

    Ma DLL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    { StyleFromResource }
    function StyleFromResource(const StyleResource: String): Boolean; stdcall;
    begin
      try
        TStyleManager.LoadFromResource(HInstance, StyleResource);
        Result := True;
      except
        Result := False;
      end;
    end;
     
    exports
      StyleFromResource;
    Projet
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    const
      DLLRes = 'Ressources.dll';
      { StyleFromResource }
    function StyleFromResource(const StyleResource: String): Boolean; stdcall; external DLLRes;
     
    procedure GetStyle(const StyleName: String);
    begin
      if StyleFromResource(StyleName) then
      else
        TStyleManager.TrySetStyle('Clear Day');
    end;
     
    begin
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
      Application.Title := 'MyForm';
     
      IniFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
     
      case IniFile.ReadInteger('APP', 'Style', 0) of
        0:
          TStyleManager.TrySetStyle('Clear Day');
        1:
          GetStyle('Style_Gainsboro');
        2:
          GetStyle('Style_Malibu');
        3:
          GetStyle('Style_Material');
        4:
          GetStyle('Style_Waikawa');
        5:
          GetStyle('Style_W10Clear');
        6:
          GetStyle('Style_Win10Malibu');
        7:
          GetStyle('Style_Win10Material');
        8:
          GetStyle('Style_Win10Office');
      else
        TStyleManager.TrySetStyle('Clear Day');
      end;
     
      FreeAndNil(IniFile);
     
      Application.CreateForm(TMyForm, MyForm);
      Application.Run;
    end.
    Pourriez-vous m'expliquer l'origine du problème ?
    Merci
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 704
    Points : 25 574
    Points
    25 574
    Par défaut
    1- const String, cela fonctionne mais attention à ne pas être tenté de toujours utilisé dans String sans un FastShareMem ou autre.

    Que donne un LoadLibrary et GetProcAddress ?
    Je ne fais jamais de liaison statique sur mes DLL, sinon ben, je ne ferais pas de DLL

    Un TDump ou DependancyWalker affiche bien ta fonctionne sur la DLL, export c'est dans le DPR uniquement ! non ?


    Car la je suppose que tu as l'erreur dès le début du programme
    Voir aussi un éventuel "delayed"



    Ensuite, tu pense que TStyleManager dans l'espace mémoire de la DLL a un lien avec le TStyleManager dans l'espace mémoire de l'EXE ???
    Pour cela, il faudrait que la DLL et l'EXE soit compilé en mode Package, ainsi cela utiliserait l'espace mémoire d'un BPL pour le TStyleManager, ce qui garantirait qu'il soit commun.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 321
    Points : 303
    Points
    303
    Par défaut
    Bonjour ShaiLeTroll,

    Oui, effectivement, le problème vient d'un problème de liaison entre le projet et la Dll et TStyleManager.

    J'ai fait une tentative de mettre en paramètre TStyleMenager dans la fonction, J'ai plus le message d'erreur (Le point d'entrée de procédure...), Mais j'ai une expression qui se soulève (Handle du style est non valide).

    Projet Dll :
    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
    16
    17
    { StyleFromResource }
    function StyleFromResource(StyleManager: TStyleManager; const StyleResource: String)
      : Boolean; stdcall;
    var
      Style: TStyleManager.TStyleServicesHandle;
    begin
      Result := False;
     
      try
        StyleManager.TryLoadFromResource(HInstance, PChar(StyleResource), RT_RCDATA, Style);
        StyleManager.SetStyle(Style);
        Result := True;
      except
        on E: Exception do
          ShowMessage(E.Message);  // Handle du style est non valide
      end;
    end;
    Projet Form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure GetStyle(const StyleName: String);
    var
      StyleManager: TStyleManager;
    begin
      if StyleFromResource(StyleManager, StyleName) then
      else
        TStyleManager.TrySetStyle('Clear Day');
    end;
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 830
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 830
    Points : 13 574
    Points
    13 574
    Par défaut
    Parce que les ressources sont compilées dans l'exe et non dans la dll. Il faut donc utiliser MainInstance et non HInstance.

    Et s'assurer que la ressource existe avant de la charger ne serait pas inutile

  5. #5
    Membre averti
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 321
    Points : 303
    Points
    303
    Par défaut
    Bonjour Andnotor,

    Non, justement, les styles (*.vsf) son sont inclus dans ma DLL.
    Nom : Capture2.PNG
Affichages : 216
Taille : 44,5 Ko
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 830
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 830
    Points : 13 574
    Points
    13 574
    Par défaut
    On ne voit pas d'identificateur Clear Day dans cette liste.

  7. #7
    Membre averti
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 321
    Points : 303
    Points
    303
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    On ne voit pas d'identificateur Clear Day dans cette liste.
    C'est le style par défaut du projet. Il n'est pas inclus dans la dll.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TStyleManager.TrySetStyle('Clear Day');
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 704
    Points : 25 574
    Points
    25 574
    Par défaut
    Je ferais l'inverse

    Je ferais un simple LoadRessource depuis la DLL comme pour les resourcestring : Utilisation des DLL de ressources

    Donc tout côté EXE pour le code

    Je suis convaincu d'avoir déjà écrit ce genre de code LoadLibrary + LoadResource mais ça date de D6 ou D7, peut-être c'était via LoadPackage avec un BPL d'ailleurs.

    Mais un doute existe :
    Le Handle HMODULE de DLL d'un LoadLibrary est-il le même que celui de TryLoadFromResource de type HINSTANCE c'est censé être différent
    HINSTANCE étant la valeur de MEMORY_BASIC_INFORMATION.AllocationBase
    On trouve cette exemple de Microsoft qui montre que LoadLibrary retourne un type compatible avec HINSTANCE : Récupération des messages d’erreur
    D'ailleurs LoadResource utilise un HMODULE d'après la documentation Microsoft avec un paramètre nommé hModule
    Mais dans Delphi LoadResource c'est hModule: HINST et TResourceStream et TryLoadFromResource utilise un paramètre de HINSTANCE, rendant encore plus confus HINSTANCE vs HMODULE




    Totalement théorique !
    En Delphi 4, mon maitre d'apprentissage avait géré des DLL de ressources, je ne sais plus en détail mais toutes les images étaient dedans, l'application avait un style graphique avec un skin maison, cela semblait ultra facile, juste le chargement de la DLL, quelques API sur les ressources, et je n'ai pas souvenir que le reste du code s'occupait de savoir si les images en ressource était dans l'exe ou dans la DLL ... mais je n'ai aucun souvenir de l'astuce utilisé !

    Depuis, je n'ai jamais fait de DLL de Ressource, je ne fais que des DLL de fonctions ou d'Interface (faux COM), voire de TForm (la dfm est une ressource de la DLL)

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
     
    procedure GetStyle(const StyleName: String);
     
      function StyleFromResource(const StyleResource: String): Boolean;
      const
        DLLRes = 'Ressources.dll';
      var
        Style: TStyleManager.TStyleServicesHandle;
        HandleDLL: THandle;
      begin
        Result := False;
     
        try
          HandleDLL := LoadLibrary(DLLRes);  // pour une Dll statique, je me demande si HInstance ne fonctionnerait pas directement
          try
            TStyleManager.TryLoadFromResource(HandleDLL, PChar(StyleResource), RT_RCDATA, Style);
            TStyleManager.SetStyle(Style);
            Result := True;
          finally
            FreeLibrary(HandleDLL);
          end;
        except
          on E: Exception do
            ShowMessage(E.Message);  // Handle du style est non valide
        end;
      end;
     
    begin
      if not StyleFromResource(StyleName) then // if not c'est mieux que if then else 
        TStyleManager.TrySetStyle('Clear Day');
    end;
     
    begin
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
      Application.Title := 'MyForm';
     
      IniFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
     
      case IniFile.ReadInteger('APP', 'Style', 0) of
        0:
          TStyleManager.TrySetStyle('Clear Day');
        1:
          GetStyle('Style_Gainsboro');
        2:
          GetStyle('Style_Malibu');
        3:
          GetStyle('Style_Material');
        4:
          GetStyle('Style_Waikawa');
        5:
          GetStyle('Style_W10Clear');
        6:
          GetStyle('Style_Win10Malibu');
        7:
          GetStyle('Style_Win10Material');
        8:
          GetStyle('Style_Win10Office');
      else
        TStyleManager.TrySetStyle('Clear Day');
      end;
     
      FreeAndNil(IniFile);
     
      Application.CreateForm(TMyForm, MyForm);
      Application.Run;
    end.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre averti
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 321
    Points : 303
    Points
    303
    Par défaut
    J'ai tenté de faire le contraire en chargeant les styles inclus dans la dll depuis le Projet Form.
    Le problème persiste : Handle du style est non valide.

    L'erreur se déclenche avec SetStyle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TStyleManager.SetStyle(Style);
    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
    16
    17
    18
    19
    20
    21
    22
    23
    function StyleFromResource(const StyleResource: String): Boolean;
      const
        DLLRes = 'Ressources.dll';
      var
        Style: TStyleManager.TStyleServicesHandle;
        HandleDLL: THandle;
      begin
        Result := False;
     
        HandleDLL := LoadLibrary(DLLRes);
        try
          TStyleManager.TryLoadFromResource(HandleDLL, PChar(StyleResource), RT_RCDATA, Style);
          try
            TStyleManager.SetStyle(Style); // Handle du style est non valide
          except
            on E: Exception do
              ShowMessage(E.Message);
          end;
          Result := True;
        finally
          FreeLibrary(HandleDLL);
        end;
      end;
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 264
    Points : 41 665
    Points
    41 665
    Billets dans le blog
    64
    Par défaut
    Bonjour,

    depuis que je lis cette discussion je me pose la question de la pertinence de l'utilisation d'une DLL ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 704
    Points : 25 574
    Points
    25 574
    Par défaut
    Citation Envoyé par XeGregory Voir le message
    J'ai tenté de faire le contraire en chargeant les styles inclus dans la dll depuis le Projet Form.
    Le problème persiste : Handle du style est non valide.

    L'erreur se déclenche avec SetStyle :
    Euh, c'est plutôt TryLoadFromResource qui doit retourner False ! non ?
    Si tu utilisais LoadFromResource, c'est à mon avis là qu'il y aurait l'exception.

    Fait un FindResource et LoadResource pour étudier au moins si la ressource est trouvée

    D'ailleurs, tu es sûr pour RC_DATA ?
    As-tu tenté ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TStyleManager.TryLoadFromResource(HandleDLL, PChar(StyleResource), 'VCLSTYLE', Style);
    En étudiant le code de LoadFromResource, le resource type semble bien compliqué, je ne pense pas que TryLoadFromResource est conçue pour être appelé directement par un développeur.
    Pour moi, TryLoadFromResource est une méthode conçue pour DiscoverStyleResources.
    Tu dois plutôt utiliser LoadFromResource.


    Citation Envoyé par SergioMaster Voir le message
    depuis que je lis cette discussion je me pose la question de la pertinence de l'utilisation d'une DLL ?


    Le seul intérêt c'est si l'on plusieurs Exe, compilé en BPL, de fournir les styles qu'une seule fois, pour réduire la taille du Setup et la taille une fois déployée.

    Après, vouloir faire payer une option "skin", un peu vicieux mais j'ai travaillé sur une application où la présence/absence de DLL limitait tout simplement les fonctionnalités dans le cadre d'une gestion de licence.


    Sinon, comme tous les sujets dans "Débuter", souvent les débutants veulent faire des choses que les professionnels ne font jamais
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 502
    Points : 3 133
    Points
    3 133
    Par défaut
    D'accord avec Shaï ... J'ai aussi eu des problèmes de ce genre et j'ai mettre VCLSTYLE comme type de ressource dans le projet.

    D'ailleurs, en faisant ça, le TStyleManager trouve tout seul le style quand lui fournit le nom du style. Même pas besoin de charger la ressource.
    Mais pour le charger depuis une dll, je ne sais pas si change quelque chose
    J-L aka Papy pour les amis

  13. #13
    Membre averti
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 321
    Points : 303
    Points
    303
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    D'ailleurs, tu es sûr pour RC_DATA ?
    As-tu tenté ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TStyleManager.TryLoadFromResource(HandleDLL, PChar(StyleResource), 'VCLSTYLE', Style);
    Non, je n'ai pas testé. J'avais vu ça quelque part sur le web VCLSTYLE.
    Quelle est la différence ?
    Delphi ne propose pas le type VCLSTYLE dans l'ajout des ressources.


    Citation Envoyé par ShaiLeTroll Voir le message
    Sinon, comme tous les sujets dans "Débuter", souvent les débutants veulent faire des choses que les professionnels ne font jamais
    Non, j'ai eu l'idée de créer une dll de ressource car j'ai plein d'autres fichiers qui sont également liés à l'exécutable.
    Des bibliothèques icones & d'illustrations dans d'un format xml (DATAPACKET).
    Des polices de fonts.
    Dictionnaire, etc...

    Il y avait un grand nombre de fichiers accessibles autour de l'exécutable.

    Donc, je me suis dit, si j'intégré tout ça dans une dll, pourquoi pas intégré les styles aussi ! Cela permettrait aussi de diminuer la taille de l'exécutable.

    La dll est aussi avantageuse car elle ne demande pas de contrôler tous les fichiers autour de l'exécutable.
    Si la dll des ressources est absente, cela fonctionne pas !
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 704
    Points : 25 574
    Points
    25 574
    Par défaut
    Du coup, pourquoi une DLL, si un seul EXE et une seule DLL ?

    Autant faire un seul EXE autonome qui lui contient déjà toutes les ressources.

    Citation Envoyé par XeGregory Voir le message
    Non, je n'ai pas testé. J'avais vu ça quelque part sur le web VCLSTYLE.
    Quelle est la différence ?
    Delphi ne propose pas le type VCLSTYLE dans l'ajout des ressources.
    C'est surement le type de ressource quand c'est les Style intégré par le projet directement dans Application > Apparence

    Différent de l'intégration manuelle de fichier VSF par ressource et non par les options de PROJET

    Sinon, j'utilise uniquement un fichier RC, je ne connais même pas le gestionnaire de ressources de l'IDE, je ne vois pas ce qu'il apporte, c'est un pauvre fichier texte.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  15. #15
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 502
    Points : 3 133
    Points
    3 133
    Par défaut
    Delphi ne propose pas le type VCLSTYLE dans l'ajout des ressources.
    Delphi ne propose pas ça mais en fait tu peux mettre un peu ce que tu veux si j'en crois mon expérience.
    J'ai déjà mis JPEG comme type de ressource et ça n'a pas posé de problème (ne pas me demander pourquoi, je n'en sais rien )
    Peut-être qu'il prend RC_DATA par défaut quand il ne trouve pas de correspondance.

    Comme je le disais, l'avantage d'indiquer VCLSTYLE comme type de ressource, c'est qu'il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TStyleManager.SetStyle('NomDuStyle');
    et ça fonctionne tout seul. Le TStyleManager vérifie que la ressource nommée est dans les ressources du projet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TGesStyles.SetStyle(const Value: string);
    begin
      // Vérifier que le style est disponible
      if not MatchText(Value, TStyleManager.StyleNames) then
        raise Exception.CreateFmt('Le style %s n''est pas disponible', [Value]);
     
      // Enregistrer le nom du style dans les paramètres utilisateur
      SaveStyle(Value);
     
      // Appliquer le style
      TStyleManager.SetStyle(Value);
    end;
    J-L aka Papy pour les amis

  16. #16
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 681
    Points : 7 110
    Points
    7 110
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Peut-être qu'il prend RC_DATA par défaut quand il ne trouve pas de correspondance.
    De ce que je comprend, c'est tout comme :
    https://learn.microsoft.com/fr-fr/wi...ion-statements
    https://learn.microsoft.com/fr-fr/wi...fined-resource
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (16.3)

  17. #17
    Membre averti
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 321
    Points : 303
    Points
    303
    Par défaut
    C'est dommage qu'il n'y ait pas la possibilité de charger les Styles directement depuis un TStream.

    Un TStyleManager.LoadFromStream aurait été beaucoup plus simple de charger un style à partir d'une ressource externe.

    J'ai quand même exploré le fichier projet (.dproj) pour trouver quel type Delphi affectait les styles sélectionnés depuis le gestionnaire des styles.
    Nom : Capture4.PNG
Affichages : 64
Taille : 9,6 Ko

    Donc le type des styles sont bien du type 'VCLSTYLE' et non 'RT_RCDATA'.

    Après réflexion, je vais laisser les styles dans le projet. Après tout, pas grand intérêt de les ajouter à la dll, mis à part réduire la taille de l'exécutable.
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  18. #18
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 264
    Points : 41 665
    Points
    41 665
    Billets dans le blog
    64
    Par défaut
    Citation Envoyé par XeGregory Voir le message
    Donc le type des styles sont bien du type 'VCLSTYLE' et non 'RT_RCDATA'.
    Je pense que tu confonds ce qui est une déclaration dans le dproj et un type de ressource dans un fichier ressource.

    Je maitrise très mal les styles VCL (je leur prèfère le terme apparences) les styles FMX sont pour moi plus simples car c'est ce que j'utilise
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  19. #19
    Membre averti
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 321
    Points : 303
    Points
    303
    Par défaut
    D'après ce que j'ai trouvé, VCLSTYLE est un type de ressource. Il est donc possible d'ajouter manuellement ce type dans le gestionnaire des ressources Delphi.

    Nom : Capture6.PNG
Affichages : 60
Taille : 90,0 Ko
    Nom : MHj34.png
Affichages : 59
Taille : 31,4 Ko
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  20. #20
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 502
    Points : 3 133
    Points
    3 133
    Par défaut
    Chargement à partir d'un BPL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var
      BPL: string;
      H: THandle;
      Sh: TStyleManager.TStyleServicesHandle;
    begin
      BPL := TPath.Combine(ExtractFilePath(ParamStr(0)),  '..\..\..\BPL\Win32\Debug\Package1.bpl');
      H := LoadPackage(PChar(BPL));
      if H = 0 then
        raise Exception.Create('BPL non trouvé');
      Sh := TStyleManager.LoadFromResource(H, 'Resource_1', 'VCLSTYLE');
      TStyleManager.SetStyle(Sh);
      UnloadPackage(H);
    end;
    Dans le BPL, le fichier vsf est ajouté aux ressources du projet en tant que VCLSTYLE.

    Nom : 2024-08-15_114905.jpg
Affichages : 61
Taille : 34,9 Ko

    Résultat :

    Nom : 2024-08-15_115031.jpg
Affichages : 59
Taille : 15,4 Ko
    J-L aka Papy pour les amis

Discussions similaires

  1. Charger une forme à partir d'une dll ?
    Par Night_Wolf1619 dans le forum Débuter
    Réponses: 14
    Dernier message: 07/04/2013, 20h44
  2. Charger String Table à partir d'une DLL
    Par MarronSuisse dans le forum MFC
    Réponses: 3
    Dernier message: 26/09/2007, 07h20
  3. [DLL] utiliser une DLL a partir d' une DLL et un .def
    Par venomelektro dans le forum MFC
    Réponses: 9
    Dernier message: 07/12/2004, 15h01
  4. charger image à partir ressource directx 9
    Par ilimo dans le forum DirectX
    Réponses: 2
    Dernier message: 17/06/2004, 12h53
  5. pb de récup de handle à partir d'une dll
    Par yokito dans le forum Langage
    Réponses: 2
    Dernier message: 20/08/2002, 13h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo